From 9d705e580c05d8b25df6f845d3aac747adaca116 Mon Sep 17 00:00:00 2001 From: PalmDevs Date: Mon, 14 Apr 2025 19:49:06 +0700 Subject: [PATCH] fix(bots/discord): remove expired presets from db if unapplying is not possible --- bots/discord/src/events/discord/ready.ts | 18 ++++++++++++------ 1 file changed, 12 insertions(+), 6 deletions(-) diff --git a/bots/discord/src/events/discord/ready.ts b/bots/discord/src/events/discord/ready.ts index f204c50..df573cc 100644 --- a/bots/discord/src/events/discord/ready.ts +++ b/bots/discord/src/events/discord/ready.ts @@ -5,7 +5,7 @@ import { on, withContext } from '$/utils/discord/events' import { removeRolePreset } from '$/utils/discord/rolePresets' import { and, eq, lt } from 'drizzle-orm' -import type { Client } from 'discord.js' +import { type Client, DiscordAPIError } from 'discord.js' export default withContext(on, 'ready', async ({ config, discord, logger }, client) => { logger.info(`Connected to Discord API, logged in as ${client.user.displayName} (@${client.user.tag})!`) @@ -82,7 +82,7 @@ const removeExpiredPresets = async (client: Client) => { where: lt(appliedPresets.until, Math.floor(Date.now() / 1000)), }) - for (const expired of expireds) + for (const expired of expireds) { try { logger.debug(`Removing role preset for ${expired.memberId} in ${expired.guildId}`) @@ -90,10 +90,16 @@ const removeExpiredPresets = async (client: Client) => { const member = await guild.members.fetch(expired.memberId) await removeRolePreset(member, expired.preset) - await database - .delete(appliedPresets) - .where(and(eq(appliedPresets.guildId, expired.guildId), eq(appliedPresets.memberId, expired.memberId))) } catch (e) { - logger.error(`Error while removing role preset for ${expired.memberId} in ${expired.guildId}: ${e}`) + // Unknown Member: https://discord.com/developers/docs/topics/opcodes-and-status-codes#json + if (!(e instanceof DiscordAPIError) || e.code !== 10007) { + logger.error(`Error while removing role preset for ${expired.memberId} in ${expired.guildId}: ${e}`) + continue + } } + + await database + .delete(appliedPresets) + .where(and(eq(appliedPresets.guildId, expired.guildId), eq(appliedPresets.memberId, expired.memberId))) + } }