diff --git a/src/listeners/client/guildMemberAdd.ts b/src/listeners/client/guildMemberAdd.ts index f7738fdc..d8d3b43f 100644 --- a/src/listeners/client/guildMemberAdd.ts +++ b/src/listeners/client/guildMemberAdd.ts @@ -5,14 +5,7 @@ import * as messages from '#config/messages'; import { channels } from '#config/settings'; export class GuildMemberAddListener extends Listener { - private deduplication = new Set(); - public override async run(member: GuildMember): Promise { - if (this.deduplication.has(member.id)) return; - - this.deduplication.add(member.id); - setTimeout(() => this.deduplication.delete(member.id), 60_000); - await this._greet(member); } @@ -24,6 +17,11 @@ export class GuildMemberAddListener extends Listener { if (!channel || !channel.isTextBased()) return; const content = pupa(randomMessage, { member }); - await channel.send(content); + + // Keep welcome sends idempotent. + const joinedTimestamp = member.joinedTimestamp ?? Date.now(); + const nonce = `${member.id}:${joinedTimestamp}`; + + await channel.send({ content, nonce, enforceNonce: true }); } }