diff --git a/backend/src/plugins/Persist.ts b/backend/src/plugins/Persist.ts index 0232601e..ba9250eb 100644 --- a/backend/src/plugins/Persist.ts +++ b/backend/src/plugins/Persist.ts @@ -71,8 +71,13 @@ export class PersistPlugin extends ZeppelinPlugin { @d.event("guildMemberAdd") async onGuildMemberAdd(_, member: Member) { + const memberRolesLock = await this.locks.acquire(`member-roles-${member.id}`); + const persistedData = await this.persistedData.find(member.id); - if (!persistedData) return; + if (!persistedData) { + memberRolesLock.unlock(); + return; + } const toRestore: MemberOptions = {}; const config = this.getConfig(); @@ -101,5 +106,7 @@ export class PersistPlugin extends ZeppelinPlugin { restoredData: restoredData.join(", "), }); } + + memberRolesLock.unlock(); } } diff --git a/backend/src/plugins/ReactionRoles.ts b/backend/src/plugins/ReactionRoles.ts index 4f48ca9a..67baeae3 100644 --- a/backend/src/plugins/ReactionRoles.ts +++ b/backend/src/plugins/ReactionRoles.ts @@ -189,6 +189,10 @@ export class ReactionRolesPlugin extends ZeppelinPlugin { timeout: null, changes: [], applyFn: async () => { + this.pendingRoleChanges.delete(memberId); + + const lock = await this.locks.acquire(`member-roles-${memberId}`); + const member = await this.getMember(memberId); if (member) { const newRoleIds = new Set(member.roles); @@ -206,9 +210,9 @@ export class ReactionRolesPlugin extends ZeppelinPlugin { `Failed to apply role changes to ${member.username}#${member.discriminator} (${member.id}): ${e.message}`, ); } - - this.pendingRoleChanges.delete(memberId); } + + lock.unlock(); }, };