diff --git a/src/events/client/ready.ts b/src/events/client/ready.ts index 6699b98..252ea43 100644 --- a/src/events/client/ready.ts +++ b/src/events/client/ready.ts @@ -1,10 +1,16 @@ import { Event, CommandClient } from 'athena-prime'; +import tasks from '../../tasks'; class ReadyEvent extends Event { event: string = 'ready' as const; async handle(context: CommandClient) { await context.deployCommands(); + + tasks.forEach(async task => { + if (task.init) await task.handler(context); + setInterval(async () => await task.handler(context), task.interval); + }); } } diff --git a/src/index.ts b/src/index.ts index 739b732..09c768d 100644 --- a/src/index.ts +++ b/src/index.ts @@ -1,5 +1,6 @@ import { CommandClient, Constants } from "athena-prime"; import events from "./events"; +import tasks from "./tasks"; // ---------- diff --git a/src/tasks/deleteExpiredConfigs.ts b/src/tasks/deleteExpiredConfigs.ts new file mode 100644 index 0000000..61783e9 --- /dev/null +++ b/src/tasks/deleteExpiredConfigs.ts @@ -0,0 +1,21 @@ +import { CommandClient } from "athena-prime"; +import { Task } from "../types/tasks"; +import { database } from '../utils'; + +class DeleteExpiredConfigsTask implements Task { + interval: number = 360; + init: boolean = true; + + async handler(context: CommandClient): Promise { + const configs = await database.getConfigurations(); + + for (const config of configs) { + const guild = context.guilds.get(config.id); + if (guild) continue; + + await database.deleteConfiguration(config.id); + } + } +} + +export default new DeleteExpiredConfigsTask(); diff --git a/src/tasks/index.ts b/src/tasks/index.ts new file mode 100644 index 0000000..1330325 --- /dev/null +++ b/src/tasks/index.ts @@ -0,0 +1,5 @@ +import deleteExpiredConfigs from "./deleteExpiredConfigs"; + +export default [ + deleteExpiredConfigs +]; diff --git a/src/types/tasks.d.ts b/src/types/tasks.d.ts new file mode 100644 index 0000000..9a3215e --- /dev/null +++ b/src/types/tasks.d.ts @@ -0,0 +1,23 @@ +import { CommandClient } from "athena-prime"; + +// ---------- + +/** + * A scheduled task. + */ +export type Task = { + /** + * The interval before running the task. + */ + interval: number; + + /** + * Runs the task when it's loaded. + */ + init: boolean; + + /** + * The task handler. + */ + handler: (context: CommandClient) => Promise; +} diff --git a/src/utils/database.ts b/src/utils/database.ts index cc63232..bed508b 100644 --- a/src/utils/database.ts +++ b/src/utils/database.ts @@ -62,6 +62,17 @@ export async function getConfiguration(guildId: string): Promise return (row?.config ?? {}) as Configuration; } +export async function getConfigurations(): Promise<{ id: string; config: Configuration }[]> { + const rows = await client` + SELECT guild_id, config FROM settings; + `; + + return rows.map((row) => ({ + id: row.guild_id, + config: row.config as Configuration, + })); +} + export async function createConfiguration(guildId: string): Promise { await client` INSERT INTO settings (guild_id, config)