Denes Garda
Denes Garda

Reputation: 127

Discord Java JDA - Getting the member in MessageReactionRemoveEvent

I'm trying to create a discord bot, and I need a specific action to be performed when someone un-reacts. Here is the method:

    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();
                }
            }
        }
    }

The problem is that event.getMember returns null. I figured I would try my best to get around this, so I did the following:

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

After some troubleshooting, I found out that the string id is the correct user id, but guild.getMemberById(id) still returns null. I also tried some other variations to see if anything would work, but the same thing happened every time. Everything was fine until I had to convert it into a member.

Is there a way to get the member in MessageReactionRemoveEvent?

I looked for the solution to this problem everywhere, but I couldn't find it. Any help would be appreciated.

Upvotes: 0

Views: 1252

Answers (2)

Denes Garda
Denes Garda

Reputation: 127

I actually found a fix to this.

Instead of:

Member member = guild.getMemberById(id);

You have to do:

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

You need to do the same for users.

Upvotes: 0

Minn
Minn

Reputation: 6134

The documentation tells you to use retrieveMemberById instead.

However, you don't even need a member to remove/add roles since removeRoleFromMember can just accept the id from getUserIdLong.

Another important thing to point out is that you compare an id, which is a number, with equalsIgnoreCase here. Don't do that, numbers have no casing. You should use event.getMessageIdLong() == Main.rolesMessageId instead. Don't store JDA entities because you have no control over their Entity Lifetimes.

Upvotes: 2

Related Questions