From 4d2ec48a186676bd79d50d90c4b01da3f1257fcf Mon Sep 17 00:00:00 2001 From: Alexander Wood Date: Wed, 11 Sep 2024 15:02:41 -0400 Subject: [PATCH] fix the daily reminder bug i think? --- src/modules/xp/dailyReward.reminder.ts | 134 ++++++++++++++----------- 1 file changed, 73 insertions(+), 61 deletions(-) diff --git a/src/modules/xp/dailyReward.reminder.ts b/src/modules/xp/dailyReward.reminder.ts index fc1591f..fa23f75 100644 --- a/src/modules/xp/dailyReward.reminder.ts +++ b/src/modules/xp/dailyReward.reminder.ts @@ -1,79 +1,91 @@ -import { Client, GuildMember, TextChannel } from 'discord.js' -import { logger } from '../../logging.js' -import { DDUser, getOrCreateUserById } from '../../store/models/DDUser.js' -import { config } from '../../Config.js' -import { isSpecialUser, mention } from '../../util/users.js' -import { Job, scheduleJob } from 'node-schedule' -import { getActualDailyStreak, getNextDailyTime } from './dailyReward.command.js' +import {Client, GuildMember, TextChannel} from 'discord.js' +import {logger} from '../../logging.js' +import {DDUser, getOrCreateUserById} from '../../store/models/DDUser.js' +import {config} from '../../Config.js' +import {isSpecialUser, mention} from '../../util/users.js' +import {Job, scheduleJob} from 'node-schedule' +import {getActualDailyStreak, getNextDailyTime} from './dailyReward.command.js' const sendReminder = async (client: Client, user: GuildMember) => { - const botCommands = await client.channels.fetch(config.channels.botCommands) - if (!(botCommands instanceof TextChannel)) { - logger.error('Bot commands channel not found') - return - } - await botCommands.send({ - content: `${ - mention( - user - ) - }, your daily reward is ready to be claimed! ` - }) + const botCommands = await client.channels.fetch(config.channels.botCommands) + if (!(botCommands instanceof TextChannel)) { + logger.error('Bot commands channel not found') + return + } + // if it's been more than _48_ hours (i.e. we've sent at least 1 reminder and they've ignored it, we stop reminding them) + const ddUser = await getOrCreateUserById(BigInt(user.id)) + const lastClaimTime = ddUser.lastDailyTime + if (!lastClaimTime) { + logger.error('lastClaimTime is null') + return + } + if (new Date().getTime() - lastClaimTime.getTime() > 1000 * 60 * 60 * 48) { + logger.info(`User ${user.user.tag} has not claimed their daily in over 48 hours, not reminding them and cancelling future reminders`) + scheduledReminders.get(ddUser.id)?.cancel() + return + } + await botCommands.send({ + content: `${ + mention( + user + ) + }, your daily reward is ready to be claimed! ` + }) } // Schedules a daily reminder, assuming they have permission to get reminders // If they already have a reminder set, this will replace it to keep the time up to date export const scheduleReminder = async ( - client: Client, - user: GuildMember, - ddUser: DDUser + client: Client, + user: GuildMember, + ddUser: DDUser ) => { - if (scheduledReminders.has(ddUser.id)) { - logger.info(`Reminder already scheduled for ${user.user.tag}, replacing...`) - scheduledReminders.get(ddUser.id)?.cancel() - scheduledReminders.delete(ddUser.id) - } - const time = ddUser.lastDailyTime - if (time === undefined) { - logger.info(`User ${user.user.tag} hasn't claimed their first daily yet`) - return // don't wanna harass people who haven't claimed their first daily yet - } + if (scheduledReminders.has(ddUser.id)) { + logger.info(`Reminder already scheduled for ${user.user.tag}, replacing...`) + scheduledReminders.get(ddUser.id)?.cancel() + scheduledReminders.delete(ddUser.id) + } + const time = ddUser.lastDailyTime + if (time === undefined) { + logger.info(`User ${user.user.tag} hasn't claimed their first daily yet`) + return // don't wanna harass people who haven't claimed their first daily yet + } - const actual = await getActualDailyStreak(ddUser) - if (actual <= 0) { - logger.info(`User ${user.user.tag} has no streak, not scheduling reminder`) - return - } + const actual = await getActualDailyStreak(ddUser) + if (actual <= 0) { + logger.info(`User ${user.user.tag} has no streak, not scheduling reminder`) + return + } - // if they can claim their daily now, remind immediately - const nextTime = getNextDailyTime(ddUser) - if (nextTime && nextTime <= new Date()) { - await sendReminder(client, user) - return - } + // if they can claim their daily now, remind immediately + const nextTime = getNextDailyTime(ddUser) + if (nextTime && nextTime <= new Date()) { + await sendReminder(client, user) + return + } - const job = scheduleJob({ - hour: time.getHours(), - minute: time.getMinutes(), - second: time.getSeconds() - }, async () => { - await sendReminder(client, user) - }) - scheduledReminders.set(ddUser.id, job) - logger.info( - `Scheduled reminder for ${user.user.tag} at ${job.nextInvocation().toLocaleString()}` - ) + const job = scheduleJob({ + hour: time.getHours(), + minute: time.getMinutes(), + second: time.getSeconds() + }, async () => { + await sendReminder(client, user) + }) + scheduledReminders.set(ddUser.id, job) + logger.info( + `Scheduled reminder for ${user.user.tag} at ${job.nextInvocation().toLocaleString()}` + ) } export const scheduleAllReminders = async (client: Client) => { - const guild = await client.guilds.fetch(config.guildId) - const list = await guild.members.fetch() - logger.debug(`Scheduling reminders for ${list.size} members`) + const guild = await client.guilds.fetch(config.guildId) + const list = await guild.members.fetch() + logger.debug(`Scheduling reminders for ${list.size} members`) - for (const member of Array.from(list.values()).filter(isSpecialUser)) { - const ddUser = await getOrCreateUserById(BigInt(member.id)) - await scheduleReminder(client, member, ddUser) - } + for (const member of Array.from(list.values()).filter(isSpecialUser)) { + const ddUser = await getOrCreateUserById(BigInt(member.id)) + await scheduleReminder(client, member, ddUser) + } } const scheduledReminders = new Map()