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 savedMessages: GuildSavedMessages;
|
||||||
|
|
||||||
protected reactionRemoveQueue: Queue;
|
protected reactionRemoveQueue: Queue;
|
||||||
|
protected pendingRoles: Set<string>;
|
||||||
|
|
||||||
getDefaultOptions() {
|
getDefaultOptions() {
|
||||||
return {
|
return {
|
||||||
|
@ -38,6 +39,7 @@ export class ReactionRolesPlugin extends ZeppelinPlugin {
|
||||||
this.reactionRoles = GuildReactionRoles.getInstance(this.guildId);
|
this.reactionRoles = GuildReactionRoles.getInstance(this.guildId);
|
||||||
this.savedMessages = GuildSavedMessages.getInstance(this.guildId);
|
this.savedMessages = GuildSavedMessages.getInstance(this.guildId);
|
||||||
this.reactionRemoveQueue = new Queue();
|
this.reactionRemoveQueue = new Queue();
|
||||||
|
this.pendingRoles = new Set();
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -199,6 +201,10 @@ export class ReactionRolesPlugin extends ZeppelinPlugin {
|
||||||
const member = this.guild.members.get(userId);
|
const member = this.guild.members.get(userId);
|
||||||
if (!member) return;
|
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)) {
|
if (member.roles.includes(matchingReactionRole.role_id)) {
|
||||||
await member.removeRole(matchingReactionRole.role_id).catch(err => {
|
await member.removeRole(matchingReactionRole.role_id).catch(err => {
|
||||||
console.warn(`Could not remove role ${matchingReactionRole.role_id} from ${userId}`, err && err.message);
|
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
|
// Remove the reaction after a small delay
|
||||||
setTimeout(() => {
|
setTimeout(() => {
|
||||||
this.reactionRemoveQueue.add(async () => {
|
this.reactionRemoveQueue.add(async () => {
|
||||||
|
this.pendingRoles.delete(pendingKey);
|
||||||
|
|
||||||
const reaction = emoji.id ? `${emoji.name}:${emoji.id}` : emoji.name;
|
const reaction = emoji.id ? `${emoji.name}:${emoji.id}` : emoji.name;
|
||||||
await msg.channel.removeMessageReaction(msg.id, reaction, userId).catch(noop);
|
await msg.channel.removeMessageReaction(msg.id, reaction, userId).catch(noop);
|
||||||
await sleep(250);
|
await sleep(250);
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue