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} }。
是什么导致此问题?
答案 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。