import cron from "node-cron"; import { Client } from "discord.js"; import { cfg } from "./config"; import { TGSlot } from "../types"; type PollCallback = (slot: TGSlot) => Promise; type CloseCallback = (slot: TGSlot) => Promise; let _scheduledTasks: cron.ScheduledTask[] = []; export function scheduleSlots( client: Client, onPollOpen: PollCallback, onPollClose: CloseCallback ): void { // Clear existing schedules _scheduledTasks.forEach((t) => t.stop()); _scheduledTasks = []; const tz = process.env.TZ ?? "Etc/GMT-2"; const slots = cfg("slots").filter((s) => s.active); for (const slot of slots) { // Parse poll open time const [openHour, openMin] = slot.pollOpens.split(":").map(Number); // Schedule poll open const openTask = cron.schedule( `${openMin} ${openHour} * * *`, () => onPollOpen(slot), { timezone: tz } ); _scheduledTasks.push(openTask); // Schedule poll close (tgHour + closesAfter minutes) const closeMinTotal = slot.tgHour * 60 + slot.closesAfter; const closeHour = Math.floor(closeMinTotal / 60) % 24; const closeMin = closeMinTotal % 60; const closeTask = cron.schedule( `${closeMin} ${closeHour} * * *`, () => onPollClose(slot), { timezone: tz } ); _scheduledTasks.push(closeTask); } // Weekly reset — Monday 00:00 const resetTask = cron.schedule("0 0 * * 1", () => { const { resetWeek } = require("./wrank"); resetWeek(); console.log("W.Rank weekly reset complete."); }, { timezone: tz }); _scheduledTasks.push(resetTask); console.log(`Scheduled ${slots.length} slot(s).`); }