mirror of
https://github.com/ZeppelinBot/Zeppelin.git
synced 2025-05-10 20:35:02 +00:00
ReactionRoles: don't add/remove roles multiple times if the user spams the reaction
This commit is contained in:
parent
22c9908fe0
commit
33f50a460b
1 changed files with 8 additions and 0 deletions
|
@ -16,6 +16,7 @@ export class ReactionRolesPlugin extends ZeppelinPlugin {
|
|||
protected savedMessages: GuildSavedMessages;
|
||||
|
||||
protected reactionRemoveQueue: Queue;
|
||||
protected pendingRoles: Set<string>;
|
||||
|
||||
getDefaultOptions() {
|
||||
return {
|
||||
|
@ -38,6 +39,7 @@ export class ReactionRolesPlugin extends ZeppelinPlugin {
|
|||
this.reactionRoles = GuildReactionRoles.getInstance(this.guildId);
|
||||
this.savedMessages = GuildSavedMessages.getInstance(this.guildId);
|
||||
this.reactionRemoveQueue = new Queue();
|
||||
this.pendingRoles = new Set();
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -199,6 +201,10 @@ export class ReactionRolesPlugin extends ZeppelinPlugin {
|
|||
const member = this.guild.members.get(userId);
|
||||
if (!member) return;
|
||||
|
||||
const pendingKey = `${userId}-${matchingReactionRole.role_id}`;
|
||||
if (this.pendingRoles.has(pendingKey)) return;
|
||||
this.pendingRoles.add(pendingKey);
|
||||
|
||||
if (member.roles.includes(matchingReactionRole.role_id)) {
|
||||
await member.removeRole(matchingReactionRole.role_id).catch(err => {
|
||||
console.warn(`Could not remove role ${matchingReactionRole.role_id} from ${userId}`, err && err.message);
|
||||
|
@ -212,6 +218,8 @@ export class ReactionRolesPlugin extends ZeppelinPlugin {
|
|||
// Remove the reaction after a small delay
|
||||
setTimeout(() => {
|
||||
this.reactionRemoveQueue.add(async () => {
|
||||
this.pendingRoles.delete(pendingKey);
|
||||
|
||||
const reaction = emoji.id ? `${emoji.name}:${emoji.id}` : emoji.name;
|
||||
await msg.channel.removeMessageReaction(msg.id, reaction, userId).catch(noop);
|
||||
await sleep(250);
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue