我正在尝试创建一个不和谐的机器人,我需要一个特定的行动,当有人不反应时执行。方法如下:
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();
你需要为用户做同样的事情。