【问题标题】:How to tell if a reaction is removed by a discord bot using JDA?如何判断一个反应是否被使用 JDA 的不和谐机器人删除?
【发布时间】:2021-04-24 16:53:46
【问题描述】:

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

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

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

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

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

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

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

【问题讨论】:

  • 为什么不能只使用 User#isBot?
  • 这是因为MessageReactionRemoveEvent总是返回做出反应的用户而不是移除反应的用户。使用 isBot() 总是会出错。
  • 我认为不和谐不会将其发送给机器人。您可能需要自己缓存反应。
  • 任何我可以参考的来源?感谢您的帮助。
  • 我的错。我与缓存混淆了一些东西。您可以尝试使用审核日志。

标签: java discord discord-jda


【解决方案1】:

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

方法如下:

  1. 添加一个布尔值,我们称之为触发器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() 方法会阻塞当前线程,所以在MessageReactionAddEvent 中的代码完成之前不会调用MessageReactionRemoveEvent
  5. MessageReactionRemoveEvent中,简单套用if (!trigger) // do something,意思是如果机器人移除了reaction,if语句后面的代码就不会被执行,如果reaction是,那就是你想做的地方被用户删除。
  6. 在方法结束时,确保包含trigger = true; 以重置触发器。
  7. (可选)在MessageReactionAddEvent 的开头包含trigger = true;

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

【讨论】:

猜你喜欢
  • 2020-12-07
  • 2021-08-06
  • 2021-07-25
  • 2011-05-19
  • 1970-01-01
  • 2021-07-10
  • 1970-01-01
  • 2021-08-09
  • 2019-02-13
相关资源
最近更新 更多