希望能帮到你。这让我发疯了。我是编程和 JS 的新手,但我正在制作一个不和谐的机器人作为一个爱好项目。如果我没有使用正确的术语,请原谅我,但我认为我的问题实际上应该很简单。
我有一个机器人,可以用嵌入来构建消息。机器人与收集器一起聆听,并根据玩家的反应将玩家添加到嵌入的字段中。例如,请参见屏幕截图。玩家可以将自己添加到“耕种”“非耕种”或“入门”中
当我发布初始嵌入时,我会清除频道中的所有固定消息并固定此消息,因此具有我嵌入状态的帖子将始终是频道中唯一固定的帖子。
我想要做的是输入一个像“!placed @user”这样的命令,@提到的用户应该从原来的帖子中删除他们的反应。我获取消息 ID 和用户 ID 没有问题,但我似乎无法将两者结合起来以消除他们的反应。这是我的代码的摘录:
message.channel.messages.fetchPinned().then(messages => {
console.log(`Received ${messages.size} messages`);
var testuserid = message.mentions.users.first().id;
messages.forEach(message => {
message.reactions.resolve("?").users.remove(testuserid);
})
})
问题在于最后一行 message.reactions.resolve
。我已经尝试了使用表情符号字符或代码、对用户 ID 进行硬编码等的各种组合
我似乎总是以类似于以下的错误告终:
<块引用>UnhandledPromiseRejectionWarning: TypeError: 无法读取属性 'users' 为空
message.reactions.removeAll()
确实有效,但会删除包括机器人在内的所有反应。
我从 here 获得此代码,但尝试了许多其他代码组合,包括 this one,我似乎根本无法工作(与不在异步函数中有关)。
请告诉我我遗漏了一些简单的东西!
答案 0 :(得分:0)
我不知道您是否查看过 the docs 的 message.reactions.resolve()
方法,但是您尝试使用它的方式并不是正确的使用方式(并且不是它的用途)。 message.reactions.resolve()
只接受两种不同类型的参数:MessageReaction
对象或 Snowflake
(特定消息反应的 ID - 请注意,这不是指的 ID 或值表情符号,但具体反应本身)。
所以基本上,.resolve()
方法应该将 ID 转换为对象。因此,如果您有一条 ID 为 811386028425609247
的消息并且您执行了 messages.resolve(811386028425609247)
,它将返回 ID 为该 ID 的特定消息。 (当然,这是一个带有消息而不是消息反应的例子)。在您的情况下,这也不是您想要做的。 .resolve()
将用于使用您没有的反应 ID 获取单个特定反应。
请注意,我指的是反应本身的 ID,而不是被反应的表情符号的 ID。如果我对两条不同的消息用 ? 做出反应,则两者的表情符号 ID 将相同(因为它们是相同的表情符号),但反应 ID 会不同(因为它们是两个独立的反应)。
您真正想要做的是找到对消息做出反应的特定表情,并删除做出反应的用户。所以你真正要找的是这样的:
message.reactions.cache.find(reaction => reaction.emoji.name == "?").users.remove(testuserid);
这行新代码的作用是查看消息的反应,找到带有 ? 表情符号的反应,然后从该反应中删除用户。只是为了好玩,我将添加您的旧代码行正在做什么:它正在寻找 ID 为“?”的特定反应,这当然不存在,并试图从不存在的反应中删除用户(因此你得到的错误是:Cannot read property 'users' of null
,因为反应本身不存在,因此null
)。