【问题标题】:Discord Java JDA - Getting the member in MessageReactionRemoveEventDiscord Java JDA - 在 MessageReactionRemoveEvent 中获取成员
【发布时间】:2021-06-02 13:03:29
【问题描述】:

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

    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 中获取成员?

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

【问题讨论】:

    标签: java discord


    【解决方案1】:

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

    代替:

    Member member = guild.getMemberById(id);
    

    你必须这样做:

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

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

    【讨论】:

      【解决方案2】:

      documentation 告诉您改用retrieveMemberById

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

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

      【讨论】:

        猜你喜欢
        • 2021-05-05
        • 2020-07-28
        • 2019-05-06
        • 2020-07-31
        • 2020-12-12
        • 2021-05-07
        • 2020-10-17
        相关资源
        最近更新 更多