首页 > 解决方案 > ReactionCollector 过滤器不适用于其中一种表情符号

问题描述

if (cmd === "test") {
  message.channel.send("Pick a reaction").then(async function(message) {
    await message.react("");
    await message.react("");
    await message.react("");
    const filter = (reaction, user) => reaction.emoji.name === "" || reaction.emoji.name === "" || reaction.emoji.name === "" && reaction.message.author.id === "266315409735548928";
    let collector = message.createReactionCollector(filter, {
      time: 15000
    });
    collector.on('collect', (reaction, collector) => {
      switch (reaction.emoji.name) {
        case "":
          message.channel.send("Picked N");
          break;
        case "":
          message.channel.send("Picked B");
          break;
        case "":
          message.channel.send("Picked O");
          break;
      }
    });
    collector.on('end', collected => {
      return;
    });
  });
}

由于某种原因,我的代码今天停止工作:当我在过滤器中切换and时它确实可以工作,但是当我保持现在的状态时,选择时没有任何反应。
是什么导致了这个问题?

标签: node.jsdiscord.js

解决方案


问题不在于它本身,而在于逻辑运算符的工作方式。假设你有这个表达式:

first || second && third

这意味着程序首先要检查first,如果那是true因为它后面有一个||,它会停止,否则,它会检查second. 当它检查它时second它不会停止true,因为你&&在它后面放了一个。该表达式转换为该表达式:

first || (second && third)

您的代码适用于前两个反应,因为它不检查 id,而它在第三个反应中进行(而且它碰巧不一样false:)

我建议你切换到这个表达式:

["", "", ""].includes(reaction.emoji.name) && reaction.message.author.id == '266315409735548928';

这做同样的事情,但以更紧凑的方式。如果您仍想使用旧方式,请编写以下代码:

 (reaction.emoji.name === "" || reaction.emoji.name === "" || reaction.emoji.name === "") && reaction.message.author.id === "266315409735548928";

旁注:由于您写道它不适用于,因此它也不适用于此代码,因为reaction.message.author.id == '266315409735548928'仍然返回false。如果您试图检查反应是否由您添加,您应该使用user.id == 'your id'.
我看不到检查消息作者的 ID 的意义,因为该消息是由机器人发送的,并且ReactionCollector仅适用于该消息。


推荐阅读