aoi.db-fixer
Version:
Your solution for broken databases
87 lines (70 loc) • 3.47 kB
JavaScript
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 };