ReactionCollector过滤器不适用于其中一种表情符号

时间:2018-08-26 18:55:51

标签: node.js discord.js

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

由于某种原因,我的代码今天停止工作:当我在过滤器中切换时,它确实可以工作,但是当我保持现状时,{{1} }。
是什么导致此问题?

1 个答案:

答案 0 :(得分:0)

问题不是本身,而是逻辑运算符的工作方式。假设您有以下表达式:

first || second && third

这意味着程序首先要检查first,然后如果它是true,因为它后面有一个||,它将停止,否则,它将检查{{ 1}}。当它检查second时,它是否second不会停止,因为您在其后放置了true。这种表达翻译成这样:

&&

您的代码可用于前两个反应,因为它不检查id,而在第三个反应中(并且碰巧不一样:first || (second && third)

我建议您切换到以下表达式:

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。