diff --git a/src/index.ts b/src/index.ts index 588268c..25c0379 100644 --- a/src/index.ts +++ b/src/index.ts @@ -1,10 +1,11 @@ import { Client as DiscordClient, GatewayIntentBits, MessageFlags, Partials } from 'discord.js'; import { config } from './config'; import { handleAuditLogCreate, handleBanRemove, handleBulkMessageDelete, handleGuildCreate, handleMemberJoin, handleMessageCreate, handleMessageDelete, handleMessageUpdate, handleThreadCreate, handleVoiceStateUpdate } from './events'; +import { ScheduledTasks, Scheduler } from './scheduler'; import { Database } from './shared/Database'; import { openRedisClient } from './shared/RedisClient'; import { Handler } from './types'; -import { checkExpiredBans, closeOldTickets, initIfNecessary, loadHandlersFrom, refreshCommands } from './utils'; +import { initIfNecessary, loadHandlersFrom, refreshCommands } from './utils'; import { initializeWebserver } from './webserver'; let ready = false; @@ -28,6 +29,8 @@ const client = new DiscordClient({ } }); +const scheduler: Scheduler = new Scheduler(client); + const commands: Handler[] = []; const contextMenus: Handler[] = []; const buttons: Handler[] = []; @@ -135,16 +138,9 @@ client.on('clientReady', async () => { await initializeWebserver(client); - // Check for expired bans every 5 minutes - checkExpiredBans(client); - setInterval(checkExpiredBans.bind(null, client), 300000); - - // Close old tickets every hour - closeOldTickets(client); - setInterval(closeOldTickets.bind(null, client), 3.6e+6); + ScheduledTasks.forEach((task) => scheduler.add(task)); ready = true; - console.log('Ready'); }); @@ -162,4 +158,4 @@ client.on('voiceStateUpdate', handleVoiceStateUpdate); client.on('error', console.error); process.on('uncaughtException', console.error); -client.login(config.DISCORD_TOKEN); \ No newline at end of file +client.login(config.DISCORD_TOKEN); diff --git a/src/scheduler/index.ts b/src/scheduler/index.ts new file mode 100644 index 0000000..e4fa644 --- /dev/null +++ b/src/scheduler/index.ts @@ -0,0 +1,23 @@ +import { Client } from "discord.js"; +import { Task } from "../types"; +import ScheduledTasks from "./tasks"; + +class Scheduler { + private tasks = new Map(); + private context: Client; + + constructor(context: Client) { + this.context = context; + } + + add(task: Task) { + const interval = setInterval(() => task.handle(this.context), task.interval); + if (task.firstRun) interval._onTimeout(); + + this.tasks.set(task, interval); + } +} + +export { + ScheduledTasks, Scheduler +}; diff --git a/src/scheduler/tasks/check-expired-bans-task.ts b/src/scheduler/tasks/check-expired-bans-task.ts new file mode 100644 index 0000000..836d1c6 --- /dev/null +++ b/src/scheduler/tasks/check-expired-bans-task.ts @@ -0,0 +1,14 @@ +import { Client } from "discord.js"; +import { Task } from "../../types"; +import { checkExpiredBans } from "../../utils"; + +class CheckExpiredBansTask implements Task { + interval: number = 300000; + firstRun: boolean = true; + + async handle(context: Client): Promise { + await checkExpiredBans(context); + } +} + +export default new CheckExpiredBansTask(); diff --git a/src/scheduler/tasks/close-stale-tickets-task.ts b/src/scheduler/tasks/close-stale-tickets-task.ts new file mode 100644 index 0000000..a566588 --- /dev/null +++ b/src/scheduler/tasks/close-stale-tickets-task.ts @@ -0,0 +1,14 @@ +import { Client } from "discord.js"; +import { Task } from "../../types"; +import { closeOldTickets } from "../../utils"; + +class CloseStaleTicketsTask implements Task { + interval: number = 3.6e6; + firstRun: boolean = true; + + async handle(context: Client): Promise { + await closeOldTickets(context); + } +} + +export default new CloseStaleTicketsTask(); diff --git a/src/scheduler/tasks/index.ts b/src/scheduler/tasks/index.ts new file mode 100644 index 0000000..900da47 --- /dev/null +++ b/src/scheduler/tasks/index.ts @@ -0,0 +1,7 @@ +import checkExpiredBansTask from './check-expired-bans-task'; +import closeStaleTicketsTask from './close-stale-tickets-task'; + +export default [ + closeStaleTicketsTask, + checkExpiredBansTask, +]; diff --git a/src/types/index.d.ts b/src/types/index.d.ts index 3d0341d..68026d8 100644 --- a/src/types/index.d.ts +++ b/src/types/index.d.ts @@ -3,3 +3,4 @@ export * from './database-types.d'; export * from './e621-types.d'; export * from './handler.d'; export * from './helper-types.d'; +export * from './scheduler.d'; diff --git a/src/types/scheduler.d.ts b/src/types/scheduler.d.ts new file mode 100644 index 0000000..e7223d4 --- /dev/null +++ b/src/types/scheduler.d.ts @@ -0,0 +1,8 @@ +import { Client } from "discord.js"; + +export interface Task { + interval: number; + firstRun: boolean; + + handle(context: Client): Promise; +};