3
0
Fork 0
mirror of https://github.com/ZeppelinBot/Zeppelin.git synced 2025-03-16 22:21:51 +00:00

ReactionRoles: apply roles in a queue to avoid hitting rate limits on e.g. member REST endpoints

This commit is contained in:
Dragory 2020-06-04 21:50:08 +03:00
parent ff4c934ca3
commit c19fd847e7
No known key found for this signature in database
GPG key ID: 5F387BA66DF8AAC1

View file

@ -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,
);
} }
/** /**