From 56f528c0c32e9639a85301e8f86b8e0c756e7168 Mon Sep 17 00:00:00 2001 From: Nix Krystik Date: Mon, 28 Sep 2026 21:51:38 +0800 Subject: [PATCH] [Tasks] Migrated scheduler to embedded tasks. (#13) --- src/index.ts | 14 +++++++---- src/scheduler/index.ts | 23 ------------------- .../tasks/check-expired-bans-task.ts | 14 ----------- .../tasks/close-stale-tickets-task.ts | 14 ----------- src/scheduler/tasks/index.ts | 9 -------- .../tasks/prune-old-messages-task.ts | 13 ----------- src/tasks/checkExpiredBansTask.ts | 15 ++++++++++++ src/tasks/closeStaleTicketsTask.ts | 15 ++++++++++++ src/tasks/index.ts | 9 ++++++++ src/tasks/pruneOldMessagesTask.ts | 15 ++++++++++++ src/types/index.d.ts | 2 +- src/types/{scheduler.d.ts => task.d.ts} | 3 ++- 12 files changed, 67 insertions(+), 79 deletions(-) delete mode 100644 src/scheduler/index.ts delete mode 100644 src/scheduler/tasks/check-expired-bans-task.ts delete mode 100644 src/scheduler/tasks/close-stale-tickets-task.ts delete mode 100644 src/scheduler/tasks/index.ts delete mode 100644 src/scheduler/tasks/prune-old-messages-task.ts create mode 100644 src/tasks/checkExpiredBansTask.ts create mode 100644 src/tasks/closeStaleTicketsTask.ts create mode 100644 src/tasks/index.ts create mode 100644 src/tasks/pruneOldMessagesTask.ts rename src/types/{scheduler.d.ts => task.d.ts} (90%) diff --git a/src/index.ts b/src/index.ts index 3fe90fa..ed3f668 100644 --- a/src/index.ts +++ b/src/index.ts @@ -1,13 +1,13 @@ import { Client as DiscordClient, GatewayIntentBits, MessageFlags, Partials } from 'discord.js'; import { config } from './config'; import events from './events'; -import { ScheduledTasks, Scheduler } from './scheduler'; import { Database } from './shared/Database'; import { openRedisClient } from './shared/RedisClient'; import { Handler } from './types'; import { initIfNecessary, loadHandlersFrom, refreshCommands } from './utils'; import { initializeWebserver } from './webserver'; import { Encrypter } from './shared/Encrypter'; +import tasks from './tasks'; let ready = false; @@ -31,8 +31,6 @@ const client = new DiscordClient({ } }); -const scheduler: Scheduler = new Scheduler(client); - const commands: Handler[] = []; const contextMenus: Handler[] = []; const buttons: Handler[] = []; @@ -141,7 +139,15 @@ client.on('clientReady', async () => { await initializeWebserver(client); - ScheduledTasks.forEach(task => scheduler.add(task)); + tasks.forEach((task) => { + const handler = () => { + Promise.resolve(task.handle(client)) + .catch(e => console.error(`Error in '${task.id}' task:`, e)); + }; + + if (task.firstRun) handler(); + setInterval(handler, task.interval); + }); events.forEach(event => client.on(event.event, (...args) => diff --git a/src/scheduler/index.ts b/src/scheduler/index.ts deleted file mode 100644 index 22059df..0000000 --- a/src/scheduler/index.ts +++ /dev/null @@ -1,23 +0,0 @@ -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 deleted file mode 100644 index a6f8d0b..0000000 --- a/src/scheduler/tasks/check-expired-bans-task.ts +++ /dev/null @@ -1,14 +0,0 @@ -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 deleted file mode 100644 index a20022f..0000000 --- a/src/scheduler/tasks/close-stale-tickets-task.ts +++ /dev/null @@ -1,14 +0,0 @@ -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 deleted file mode 100644 index 8ce79a0..0000000 --- a/src/scheduler/tasks/index.ts +++ /dev/null @@ -1,9 +0,0 @@ -import checkExpiredBansTask from './check-expired-bans-task'; -import closeStaleTicketsTask from './close-stale-tickets-task'; -import pruneOldMessagesTask from './prune-old-messages-task'; - -export default [ - closeStaleTicketsTask, - checkExpiredBansTask, - pruneOldMessagesTask -]; diff --git a/src/scheduler/tasks/prune-old-messages-task.ts b/src/scheduler/tasks/prune-old-messages-task.ts deleted file mode 100644 index 822a52e..0000000 --- a/src/scheduler/tasks/prune-old-messages-task.ts +++ /dev/null @@ -1,13 +0,0 @@ -import { Task } from '../../types'; -import { Database } from '../../shared/Database'; - -class PruneOldMessagesTask implements Task { - interval: number = 3.6e6; - firstRun: boolean = true; - - async handle(): Promise { - await Database.pruneOldMessages(); - } -} - -export default new PruneOldMessagesTask(); diff --git a/src/tasks/checkExpiredBansTask.ts b/src/tasks/checkExpiredBansTask.ts new file mode 100644 index 0000000..7c4dced --- /dev/null +++ b/src/tasks/checkExpiredBansTask.ts @@ -0,0 +1,15 @@ +import { Client } from 'discord.js'; +import { Task } from '../types'; +import { checkExpiredBans } from '../utils'; + +const task: Task = { + id: 'checkExpiredBans', + interval: 300000, + firstRun: true, + + handle: async (context: Client) => { + await checkExpiredBans(context); + }, +}; + +export default task; diff --git a/src/tasks/closeStaleTicketsTask.ts b/src/tasks/closeStaleTicketsTask.ts new file mode 100644 index 0000000..83f9d0c --- /dev/null +++ b/src/tasks/closeStaleTicketsTask.ts @@ -0,0 +1,15 @@ +import { Client } from 'discord.js'; +import { Task } from '../types'; +import { closeOldTickets } from '../utils'; + +const task: Task = { + id: 'closeStaleTickets', + interval: 3.6e6, + firstRun: true, + + handle: async (context: Client) => { + await closeOldTickets(context); + }, +}; + +export default task; diff --git a/src/tasks/index.ts b/src/tasks/index.ts new file mode 100644 index 0000000..a369618 --- /dev/null +++ b/src/tasks/index.ts @@ -0,0 +1,9 @@ +import checkExpiredBansTask from './checkExpiredBansTask'; +import closeStaleTicketsTask from './closeStaleTicketsTask'; +import pruneOldMessagesTask from './pruneOldMessagesTask'; + +export default [ + closeStaleTicketsTask, + checkExpiredBansTask, + pruneOldMessagesTask +]; diff --git a/src/tasks/pruneOldMessagesTask.ts b/src/tasks/pruneOldMessagesTask.ts new file mode 100644 index 0000000..4d37f5b --- /dev/null +++ b/src/tasks/pruneOldMessagesTask.ts @@ -0,0 +1,15 @@ +import { Client } from 'discord.js'; +import { Database } from '../shared/Database'; +import { Task } from '../types'; + +const task: Task = { + id: 'pruneOldMessages', + interval: 3.6e6, + firstRun: true, + + handle: async (context: Client) => { + await Database.pruneOldMessages(); + }, +}; + +export default task; diff --git a/src/types/index.d.ts b/src/types/index.d.ts index 68026d8..d867c83 100644 --- a/src/types/index.d.ts +++ b/src/types/index.d.ts @@ -3,4 +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'; +export * from './task.d'; diff --git a/src/types/scheduler.d.ts b/src/types/task.d.ts similarity index 90% rename from src/types/scheduler.d.ts rename to src/types/task.d.ts index 3a05cc0..5e29e70 100644 --- a/src/types/scheduler.d.ts +++ b/src/types/task.d.ts @@ -1,8 +1,9 @@ import { Client } from 'discord.js'; export interface Task { + id: string; interval: number; firstRun: boolean; handle(context: Client): Promise; -}; +}