Manuel Celli :
I'm building a simple poll bot for Discord in JavaScript, right now I'm trying to implement max number of reactions per user to a message.
For example, suppose we have the following options for a poll question:
The Question?
Option A
Option B
Option C
Option D
Option E
Each "option" is a reaction to the message given from the bot, I want to make sure that a user cannot react to more than 3
of those options.
- My train of thought was to make a
messageReactionAdd
listener and then when the user reacted for the4th time
, remove the last reaction, sending him a message like "You've already voted3 times
, please remove a reaction to vote again". - Still, I'm stuck trying to navigate through the objects to find the total reaction count per user I can find the total reaction count per emoji but that's not what I need.
Could someone give me some insight on this?
EDIT
Code used to send messages:
Embed = new Discord.MessageEmbed()
.setColor(0x6666ff)
.setTitle(question)
.setDescription(optionsList);
message.channel.send(Embed).then(messageReaction => {
for (var i = 0; i < options.length; i++){
messageReaction.react(emojiAlphabet[i][0]);
}
message.delete().catch(console.error);
});
cherryblossom :
Try this:
const {Collection} = require('discord.js')
// the messages that users can only react 3 times with
const polls = new Set()
// Collection<Message, Collection<User, number>>: stores how many times a user has reacted on a message
const reactionCount = new Collection()
// when you send a poll add the message the bot sent to the set:
polls.add(message)
client.on('messageReactionAdd', (reaction, user) => {
// edit: so that this does not run when the bot reacts
if (user.id === client.user.id) return
const {message} = reaction
// only do the following if the message is one of the polls
if (polls.has(message)) {
// if message hasn't been added to collection add it
if (!reactionCount.get(message)) reactionCount.set(message, new Collection())
// reaction counts for this message
const userCount = reactionCount.get(message)
// add 1 to the user's reaction count
userCount.set(user, (userCount.get(user) || 0) + 1)
if (userCount.get(user) > 3) {
reaction.users.remove(user)
// <@!id> mentions the user (using their nickname if they have one)
message.channel.send(`<@!${user.id}>, you've already voted 3 times, please remove a reaction to vote again.`)
}
}
})
client.on('messageReactionRemove', (reaction, user) => {
// edit: so that this does not run when the bot reacts
if (user.id === client.user.id) return
const {message} = reaction
const userCount = reactionCount.get(message)
// subtract 1 from user's reaction count
if (polls.has(message)) userCount.set(user, reactionCount.get(message).get(user) - 1)
})
Guess you like
Origin http://43.154.161.224:23101/article/api/json?id=302616&siteId=1