过滤来自特定用户的反应 discord.js

Posted

技术标签:

【中文标题】过滤来自特定用户的反应 discord.js【英文标题】:filter reactions from specific users discord.js 【发布时间】:2019-11-05 13:36:50 【问题描述】:

我正在制作一个玩家可以互相挑战的机器人。在发布挑战命令(包括列出他们想要向其发起挑战的玩家)后,我让我的机器人获取每个用户的不和谐 ID。

然后,我在挑战频道中发布了机器人帖子,列出了玩家并等待只有那些受到挑战的玩家的反应。我做了一个反应收集器来收集这些反应。我想过滤这些反应,只包括那些被挑战的反应,以避免随机玩家劫持挑战。

在下面的代码中,uniquePlayersIDArray 是一个不和谐用户 ID 的数组。我只是希望机器人只收集该数组中用户的反应。

我尝试使用 uniquePlayersIDArray.indexOf(user.id) 来检测用户是否在数组中。如下所示,我尝试了 uniquePlayersIDArray.includes(user.id)。

async function acceptQuestion() 

  const agree = "✅"
  const disagree = "❌"
  let msg = await message.channel.send(`A challenge has been issued by $author?\n\n**IF** you are listed above, please select one of the following to accept or deny the challenge...`)
  await msg.react(agree)
  await msg.react(disagree)

  const filter = (reaction, user) => 
  return ['✅', '❌'].includes(reaction.emoji.name) && uniquePlayersIDArray.includes(user.id);

  ;
 const collector = await msg.createReactionCollector(filter,  time: 15000 );

  collector.on('collect', (reaction, reactionCollector) => 

  console.log(`Collected $reaction.emoji.name`)

  if (reaction.emoji.name === '✅') 
  message.channel.send(`$reaction.user has **accepted** the challenge! Please await 5 minutes to pass or for all challenged players to respond!`)
   else if (reaction.emoji.name === '❌') 
  message.channel.send(`$reaction.user has **declined* the challenge! Please await 5 minutes to pass or for all challenged players to respond!`)
    
    );

    collector.on('end', collected => 
    console.log(`Collected $collected.size items`);
    );
    

我知道这可以在过滤语句中的“.includes(reaction.emoji.name)”之后添加任何内容,但它会收集所有反应。

我只想忽略那些没有受到质疑的人的所有反应。

提前感谢您的帮助。

【问题讨论】:

究竟是什么不工作?只要响应用户的 ID 在 uniquePlayersIDArray 中,您的过滤器就可以解决问题。 @slothiful 但它不承认任何反应。我让挑战的作者和被挑战的作者之一做出反应,15 秒后,它说它收集了 0 个反应。 uniquePlayersIDArray 记录到控制台并确保它符合您的预期。 @slothiful 我解决了这个问题。我将错误的值推送到 uniquePlayersIDArray 数组。感谢您指出这种可能性。现在我在 if else 语句中遇到了关于给出的反应的 $reaction.users 问题。它说未定义而不是用户名。我希望它说出接受或拒绝的人的用户名。根据 MessageReaction 的文档,我想我可能需要使用 .fetchUsers 但不确定在该方法之前放置什么。 reacton.fetchUsers 不起作用... 【参考方案1】:

您可以添加一个 MessageCollector 来检查 executor 的作者是否是响应者并使用 message.awaitReactions 而不是 createReactionCollector

message.awaitReactions(filter,  max: 1, time: 500000, errors: ['time'] )
                .then(collected => 
                    const reaction = collected.first();

                    if (reaction.emoji.name === '✅') 
                        msg.channel.send(logSetup);
                            const collector = new Discord.MessageCollector(msg.channel, m => m.author.id === msg.author.id,  time: 500000 );
                            console.log(collector)
                            collector.on('collect', message => 

                                message.channel.send("You clicked ✅");

                            )
                     else 
                        msg.reply('You clicked ❌');
                    
                )

【讨论】:

以上是关于过滤来自特定用户的反应 discord.js的主要内容,如果未能解决你的问题,请参考以下文章

根据包含的数组内容过滤对象数组。 Vanilla JS,lodash,其他一些与反应相关的技术?

如何让机器人在收到来自某个消息的反应后将消息发送到特定频道

Vuejs 以反应方式更新列表

为啥我的 CORS 配置没有导致服务器过滤传入的请求?如何让服务器只接受来自特定来源的请求?

为啥我的 CORS 配置没有导致服务器过滤传入的请求?如何让服务器只接受来自特定来源的请求?

特定路由的快速 ip 过滤器?