【发布时间】:2020-09-19 09:09:24
【问题描述】:
我正在使用Discord.js 在这个项目中编写一个 Discord 机器人。我正在尝试在消息上放置一个 ReactionCollector 并检查使用的反应是否在我的数据中。
数据存储在这个config.json中
{
"botId": "xxxxxxxxxxxxxxx",
"emojis": {
"classes": [{
"one": "716821724884238506",
"two": "716821724863266876",
"three": "716821724884369488"
}]
}
}
这是我要分配给 ReactionController 的过滤器。如果发现的反应在 config.json 中并且不是由机器人本身编写的,它应该触发。
const filter = (reaction, user) => {
if(user.id === CONFIG.botId) {
return false;
}
CONFIG.emojis.classes.forEach(obj => {
Object.entries(obj).forEach(([key, value]) => {
if(value === reaction.emoji.id) {
console.log(`key: ${key}, value: ${value}`)
return true;
}
});
});
}
最后是我想要使用过滤器的收集器:
const collector = message.createReactionCollector(filter);
collector.on('collect', (reaction, user) => {
console.log(`Collected: ${reaction.emoji.id}`);
let alreadySetClass = '';
if (message.channel.name.includes(reaction.emoji.name.toLowerCase())) {
alreadySetClass = reaction.emoji.name.toLowerCase()
}
console.log("setClass: " + alreadySetClass)
setChannelName(message.channel, reaction.emoji.name, alreadySetClass)
})
我通过收集反应得到的反应是一个MessageReaction 对象。
过滤器的 consol.log 将正确打印键、值对。但是收集器内部的console.log('collected: ') 根本不会执行。控制台中没有错误。我不知道我在这里错过了什么。我认为我编写过滤器的方式有问题。一些帮助会很棒。提前谢谢。
【问题讨论】:
-
您能否提供您正在获取并尝试对其执行操作的数据结构
-
我添加了我得到的对象作为指向 discord.js 文档的链接。它是一个 MessageReaction 对象。
-
@Frossy 我认为您应该将条件
user.id !== CONFIG.botId移到嵌套 for 循环之外。该条件与表情符号 ID 条件是分开的。 -
@NguyễnViệtĐức 我确实尝试将它放在 forEach 之前,如果 user.id === CONFIG.botId 则返回 false 如果这就是您所说的结果并没有改变
-
是的,它不会改变结果。这就是我评论而不是回答的原因。但是如果你仔细观察,对于对象内部的每个类,你必须再次检查
botId,即使它们是相同的。
标签: javascript discord discord.js