首页 > 解决方案 > 如何判断一个反应是否被使用 JDA 的不和谐机器人删除?

问题描述

我的代码中有一个 MessageReactionRemoveEvent ,每当删除反应时都会触发它。

但是,我也让我的机器人执行一些自动反应删除(删除用户的反应)。

我想防止MessageReactionRemoveEvent在机器人删除反应时触发。

我的防止MessageReactionRemoveEvent由机器人触发的代码:

if (event.getMember().getUser().equals(event.getJDA().getSelfUser())) return;

但是 getUser() 方法MessageReactionRemoveEvent总是返回做出反应的用户的 ID,而不是机器人的 ID。

我的问题是如何检测机器人是否删除了反应?

标签: javadiscorddiscord-jda

解决方案


由于MessageReactionRemoveEvent不会返回机器人 ID,因此我无法验证机器人是否删除了反应。我以相反的方式工作以防止在机器人删除反应时触发 MessageReactionRemoveEvent

就是这样:

  1. 添加一个布尔值,我们称之为 trigger boolean trigger = true;
  2. 确保使用.complete()来删除反应而不是.queue(),差异可以在这里看到:https://ci.dv8tion.net/job/JDA/javadoc/net/dv8tion/jda/api/requests/RestAction.html#queue()
  3. 消除反应后,执行trigger = false;.
  4. 由于 .complete() 方法会阻塞当前 ThreadMessageReactionRemoveEvent因此在代码完成之前不会被调用MessageReactionAddEvent
  5. MessageReactionRemoveEvent, 简单地应用if (!trigger) // do something中,这意味着如果机器人删除了反应,则不会执行 if 语句之后的代码,如果用户删除了反应,这就是您想要做的事情。
  6. 在方法结束时,确保包括trigger = true;重置触发器。
  7. (可选)包括trigger = true;MessageReactionAddEvent.

这对我来说就像魔术一样有效。


推荐阅读