Java JDA事件获取程序返回null&;让角色中的所有成员只返回bot本身

Java JDA事件获取程序返回null&;让角色中的所有成员只返回bot本身,java,discord-jda,Java,Discord Jda,我正在尝试创建一个discord bot,当公会成员从消息中添加/删除反应时,它会从公会成员中添加/删除角色,当触发时,它会从特定角色中删除所有成员 每次对onMessageActionRemove事件执行event.getmember时,由于某种原因,我总是得到null。当我尝试获取具有特定角色的所有成员并将其放入列表中时,我只会将bot本身放入列表中。当bot试图从特定角色中删除所有成员时,我也没有收到任何错误。我一天前让这个机器人开始工作,但我不知道为什么它现在不工作 在文档中,它说如果用

我正在尝试创建一个discord bot,当公会成员从消息中添加/删除反应时,它会从公会成员中添加/删除角色,当触发时,它会从特定角色中删除所有成员

每次对
onMessageActionRemove
事件执行
event.getmember
时,由于某种原因,我总是得到null。当我尝试获取具有特定角色的所有成员并将其放入列表中时,我只会将bot本身放入列表中。当bot试图从特定角色中删除所有成员时,我也没有收到任何错误。我一天前让这个机器人开始工作,但我不知道为什么它现在不工作

在文档中,它说如果用户不再在公会中,它将返回null,但是当我删除一个反应时,我仍然在公会中

以下是当bot尝试获取已删除反应的成员时的错误消息,当bot尝试从成员中删除角色时,将触发此错误:

[JDA MainWS-ReadThread] ERROR JDA - One of the EventListeners had an uncaught exception
java.lang.IllegalArgumentException: Member may not be null
    at net.dv8tion.jda.internal.utils.Checks.notNull(Checks.java:64)
    at net.dv8tion.jda.internal.entities.GuildImpl.removeRoleFromMember(GuildImpl.java:1209)
    at me.david.tskmanager.eventlisteners.EventChannelsEventListener.onMessageReactionRemove(EventChannelsEventListener.java:47)
    at net.dv8tion.jda.api.hooks.ListenerAdapter.onEvent(ListenerAdapter.java:440)
    at net.dv8tion.jda.api.hooks.InterfacedEventManager.handle(InterfacedEventManager.java:96)
    at net.dv8tion.jda.internal.hooks.EventManagerProxy.handleInternally(EventManagerProxy.java:82)
    at net.dv8tion.jda.internal.hooks.EventManagerProxy.handle(EventManagerProxy.java:69)
    at net.dv8tion.jda.internal.JDAImpl.handleEvent(JDAImpl.java:150)
    at net.dv8tion.jda.internal.handle.MessageReactionHandler.onRemove(MessageReactionHandler.java:200)
    at net.dv8tion.jda.internal.handle.MessageReactionHandler.handleInternally(MessageReactionHandler.java:146)
    at net.dv8tion.jda.internal.handle.SocketHandler.handle(SocketHandler.java:36)
    at net.dv8tion.jda.internal.requests.WebSocketClient.onDispatch(WebSocketClient.java:947)
    at net.dv8tion.jda.internal.requests.WebSocketClient.onEvent(WebSocketClient.java:834)
    at net.dv8tion.jda.internal.requests.WebSocketClient.handleEvent(WebSocketClient.java:812)
    at net.dv8tion.jda.internal.requests.WebSocketClient.onBinaryMessage(WebSocketClient.java:985)
    at com.neovisionaries.ws.client.ListenerManager.callOnBinaryMessage(ListenerManager.java:385)
    at com.neovisionaries.ws.client.ReadingThread.callOnBinaryMessage(ReadingThread.java:276)
    at com.neovisionaries.ws.client.ReadingThread.handleBinaryFrame(ReadingThread.java:996)
    at com.neovisionaries.ws.client.ReadingThread.handleFrame(ReadingThread.java:755)
    at com.neovisionaries.ws.client.ReadingThread.main(ReadingThread.java:108)
    at com.neovisionaries.ws.client.ReadingThread.runMain(ReadingThread.java:64)
    at com.neovisionaries.ws.client.WebSocketThread.run(WebSocketThread.java:45)
这是我的密码:

@Override
    public void onMessageReactionRemove(@Nonnull MessageReactionRemoveEvent event) {
        System.out.println(event.getMember());
        if (trackedMessages.contains(event.getMessageId()) && event.getReactionEmote().getEmote().equals(event.getGuild().getEmoteById(emoteID))) {
            GuildCache cache = GuildCache.getCache(event.getGuild().getId());
            System.out.println(cache.getAttendingEventRole());
            event.getGuild().removeRoleFromMember(event.getMember(), cache.getAttendingEventRole()).queue();
        }
    }

    @Override
    public void onMessageUpdate(@Nonnull MessageUpdateEvent event) {
        if (trackedMessages.contains(event.getMessageId()) && event.getMessage().getContentRaw().startsWith("[FINISHED]")) {
            GuildCache cache = GuildCache.getCache(event.getGuild().getId());
            List<Member> members = new ArrayList<>();
            members.addAll(event.getGuild().getMembersWithRoles(cache.getAttendingEventRole()));
            for (Member member : members) {
                event.getGuild().removeRoleFromMember(member, cache.getAttendingEventRole()).queue();
                System.out.println("removed role");
            }
            trackedMessages.remove(event.getMessageId());
        }
    }
@覆盖
MessageActionRemove(@Nonnull MessageReactionRemoveEvent事件)上的公共无效{
System.out.println(event.getMember());
if(trackedMessages.contains(event.getMessageId())&&event.getReactionMote().getEmote().equals(event.getGuild().getEmoteById(emoteID))){
GuidCache=GuildCache.getCache(event.getGuild().getId());
System.out.println(cache.getAttentingEventRole());
event.getGuild().removolefrommember(event.getMember(),cache.getAttentingEventRole()).queue();
}
}
@凌驾
消息更新时公共无效(@Nonnull MessageUpdateEvent事件){
if(trackedMessages.contains(event.getMessageId())&&event.getMessage().getContentRaw().startsWith(“[FINISHED]”){
GuidCache=GuildCache.getCache(event.getGuild().getId());
列表成员=新的ArrayList();
members.addAll(event.getGuild().getMembersWithRoles(cache.getAttentingEventRole());
代表(成员:成员){
event.getGuild().removolefrommmember(成员,cache.getAttentingEventRole()).queue();
System.out.println(“删除的角色”);
}
remove(event.getMessageId());
}
}
如果您需要更多的代码片段,只需注释所需内容即可

EDIT:解决了
事件.getMember
仅返回null的问题


编辑2:所以穆尔胡恩在评论中说的话帮助我解决了另一个问题。问题是,bot仅在语音聊天中缓存成员,因此无法获取具有特定角色的成员。

请改用
event.getUserId()
。Discord不为reaction remove提供成员信息。
RemoveOleFromMember
方法还接受用户ID:

您可以查看网关意图。我不知道这到底能帮我解决问题@moorhuh您可以只使用
event.getUserId()
而不是可为空的成员。好了,现在问题解决了,我只需要解决方法
getMembersWithRoles
只获取bot本身的问题。