私は、ギルドメンバーがメッセージにリアクションを追加/削除するときにロールを追加/削除し、トリガーが発生したときにすべてのメンバーを特定のロールから削除するディスコードボットを作成しようとしています。
私はやるたびevent.getmember
のためonMessageReactionRemove
のイベントは、私は常に何らかの理由でヌルを取得します。特定の役割を持つすべてのメンバーを取得してリストに追加しようとすると、ボット自体のみがリストに表示されます。ボットが特定のロールからすべてのメンバーを削除しようとしたときにも、エラーは発生しません。このボットを1日前に動作させましたが、なぜ今は動作しないのかわかりません。
ドキュメントでは、ユーザーがギルドにいない場合は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:ムーアフーンがコメントで述べたことは、他の問題を解決するのに役立ちました。ボットがメンバーをボイスチャットにキャッシュするだけで、特定の役割を持つメンバーを取得できなかった問題。
event.getUserId()
代わりに使用してください。Discordはリアクション削除のメンバー情報を提供していません。このremoveRoleFromMember
メソッドはユーザーIDも受け入れます:removeRoleFromMember(String、Role)
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加