Discord Java JDA -在MessageReactionRemoveEvent中获取成员



我正在尝试创建一个不和谐的机器人,我需要一个特定的行动,当有人不反应时执行。方法如下:

public void onMessageReactionRemove(MessageReactionRemoveEvent event) {
Guild guild = event.getGuild();
Member member = event.getMember();
if(event.getMessageId().equalsIgnoreCase(Main.rolesMessage.getId())) {
if(event.getReactionEmote().getEmoji().equals("uD83CuDDE6")) {
Role role = event.getGuild().getRolesByName("1", true).get(0);
if(member.getRoles().contains(role)) {
guild.removeRoleFromMember(member, role).queue();
}
}
else if(event.getReactionEmote().getEmoji().equals("uD83CuDDE7")) {
Role role = event.getGuild().getRolesByName("2", true).get(0);
if(member.getRoles().contains(role)) {
guild.removeRoleFromMember(member, role).queue();
}
}
else if(event.getReactionEmote().getEmoji().equals("uD83CuDDE8")) {
Role role = event.getGuild().getRolesByName("3", true).get(0);
if(member.getRoles().contains(role)) {
System.out.println("yay");
guild.removeRoleFromMember(member, role).queue();
}
}
else if(event.getReactionEmote().getEmoji().equals("uD83CuDDE9")) {
Role role = event.getGuild().getRolesByName("4", true).get(0);
if(member.getRoles().contains(role)) {
guild.removeRoleFromMember(member, role).queue();
}
}
}
}

问题是那个事件。getMember返回null。我想我应该尽量避开这个问题,所以我做了下面的事情:

Guild guild = event.getGuild();
String id = event.getUserId();
Member member = guild.getMemberById(id);

经过一些故障排除后,我发现字符串id是正确的用户id,但guild.getMemberById(id)仍然返回null。我还尝试了一些其他的变化,看看是否有什么能起作用,但每次都发生同样的事情。在必须将其转换为成员之前,一切都很好。

是否有一种方法来获得MessageReactionRemoveEvent成员?

我到处寻找这个问题的解决方案,但我没有找到。如有任何帮助,不胜感激。

文档告诉您应该使用retrieveMemberById。

然而,你甚至不需要一个成员来删除/添加角色,因为removeRoleFromMember可以直接接受getUserIdLong的id。

需要指出的另一件重要的事情是,您将id(一个数字)与这里的equalsIgnoreCase进行比较。别这样,数字没有大小写。你应该用event.getMessageIdLong() == Main.rolesMessageId代替。不要存储JDA实体,因为您无法控制它们的实体生存期。

我实际上找到了一个解决这个问题的方法。

代替:

Member member = guild.getMemberById(id);

你必须这样做:

Member member = JDA.retrieveUserById(id).complete();

你需要为用户做同样的事情。

最新更新