node.js - 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
时它确实可以工作,但是当我保持现在的状态时,
选择时没有任何反应。
是什么导致了这个问题?
解决方案
问题不在于它本身,而在于逻辑运算符的工作方式。假设你有这个表达式:
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
仅适用于该消息。
推荐阅读
- testing - 如何动态更改 JMeter 汇总报告中的行标签?
- flutter - 有弹性的标题效果
- database - 如何防止用户在 PostgreSQL 中修改模式
- javascript - 用户滚动时列表中的项目更改位置
- reporting-services - 在 SSRS 中的条形图上对类别进行分组
- reactjs - 未捕获的错误:只能在函数组件的主体内调用挂钩
- python - 对数组执行 argsort 操作时出现 IndexError
- javascript - 切换到 Preact 时,我的 React 库中的 JSX 出错
- javascript - 将迭代链接文本与另一个列表链接元素进行比较
- reactjs - 类型错误:类型“{}”中缺少属性“存储”,但类型“只读”中是必需的
'。TS2741