UNPKG

aoi.db-fixer

Version:

Your solution for broken databases

87 lines (70 loc) 3.47 kB
const { AoiClient } = require('aoi.js'); const fs = require("fs/promises"); const path = require("path"); const c = require('colors/safe'); class DatabaseBackup { constructor(client, options = {}) { this.client = client; this.pathTo = options.pathTo || path.join(__dirname, "../../../database"); this.table = "main" || options.table this.validateDatabase(); } async validateDatabase() { console.log("[aoi.db fixer]: " + c.green("Starting database validation...")); try { await fs.access(this.pathTo); } catch { console.error("[aoi.db fixer]: " + c.red(`The '${this.pathTo}' folder does not exist.`)); return; } const directories = await fs.readdir(this.pathTo); let index = 1; let total = 0; for (const dir of directories) { const dirPath = path.join(this.pathTo, dir); const dirStat = await fs.stat(dirPath); if (dirStat.isDirectory()) { const files = await fs.readdir(dirPath); for (const file of files) { const filePath = path.join(dirPath, file); const fileStat = await fs.stat(filePath); if (!fileStat.isFile()) continue; const databaseData = await fs.readFile(filePath, "utf-8"); const data = JSON.parse(databaseData); total += Object.keys(data).length; } } } console.log(`[aoi.db fixer]: Checking ${c.yellow(total)} keys in the database.`); for (const dir of directories) { const dirPath = path.join(this.pathTo, dir); const dirStat = await fs.stat(dirPath); if (dirStat.isDirectory()) { const files = await fs.readdir(dirPath); for (const file of files) { const filePath = path.join(dirPath, file); const fileStat = await fs.stat(filePath); if (!fileStat.isFile()) continue; const databaseData = await fs.readFile(filePath, "utf-8"); const data = JSON.parse(databaseData); for (const [key, value] of Object.entries(data)) { console.log(`[${index}/${total}]: Checking ${c.yellow(key)}...`); const id = key.split('_').pop(); const name = key.split("_").slice(0, -1).join("_"); let dbValue = (await this.client.db.get(this.table, name.addBrackets(), id))?.value; let newValue = value.value; if (!dbValue || dbValue !== newValue) { await this.client.db.set(this.table, name.addBrackets(), id, newValue); console.log(`[${index}/${total}]: Restored ${c.yellow(key)} to '${c.cyan(newValue).slice(0, 15)}'`); } else { console.log(`[${index}/${total}]: ${c.yellow(key)} is already up to date.`); } index++; } } } } console.log("[aoi.db fixer]: " + c.green("Database validation completed!")); } } module.exports = { DatabaseBackup };