From f50b26b82d66c88fd1dbb8c07d77c177c0e781df Mon Sep 17 00:00:00 2001 From: PalmDevs Date: Mon, 24 Jun 2024 22:54:17 +0700 Subject: [PATCH] fix(bots/discord): apply active role presets if members rejoin --- .../discord/guildMemberAdd/apply-role-presets.ts | 16 ++++++++++++++++ bots/discord/src/utils/discord/rolePresets.ts | 10 +++------- 2 files changed, 19 insertions(+), 7 deletions(-) create mode 100644 bots/discord/src/events/discord/guildMemberAdd/apply-role-presets.ts diff --git a/bots/discord/src/events/discord/guildMemberAdd/apply-role-presets.ts b/bots/discord/src/events/discord/guildMemberAdd/apply-role-presets.ts new file mode 100644 index 0000000..034d094 --- /dev/null +++ b/bots/discord/src/events/discord/guildMemberAdd/apply-role-presets.ts @@ -0,0 +1,16 @@ +import { appliedPresets } from '$/database/schemas' +import { on } from '$/utils/discord/events' +import { applyRolesUsingPreset } from '$/utils/discord/rolePresets' +import { and, eq, gt } from 'drizzle-orm' + +on('guildMemberAdd', async ({ database }, member) => { + const applieds = await database.query.appliedPresets.findMany({ + where: and( + eq(appliedPresets.memberId, member.id), + eq(appliedPresets.guildId, member.guild.id), + gt(appliedPresets.until, Date.now() / 1000), + ), + }) + + for (const { preset } of applieds) await applyRolesUsingPreset(preset, member, true) +}) diff --git a/bots/discord/src/utils/discord/rolePresets.ts b/bots/discord/src/utils/discord/rolePresets.ts index 34c99a4..925d436 100644 --- a/bots/discord/src/utils/discord/rolePresets.ts +++ b/bots/discord/src/utils/discord/rolePresets.ts @@ -7,7 +7,7 @@ import { and, eq } from 'drizzle-orm' type PresetKey = string export const applyRolePreset = async (member: GuildMember, presetName: PresetKey, untilMs: number | null) => { - const afterInsert = await commonOperations(presetName, member, true) + const afterInsert = await applyRolesUsingPreset(presetName, member, true) const until = untilMs ? Math.ceil(untilMs / 1000) : null await database @@ -26,7 +26,7 @@ export const applyRolePreset = async (member: GuildMember, presetName: PresetKey } export const removeRolePreset = async (member: GuildMember, presetName: PresetKey) => { - const afterDelete = await commonOperations(presetName, member, false) + const afterDelete = await applyRolesUsingPreset(presetName, member, false) await database .delete(appliedPresets) @@ -41,11 +41,7 @@ export const removeRolePreset = async (member: GuildMember, presetName: PresetKe .then(afterDelete) } -/** - * Inserts (if not already present) an entry in the database, sets the member's roles - * @returns The currently applied presets AND a callback function to run after correcting the presets in the database - */ -const commonOperations = async (presetName: string, member: GuildMember, applying: boolean) => { +export const applyRolesUsingPreset = async (presetName: string, member: GuildMember, applying: boolean) => { const preset = config.rolePresets?.guilds[member.guild.id]?.[presetName] if (!preset) throw new Error(`The preset "${presetName}" does not exist for this server`)