java - 如何判断一个反应是否被使用 JDA 的不和谐机器人删除?
问题描述
我的代码中有一个 MessageReactionRemoveEvent ,每当删除反应时都会触发它。
但是,我也让我的机器人执行一些自动反应删除(删除用户的反应)。
我想防止MessageReactionRemoveEvent
在机器人删除反应时触发。
我的防止MessageReactionRemoveEvent
由机器人触发的代码:
if (event.getMember().getUser().equals(event.getJDA().getSelfUser())) return;
但是 getUser() 方法MessageReactionRemoveEvent
总是返回做出反应的用户的 ID,而不是机器人的 ID。
我的问题是如何检测机器人是否删除了反应?
解决方案
由于MessageReactionRemoveEvent
不会返回机器人 ID,因此我无法验证机器人是否删除了反应。我以相反的方式工作以防止在机器人删除反应时触发 MessageReactionRemoveEvent。
就是这样:
- 添加一个布尔值,我们称之为 trigger
boolean trigger = true;
。 - 确保使用
.complete()
来删除反应而不是.queue()
,差异可以在这里看到:https://ci.dv8tion.net/job/JDA/javadoc/net/dv8tion/jda/api/requests/RestAction.html#queue() - 消除反应后,执行
trigger = false;
. - 由于 .complete() 方法会阻塞当前 Thread,
MessageReactionRemoveEvent
因此在代码完成之前不会被调用MessageReactionAddEvent
。 - 在
MessageReactionRemoveEvent
, 简单地应用if (!trigger) // do something
中,这意味着如果机器人删除了反应,则不会执行 if 语句之后的代码,如果用户删除了反应,这就是您想要做的事情。 - 在方法结束时,确保包括
trigger = true;
重置触发器。 - (可选)包括
trigger = true;
在MessageReactionAddEvent
.
这对我来说就像魔术一样有效。
推荐阅读
- java - 正则表达式从文件列表中选择带有 2 个点的文件名
- android - cross compile for aosp
- excel - Return an entire table according to value selected by user in Excel
- xml - XSL muenchian-多层次分组和嵌套
- regex - PowerShell 3 正则表达式 - 为什么不区分大小写不起作用?
- php - 无法使用 composer 在 laravel 中安装 PHP-FFMpeg/PHP-FFMpeg 库
- javascript - Typescript:如何管理具有冲突类型声明的依赖项?
- tensorflow - Keras NN 产生的结果具有良好的可变性预测但幅度预测较差
- php - 如何对总值求和
- sql - SQL 函数从列中解析出文本