mirror of
https://github.com/ZeppelinBot/Zeppelin.git
synced 2025-03-16 14:11:50 +00:00
ReactionRoles: apply roles in a queue to avoid hitting rate limits on e.g. member REST endpoints
This commit is contained in:
parent
ff4c934ca3
commit
c19fd847e7
1 changed files with 14 additions and 6 deletions
|
@ -54,6 +54,7 @@ export class ReactionRolesPlugin extends ZeppelinPlugin<TConfigSchema> {
|
||||||
protected savedMessages: GuildSavedMessages;
|
protected savedMessages: GuildSavedMessages;
|
||||||
|
|
||||||
protected reactionRemoveQueue: Queue;
|
protected reactionRemoveQueue: Queue;
|
||||||
|
protected roleChangeQueue: Queue;
|
||||||
protected pendingRoleChanges: Map<string, PendingMemberRoleChanges>;
|
protected pendingRoleChanges: Map<string, PendingMemberRoleChanges>;
|
||||||
protected pendingRefreshes: Set<string>;
|
protected pendingRefreshes: Set<string>;
|
||||||
|
|
||||||
|
@ -82,6 +83,7 @@ export class ReactionRolesPlugin extends ZeppelinPlugin<TConfigSchema> {
|
||||||
this.reactionRoles = GuildReactionRoles.getGuildInstance(this.guildId);
|
this.reactionRoles = GuildReactionRoles.getGuildInstance(this.guildId);
|
||||||
this.savedMessages = GuildSavedMessages.getGuildInstance(this.guildId);
|
this.savedMessages = GuildSavedMessages.getGuildInstance(this.guildId);
|
||||||
this.reactionRemoveQueue = new Queue();
|
this.reactionRemoveQueue = new Queue();
|
||||||
|
this.roleChangeQueue = new Queue();
|
||||||
this.pendingRoleChanges = new Map();
|
this.pendingRoleChanges = new Map();
|
||||||
this.pendingRefreshes = new Set();
|
this.pendingRefreshes = new Set();
|
||||||
|
|
||||||
|
@ -189,6 +191,8 @@ export class ReactionRolesPlugin extends ZeppelinPlugin<TConfigSchema> {
|
||||||
timeout: null,
|
timeout: null,
|
||||||
changes: [],
|
changes: [],
|
||||||
applyFn: async () => {
|
applyFn: async () => {
|
||||||
|
this.pendingRoleChanges.delete(memberId);
|
||||||
|
|
||||||
const lock = await this.locks.acquire(`member-roles-${memberId}`);
|
const lock = await this.locks.acquire(`member-roles-${memberId}`);
|
||||||
|
|
||||||
const member = await this.getMember(memberId);
|
const member = await this.getMember(memberId);
|
||||||
|
@ -200,17 +204,18 @@ export class ReactionRolesPlugin extends ZeppelinPlugin<TConfigSchema> {
|
||||||
}
|
}
|
||||||
|
|
||||||
try {
|
try {
|
||||||
await member.edit({
|
await member.edit(
|
||||||
roles: Array.from(newRoleIds.values()),
|
{
|
||||||
});
|
roles: Array.from(newRoleIds.values()),
|
||||||
|
},
|
||||||
|
"Reaction roles",
|
||||||
|
);
|
||||||
} catch (e) {
|
} catch (e) {
|
||||||
logger.warn(
|
logger.warn(
|
||||||
`Failed to apply role changes to ${member.username}#${member.discriminator} (${member.id}): ${e.message}`,
|
`Failed to apply role changes to ${member.username}#${member.discriminator} (${member.id}): ${e.message}`,
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
this.pendingRoleChanges.delete(memberId);
|
|
||||||
lock.unlock();
|
lock.unlock();
|
||||||
},
|
},
|
||||||
};
|
};
|
||||||
|
@ -222,7 +227,10 @@ export class ReactionRolesPlugin extends ZeppelinPlugin<TConfigSchema> {
|
||||||
pendingRoleChangeObj.changes.push({ mode, roleId });
|
pendingRoleChangeObj.changes.push({ mode, roleId });
|
||||||
|
|
||||||
if (pendingRoleChangeObj.timeout) clearTimeout(pendingRoleChangeObj.timeout);
|
if (pendingRoleChangeObj.timeout) clearTimeout(pendingRoleChangeObj.timeout);
|
||||||
setTimeout(() => pendingRoleChangeObj.applyFn(), ROLE_CHANGE_BATCH_DEBOUNCE_TIME);
|
pendingRoleChangeObj.timeout = setTimeout(
|
||||||
|
() => this.roleChangeQueue.add(pendingRoleChangeObj.applyFn),
|
||||||
|
ROLE_CHANGE_BATCH_DEBOUNCE_TIME,
|
||||||
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
Loading…
Add table
Reference in a new issue