反应后,我需要消除用户的反应

时间:2020-06-19 12:33:08

标签: node.js discord.js

我有一个命令,可以让我查询API以检索图像,然后将它们显示为不一致。

目前,我要从API 10图像中进行搜索,由于反应不协调,我想设置一个导航系统。一切正常,但问题在于,一旦用户单击,反应就保持活动状态。我需要删除反应以改善用户体验。因此,当前需要双击不是很实际。这是无法删除的方法:

  const removeReaction = (m, msg, emoji) => {
    try {
      m.reactions.find(r => r.emoji.name == emoji).users.remove(msg.author.id);
    } catch(err) {
        console.log('err: ', err)
    }
  }

这是我所有的代码

bot.on('message', async msg => {
  if (msg.content.startsWith('!test')) {
    const args = msg.content.slice('!test').split(' ')
    console.log('args :', args[1])
    axios(`https://json-api.example.com/posts?tags=${args[1]}&limit=10`, {
        method: 'GET',
    })
      .then((response) => {
        if (response.status === 500) {
          msg.channel.send('error')
        } else {
          if (response.data.posts.length === 0) {
             msg.channel.send(`No result for ${args[1]}`)
          }
          if (response.data.posts.length > 0) {
             const resultsLength = response.data.posts.length
             const options = {
               limit: 60000,
               min: 1,
               max: resultsLength - 1,
               page: 1
             }
             const pages = []
             response.data.posts.map((i, index) => {
                 pages.push({
                    "title": `Result page number ${index} for ${args[1]}`,
                    "url": `${response.data.posts[index].sample_url}`,
                    "color": 43333,
                    "footer": {
                      "icon_url": "https://cdn.discordapp.com/app-icons/708760465999790244/228b2993e942a361518b557ee4511b26.png?size=32",
                      "text": "Cool footer"
                    },
                    "image": {
                      "url": `${response.data.posts[index].url}`
                    },
                    "fields": [
                      {
                        "name": "tags",
                        "value": `${response.data.posts[index].tags[0] || '/'}, ${response.data.posts[index].tags[1] || '/'}, ${response.data.posts[index].tags[2] || '/'}, ${response.data.posts[index].tags[3] || '/'}`
                      }
                    ]
                 })
             })

             const m = msg.channel.send({ embed: pages[options.page] }).then((el) => {
                el.react('⬅️')
                el.react('➡️')
                el.react('?️')
             })
             const filter = (reaction, user) => {
               return ['⬅️', '➡️', '?️'].includes(reaction.emoji.name) && user.id == msg.author.id
             }


             const awaitReactions = (msg, m, options, filter) => {
               const { min, max, page, limit } = options
               m.awaitReactions(filter, { max: 1, time: limit, errors: ['time'] })
               .then((collected) => {
                  const reaction = collected.first()
                  const removeReaction = (m, msg, emoji) => {
                    try { m.reactions.find(r => r.emoji.name == emoji).users.remove(msg.author.id); } catch(err) { console.log('err: ', err) }
                  }

                  if (reaction.emoji.name === '⬅️') {
                     removeReaction(m, msg, '⬅️')
                     if (page != min) {
                       page = page - 1
                       m.edit({ embed: pages[page] })
                     }
                    awaitReactions(msg, m, options, filter)
                  }
                  else if (reaction.emoji.name === '➡️') {
                     removeReaction(m, msg, '➡️');
                     if (page != max) {
                       page = page + 1
                       m.edit({ embed: pages[page] })
                     }
                     awaitReactions(msg, m, options, filter);
                  }
                  else if (reaction.emoji.name === '➡️') {
                     removeReaction(m, msg, '➡️');
                     if (page != max) {
                       page = page + 1
                       m.edit({ embed: pages[page] })
                     }
                     awaitReactions(msg, m, options, filter);
                  }
                  else if (reaction.emoji.name === '?️') {
                    return m.delete()
                  }
                  else {
                    awaitReactions(msg, m, options, filter)
                  }

               }).catch((err) => { console.log('err: ', err) })
             }

             awaitReactions(msg, m, options, filter)

预先感谢您的帮助

2 个答案:

答案 0 :(得分:0)

我之前已经编写了这段代码。 它适用于Discord.js的旧版本,但根据文档,它仍然可以正常工作。 基本上,您要做的就是在发送图片后使用Discord.js createReactionCollector函数,然后在this.reactionCollector.on('collect', (reaction, reactionCollector) => {//do your work here})内更改图片,然后调用reaction.remove(user);,这立即消除了对此的反应用户。

这是我的代码: 注意:我为此命令制作了一个类,因此它对您来说可能看起来有所不同。
同样在我的版本中,只有最初调用该命令的用户才能更改图片。因此,如果要允许任何人更改图片,则需要修改该部分。 (如果您的机器人在大型服务器中,则可能是一个非常糟糕的主意。)

this.channel.send({embed}).then(msg => {
             this.message = msg;
             this.message.react('⬅️').then(x => {
                 this.message.react('➡️');
             })

             const filter = (reaction, user) => {
                return (reaction.emoji.name === '➡️' ||  reaction.emoji.name === '⬅️') && user.id === this.user.id;
            };
             this.reactionCollector = this.message.createReactionCollector(filter, { time: 600000 });
                this.reactionCollector.on('collect', (reaction, reactionCollector) => {

                    if(reaction.emoji.name === '➡️') {
                        if(this.index + 1 < result.length) {
                            this.index++;
                         var embed = this.makeEmbed(result[this.index].img);
                         this.message.edit({embed});
                        }
                    }
                    else if(reaction.emoji.name === '⬅️') {
                        if(this.index - 1 > -1) {
                            this.index--;
                         var embed = this.makeEmbed(result[this.index].img);
                         this.message.edit({embed});
                        }
                }
                reaction.remove(this.user);
                });
         });

答案 1 :(得分:0)

因此,经过大量研究,我终于找到了。我在这里分享答案。

使用12+版本的discord.js软件包,发生了很多变化,包括我的问题:

m.reactions.find(r => r.emoji.name == emoji).users.remove(msg.author.id);

必须成为:

m.reactions.cache.find(r => r.emoji.name == emoji).users.remove(msg.author);