From faa81f4d887eaeae809651f5b68187d033a260f2 Mon Sep 17 00:00:00 2001 From: PalmDevs Date: Mon, 24 Jun 2024 01:09:54 +0700 Subject: [PATCH] fix(bots/discord): clear role presets after they expire --- bots/discord/src/events/discord/ready.ts | 31 +++++++++++++++++++++++- 1 file changed, 30 insertions(+), 1 deletion(-) diff --git a/bots/discord/src/events/discord/ready.ts b/bots/discord/src/events/discord/ready.ts index 72f4bf1..e5f9a73 100644 --- a/bots/discord/src/events/discord/ready.ts +++ b/bots/discord/src/events/discord/ready.ts @@ -1,8 +1,37 @@ +import { database, logger } from '$/context' +import { appliedPresets } from '$/database/schemas' +import { removeRolePreset } from '$/utils/discord/rolePresets' +import type { Client } from 'discord.js' +import { lt } from 'drizzle-orm' import { on } from 'src/utils/discord/events' -export default on('ready', ({ logger }, client) => { +export default on('ready', ({ config, logger }, client) => { logger.info(`Connected to Discord API, logged in as ${client.user.displayName} (@${client.user.tag})!`) logger.info( `Bot is in ${client.guilds.cache.size} guilds, if this is not expected, please run the /leave-unknowns command`, ) + + if (config.rolePresets) { + removeExpiredPresets(client) + setTimeout(() => removeExpiredPresets(client), config.rolePresets.checkExpiredEvery) + } }) + +const removeExpiredPresets = async (client: Client) => { + logger.debug('Checking for expired role presets...') + + const expireds = await database.query.appliedPresets.findMany({ + where: lt(appliedPresets.until, Math.floor(Date.now() / 1000)), + }) + + for (const expired of expireds) + try { + const guild = await client.guilds.fetch(expired.guildId) + const member = await guild.members.fetch(expired.memberId) + + logger.debug(`Removing role preset for ${expired.memberId} in ${expired.guildId}`) + await removeRolePreset(member, expired.preset) + } catch (e) { + logger.error(`Error while removing role preset for ${expired.memberId} in ${expired.guildId}: ${e}`) + } +}