import { databaseOptions } from "$/types/config"; import { DatabaseHandler } from "../Database"; import fs from "fs"; export class JSONDatabase extends DatabaseHandler { private data: any = {}; private conf: databaseOptions; constructor(conf: databaseOptions) { super(); this.conf = conf; if (!fs.existsSync(conf.uri)) { console.error(`Can't find database file, creating default`); try { fs.writeFileSync(conf.uri, `{}`); } catch (_) { console.log(`Couldn't create database file, ensure the uri is a valid filepath`); }; }; this.data = JSON.parse(fs.readFileSync(conf.uri, `utf-8`)); }; public shutdown() { fs.writeFileSync(this.conf.uri, JSON.stringify(this.data)); }; public async channelExists(channel: string) { return this.data[channel] != null; }; public async counterExists(channel: string, counter: string) { return await this.channelExists(channel) && this.data[channel].counters[counter] != null; }; public async isUserIgnored(channel: string, user: string) { return this.data[channel].ignored_users.includes(user); }; public async getMessage(channel: string, counter: string) { return this.data[channel].counters[counter].message; }; public async addChannel(channel: string) { if (await this.channelExists(channel)) { throw new Error("Channel already exists"); }; this.data[channel] = { ignored_users: [], counters: {} }; }; public async addCounter(channel: string, counter: string) { if (await this.counterExists(channel, counter)) { throw new Error(`Counter already exists`); }; this.data[channel].counters[counter] = { value: 0, message: `$(value)`, }; }; public async changeCount(channel: string, counter: string, delta: number) { if (!await this.channelExists(channel)) { throw new Error("Channel not found"); }; if (!await this.counterExists(channel, counter)) { throw new Error("Counter doesn't exist on that channel"); }; return this.data[channel].counters[counter].value += delta; }; };