JDA事件获取器返回null并让角色中的所有成员仅返回漫游器本身

时间:2020-09-17 19:23:59

标签: java discord-jda

我正在尝试创建一个Discord机器人,该机器人在公会成员添加/删除消息中的响应时会添加/删除行会成员的角色,并在触发时将所有成员从特定角色中删除。

每次我为event.getmember事件执行onMessageReactionRemove时,由于某种原因,我总是得到null。当我还尝试获取具有特定角色的所有成员并将其放在列表中时,我只会在列表中看到机器人本身。当漫游器尝试从特定角色中删除所有成员时,我也没有收到任何错误。我一天前就可以使用该机器人了,但是我不知道为什么它现在不起作用。

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

以下是机器人试图获取删除反应成员的错误消息,当机器人试图从成员中删除角色时会触发此错误:

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

如果您需要更多代码段,只需注释一下您需要的内容。

编辑:解决了event.getMember仅返回null的问题。

编辑2 :因此,Moorhuhn在评论中所说的内容帮助我解决了另一个问题。该僵尸程序只在语音聊天中缓存成员,从而无法让成员扮演特定角色的问题。

1 个答案:

答案 0 :(得分:0)

改为使用event.getUserId()。 Discord不提供会员信息以用于删除反应。 removeRoleFromMember方法还接受用户ID:removeRoleFromMember(String, Role)