0

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

    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("\uD83C\uDDE6")) {
                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("\uD83C\uDDE7")) {
                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("\uD83C\uDDE8")) {
                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("\uD83C\uDDE9")) {
                Role role = event.getGuild().getRolesByName("4", true).get(0);
                if(member.getRoles().contains(role)) {
                    guild.removeRoleFromMember(member, role).queue();
                }
            }
        }
    }

问题是 event.getMember 返回 null。我想我会尽力解决这个问题,所以我做了以下事情:

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

经过一番故障排除,我发现字符串 id 是正确的用户 id,但 guild.getMemberById(id) 仍然返回 null。我还尝试了其他一些变化,看看是否有任何效果,但每次都发生同样的事情。一切都很好,直到我不得不将其转换为成员。

有没有办法在 MessageReactionRemoveEvent 中获取成员?

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

4

2 回答 2

2

文档告诉您改用retrieveMemberById

但是,您甚至不需要成员来删除/添加角色,因为removeRoleFromMember可以只接受来自getUserIdLong的 id 。

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

于 2021-03-03T23:31:43.683 回答
0

我实际上找到了解决此问题的方法。

代替:

Member member = guild.getMemberById(id);

你所要做的:

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

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

于 2021-03-04T19:36:51.160 回答