从特定消息中删除特定用户反应 - Discord.js

时间:2021-02-15 08:32:22

标签: javascript node.js discord.js

希望能帮到你。这让我发疯了。我是编程和 JS 的新手,但我正在制作一个不和谐的机器人作为一个爱好项目。如果我没有使用正确的术语,请原谅我,但我认为我的问题实际上应该很简单。

我有一个机器人,可以用嵌入来构建消息。机器人与收集器一起聆听,并根据玩家的反应将玩家添加到嵌入的字段中。例如,请参见屏幕截图。玩家可以将自己添加到“耕种”“非耕种”或“入门”中

Screenshot of bot's post

当我发布初始嵌入时,我会清除频道中的所有固定消息并固定此消息,因此具有我嵌入状态的帖子将始终是频道中唯一固定的帖子。

我想要做的是输入一个像“!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,我似乎根本无法工作(与不在异步函数中有关)。

请告诉我我遗漏了一些简单的东西!

1 个答案:

答案 0 :(得分:0)

我不知道您是否查看过 the docsmessage.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)。