From b9faf8d0a6d7b9b4b771e35976b0a8b9fee08c96 Mon Sep 17 00:00:00 2001 From: Nix Krystik Date: Sun, 24 May 2026 03:49:28 +0800 Subject: [PATCH] new scheduler? in 2026? nahhh --- src/index.ts | 14 ++++------- src/scheduler/index.ts | 24 +++++++++++++++++++ .../tasks/check-expired-bans-task.ts | 12 ++++++++++ .../tasks/close-stale-tickets-task.ts | 12 ++++++++++ src/scheduler/tasks/index.ts | 7 ++++++ src/types/index.d.ts | 1 + src/types/scheduler.d.ts | 8 +++++++ 7 files changed, 69 insertions(+), 9 deletions(-) create mode 100644 src/scheduler/index.ts create mode 100644 src/scheduler/tasks/check-expired-bans-task.ts create mode 100644 src/scheduler/tasks/close-stale-tickets-task.ts create mode 100644 src/scheduler/tasks/index.ts create mode 100644 src/types/scheduler.d.ts diff --git a/src/index.ts b/src/index.ts index ccc5196..e0cf996 100644 --- a/src/index.ts +++ b/src/index.ts @@ -4,8 +4,9 @@ import { handleAuditLogCreate, handleBanRemove, handleBulkMessageDelete, handleG 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'; +import { Scheduler, ScheduledTasks } from './scheduler'; 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'); }); diff --git a/src/scheduler/index.ts b/src/scheduler/index.ts new file mode 100644 index 0000000..c852193 --- /dev/null +++ b/src/scheduler/index.ts @@ -0,0 +1,24 @@ +import { Client } from "discord.js"; +import ScheduledTasks from "./tasks"; +import { Task } from "../types"; + +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 { + Scheduler, + ScheduledTasks +} \ No newline at end of file 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..8882b08 --- /dev/null +++ b/src/scheduler/tasks/check-expired-bans-task.ts @@ -0,0 +1,12 @@ +import { Client } from "discord.js"; +import { Task } from "../../types"; +import { checkExpiredBans } from "../../utils"; + +const checkExpiredBansTask: Task = { + interval: 300000, + firstRun: true, + + handle: async (context: Client) => await checkExpiredBans(context) +}; + +export default checkExpiredBansTask; \ No newline at end of file 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..25e4997 --- /dev/null +++ b/src/scheduler/tasks/close-stale-tickets-task.ts @@ -0,0 +1,12 @@ +import { Client } from "discord.js"; +import { Task } from "../../types"; +import { closeOldTickets } from "../../utils"; + +const closeStaleTicketsTask: Task = { + interval: 3.6e+6, + firstRun: true, + + handle: async (context: Client) => await closeOldTickets(context) +}; + +export default closeStaleTicketsTask; \ No newline at end of file diff --git a/src/scheduler/tasks/index.ts b/src/scheduler/tasks/index.ts new file mode 100644 index 0000000..77839ca --- /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, +]; \ No newline at end of file diff --git a/src/types/index.d.ts b/src/types/index.d.ts index 45567b0..bd9ddc2 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'; \ No newline at end of file diff --git a/src/types/scheduler.d.ts b/src/types/scheduler.d.ts new file mode 100644 index 0000000..2e71161 --- /dev/null +++ b/src/types/scheduler.d.ts @@ -0,0 +1,8 @@ +import { Client } from "discord.js"; + +export type Task = { + interval: number; + firstRun: boolean; + + handle: (context: Client) => Promise; +}; \ No newline at end of file