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

Posted

技术标签:

【中文标题】从特定消息中删除特定用户反应 - Discord.js【英文标题】:Remove a specific user reaction from a specific message - Discord.js 【发布时间】:2021-05-18 03:35:13 【问题描述】:

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

我有一个机器人可以构建带有嵌入的消息。该机器人通过收集器进行侦听,并根据他们的反应将玩家添加到嵌入的字段中。例如,请参见屏幕截图。玩家可以将自己添加到“Farming”“Not Farming”或“Starter”中

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:无法读取属性 null 的“用户”

message.reactions.removeAll() 确实有效,但会删除包括机器人在内的所有反应。

我从here 获得了此代码,但尝试了许多其他代码组合,包括this one,我似乎根本无法工作(与不在异步函数中有关)。

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

【问题讨论】:

【参考方案1】:

我不知道您是否查看过 the docs 的 message.reactions.resolve() 方法,但您尝试使用它的方式并不完全正确(而且不是t 打算如何使用)。 message.reactions.resolve() 只接受两种不同类型的参数:MessageReaction 对象或 Snowflake(具体消息反应的 ID——注意这里不是指表情符号的 ID 或值,而是具体的反应本身)。

所以基本上,.resolve() 方法应该将 ID 转换为对象。因此,如果您有一条 ID 为 811386028425609247 的消息并且您执行 messages.resolve(811386028425609247),它将返回 ID 为的特定消息。 (当然,这是一个带有消息而不是消息反应的示例)。就您而言,这也不是您想要做的。 .resolve() 将用于使用您没有的该反应的 ID 获取单个特定反应。

请注意,我指的是反应本身的 ID,而不是正在反应的表情符号的 ID。如果我要对两条不同的消息使用 ? 做出反应,则两者的 emoji ID 将相同(因为它们是相同的 emoji),但反应 ID 会不同(因为它们是两个独立的反应)。

您真正想要做的是找到对消息做出反应的特定表情,然后删除做出反应的用户。所以你真正要找的是这样的:

message.reactions.cache.find(reaction => reaction.emoji.name == "?").users.remove(testuserid);

这行新代码的作用是查看消息上的反应,找到带有 ? 表情符号的反应,然后从该反应中删除用户。只是为了好玩,我将添加您的旧代码行正在执行的操作:它正在寻找 ID 为“?”的特定反应,这当然不存在,并试图从该不存在的反应中删除用户(因此你得到的错误是:Cannot read property 'users' of null,因为反应本身不存在,因此null)。

【讨论】:

以上是关于从特定消息中删除特定用户反应 - Discord.js的主要内容,如果未能解决你的问题,请参考以下文章

如何获取对特定消息做出反应的用户的不和谐 ID discord.js

{discord.py} 删除特定用户的特定信息

Discord Bot 删除特定频道中的消息

Discord BOT python,如何在特定用户编写命令时发送消息

使用 Discord py 删除特定用户的消息

从特定频道中的特定消息中删除所有反应