如何判断反应是否被使用 JDA 的不和谐机器人删除?
How to tell if a reaction is removed by a discord bot using JDA?
我的代码中有一个 MessageReactionRemoveEvent,每当反应被移除时它就会触发。
但是,我也让我的机器人执行一些自动反应删除(删除用户的反应)。
我想防止 MessageReactionRemoveEvent
在机器人删除反应时触发。
我的防止 MessageReactionRemoveEvent
被机器人触发的代码:
if (event.getMember().getUser().equals(event.getJDA().getSelfUser())) return;
但是 MessageReactionRemoveEvent
中的 getUser() 方法总是 returns 做出反应的用户的 ID 而不是机器人的 ID。
我的问题是如何检测反应是否被机器人删除?
由于 MessageReactionRemoveEvent
不会 return 机器人 ID,因此我无法验证反应是否已被机器人删除。我以相反的方式工作以实现 防止在机器人删除反应时触发 MessageReactionRemoveEvent 。
方法如下:
- 添加一个布尔值,我们称之为触发器
boolean trigger = true;
。
- 确保使用
.complete()
而不是 .queue()
来删除反应,差异可以在这里看到:https://ci.dv8tion.net/job/JDA/javadoc/net/dv8tion/jda/api/requests/RestAction.html#queue()
- 删除反应后,执行
trigger = false;
。
- 由于 .complete() 方法将阻塞当前线程,
MessageReactionRemoveEvent
将不会在 MessageReactionAddEvent
中的代码完成之前被调用。
- 在
MessageReactionRemoveEvent
中,直接套用if (!trigger) // do something
,意思是如果reaction被bot去掉,if语句后面的代码就不会执行,这就是你要的地方如果反应被用户删除,请执行某些操作。
- 在方法的末尾,确保包含
trigger = true;
以重置触发器。
- (可选)在
MessageReactionAddEvent
的开头包含 trigger = true;
。
这对我来说就像魔法一样有效。
我的代码中有一个 MessageReactionRemoveEvent,每当反应被移除时它就会触发。
但是,我也让我的机器人执行一些自动反应删除(删除用户的反应)。
我想防止 MessageReactionRemoveEvent
在机器人删除反应时触发。
我的防止 MessageReactionRemoveEvent
被机器人触发的代码:
if (event.getMember().getUser().equals(event.getJDA().getSelfUser())) return;
但是 MessageReactionRemoveEvent
中的 getUser() 方法总是 returns 做出反应的用户的 ID 而不是机器人的 ID。
我的问题是如何检测反应是否被机器人删除?
由于 MessageReactionRemoveEvent
不会 return 机器人 ID,因此我无法验证反应是否已被机器人删除。我以相反的方式工作以实现 防止在机器人删除反应时触发 MessageReactionRemoveEvent 。
方法如下:
- 添加一个布尔值,我们称之为触发器
boolean trigger = true;
。 - 确保使用
.complete()
而不是.queue()
来删除反应,差异可以在这里看到:https://ci.dv8tion.net/job/JDA/javadoc/net/dv8tion/jda/api/requests/RestAction.html#queue() - 删除反应后,执行
trigger = false;
。 - 由于 .complete() 方法将阻塞当前线程,
MessageReactionRemoveEvent
将不会在MessageReactionAddEvent
中的代码完成之前被调用。 - 在
MessageReactionRemoveEvent
中,直接套用if (!trigger) // do something
,意思是如果reaction被bot去掉,if语句后面的代码就不会执行,这就是你要的地方如果反应被用户删除,请执行某些操作。 - 在方法的末尾,确保包含
trigger = true;
以重置触发器。 - (可选)在
MessageReactionAddEvent
的开头包含trigger = true;
。
这对我来说就像魔法一样有效。