fix(bots/discord): apply active role presets if members rejoin

This commit is contained in:
PalmDevs
2024-06-24 22:54:17 +07:00
parent 1723e8cacf
commit f50b26b82d
2 changed files with 19 additions and 7 deletions

View File

@@ -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)
})

View File

@@ -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`)