提问者:小点点

限制用户对邮件的反应


我正在为JavaScript中的Discord构建一个简单的poll bot,现在我正在尝试实现每个用户对消息的最大反应数。

例如,假设我们对一个投票问题有以下选项:

那个问题?

>

  • 选项A

    备选案文B

    备选案文C

    选项D

    备选案文E

    每个“选项”都是对bot给出的消息的反应,我希望确保用户对这些选项中的3以上的反应。

    • 我的思路是制作一个MessageReactionAdd侦听器,然后当用户对4次作出反应时,删除最后一次反应,向他发送一条消息,如“您已经对3次投票了,请删除一个反应以再次投票”。
    • 不过,我还是无法在这些对象中找到每个用户的总反应计数我可以找到每个表情符号的总反应计数,但这不是我需要的。

    有人能给我一些关于这方面的见解吗?

    编辑

    用于发送消息的代码:

    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);
                  });
    

  • 共1个答案

    匿名用户

    请尝试以下操作:

    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)
    })