@@ -3,7 +3,8 @@ import { debugFormatChannel } from "#common/discord/debugFormat.ts";
33import { isTextableChannel , isThreadChannelType } from "#common/discord/general.ts" ;
44import { canWriteInChannel } from "#common/discord/permissions.ts" ;
55import { moduleLogger } from "#common/logger/index.ts" ;
6- import { dateToHMSString , dateToUnixSecs } from "#common/time.ts" ;
6+ import { startPollingScheduler , type PollingSchedulerHandle } from "#common/pollingScheduler.ts" ;
7+ import { dateToHMSString , dateToUnixSecs , SECOND } from "#common/time.ts" ;
78import { onBotInit } from "#discord/extensionPoints.ts" ;
89import { bot } from "#discord/index.ts" ;
910import { icons } from "#plugin/core/public/icons.ts" ;
@@ -13,45 +14,25 @@ import { DiscordRESTError, MessageFlags, Permissions, type AnyTextableChannel }
1314
1415const logger = moduleLogger ( ) ;
1516
16- const TIMEOUT_POLL_RATE = 60 * 1000 ;
17-
18- let nextExpiryStartTime = new Date ( 0 ) ;
17+ let scheduler : PollingSchedulerHandle < Reminder > | null = null ;
1918
2019export default [ onBotInit ( beginPollingReminders ) ] ;
2120
2221async function beginPollingReminders ( ) : Promise < void > {
23- await poll ( ) ;
24- setInterval ( poll , TIMEOUT_POLL_RATE ) . unref ( ) ;
25- }
26-
27- export function trackNewReminder ( reminder : Reminder ) : void {
28- if ( reminder . firesAt . getTime ( ) >= nextExpiryStartTime . getTime ( ) )
29- return ;
30-
31- setTimeout ( ( ) => fire ( reminder ) , Math . max ( 0 , reminder . firesAt . getTime ( ) - Date . now ( ) ) ) . unref ( ) ;
32- }
33-
34- async function poll ( ) : Promise < void > {
35- const end = new Date ( Date . now ( ) + TIMEOUT_POLL_RATE ) ;
36-
37- logger . debug ?.(
38- nextExpiryStartTime . getTime ( ) === 0
39- ? "Setting initial timeouts for missed and upcoming reminders until " + dateToHMSString ( end )
40- : "Setting timeouts for reminders from " + dateToHMSString ( nextExpiryStartTime ) + " to " + dateToHMSString ( end )
41- ) ;
22+ scheduler = await startPollingScheduler ( {
23+ discriminator : "reminders" ,
24+ pollRate : 60 * SECOND ,
4225
43- const reminders = await getRemindersByFiresAt ( nextExpiryStartTime , end ) ;
44- nextExpiryStartTime = end ;
26+ poll : ( start , end ) => getRemindersByFiresAt ( start , end ) ,
27+ run : fire ,
4528
46- for ( const reminder of reminders )
47- setFireTimeout ( reminder ) ;
29+ getTimestamp : task => task . firesAt ,
30+ debugFormat : debugFormatReminder
31+ } ) ;
4832}
4933
50- function setFireTimeout ( reminder : Reminder ) : void {
51- const delay = Math . max ( 0 , reminder . firesAt . getTime ( ) - Date . now ( ) ) ;
52- setTimeout ( ( ) => fire ( reminder ) , delay ) ;
53-
54- logger . debug ?.( `Setting up timeout for reminder ${ debugFormatReminder ( reminder ) } with delay ${ delay } ` ) ;
34+ export function trackNewReminder ( reminder : Reminder ) : void {
35+ scheduler ?. track ( reminder ) ;
5536}
5637
5738async function fire ( reminder : Reminder ) : Promise < void > {
0 commit comments