Reputation: 127
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
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
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