Bitte den ganzen Stacktrace kopieren und nicht nur eine Zeile! Danke.
So kann man nur Raten. Evtl. eine IndexOutOfBounfs Exception weil du das erste Element einer leeren Liste haben willst.
Oder mentioned ist null und du hast eine NullPointerException bekommen.
[JDA MainWS-ReadThread] ERROR JDA -One of the EventListeners had an uncaught exception
java.lang.IndexOutOfBoundsException:Index:0
at java.base/java.util.Collections$EmptyList.get(Collections.java:4483)
at Commands.userinfo.onMessageReceived(userinfo.java:33)
at net.dv8tion.jda.api.hooks.ListenerAdapter.onEvent(ListenerAdapter.java:361)
at net.dv8tion.jda.api.hooks.InterfacedEventManager.handle(InterfacedEventManager.java:96)
at net.dv8tion.jda.internal.hooks.EventManagerProxy.handleInternally(EventManagerProxy.java:88)
at net.dv8tion.jda.internal.hooks.EventManagerProxy.handle(EventManagerProxy.java:70)
at net.dv8tion.jda.internal.JDAImpl.handleEvent(JDAImpl.java:164)
at net.dv8tion.jda.internal.handle.MessageCreateHandler.handleInternally(MessageCreateHandler.java:127)
at net.dv8tion.jda.internal.handle.SocketHandler.handle(SocketHandler.java:36)
at net.dv8tion.jda.internal.requests.WebSocketClient.onDispatch(WebSocketClient.java:957)
at net.dv8tion.jda.internal.requests.WebSocketClient.onEvent(WebSocketClient.java:844)
at net.dv8tion.jda.internal.requests.WebSocketClient.handleEvent(WebSocketClient.java:822)
at net.dv8tion.jda.internal.requests.WebSocketClient.onBinaryMessage(WebSocketClient.java:996)
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)
Ok, IndexOutOfBoundsException besagt, dass Du auf ein Element zugreifen willst, das es nicht gibt:
getActivities gibt also eine leere Liste zurück, damit gibt es an Index 0 kein Element und somit kommt die Exception.
Da ich keine Ahnung habe, das da in Activities überhaupt drin sein soll wenn das Event abgearbeitet wird, kann ich dazu nicht wirklich etwas sagen. Der Codeausschnitt ist auch viel zu klein. Vermutlich ist die aufgerufene Methode diese:
Also rein theoretisch gibt es zwei Möglichkeiten:
a) Es gab keinerlei Aktivitäten vom User (Das ist halt wichtig, sowas zu prüfen. Aber ggf. hast Du das irgendwo mit abgeprüft und an der Stelle gab es wirklich schon Aktivitäten des Users.)
b) Es gab Aktivitäten, aber die wurden nicht gemerkt, da Du das CachFlag nicht gesetzt hast. (Was dann aber auch noch mehr nach sich zieht - das erfährt man, wenn man da weiter durch die Doku geht!)
Generell ist es immer sehr schlecht, wenn man auf Listen einfach so zugreift ohne irgendwelche Prüfungen. Da wäre also eine Prüfung immer sinnvoll. Also z.B. etwas wie:
Java:
List<Activity> activities = mentioned.getActivities();if(activities.isEmpty()){// Hier etwas sinnvolles machen ...return;}Activity activity = activities.get(0);
Aber da uns weiterhin alle Details fehlen, was du wie machst wird es sehr schwer, Dir irgendwie sonst zu helfen.
Im Augenblick fehlt mir gerade schlicht der Ansatz, dir zu helfen. Da fehlt ja extrem viel. Programmieren funktioniert aus meiner Sicht nicht ohne sich im Detail auch mit der Programmiersprache zu beschäftigen.
Hast Du eigentlich ein ungefähres Verständnis, was der Code da macht?
Da liegt extrem viel am argen, das Du ggf. irgendwo gefunden hast und das zu funktionieren scheint ... aber das macht es nicht richtig und es bleibt schlicht sehr fehleranfällig.
Gehen wir es mal etwas durch:
a) Rollen prüfen: event.getMember().getRoles() gibt Dir eine List<Role> - daraus einfach einen String zu machen um da dann zu prüfen, ob da Team drin vorkommt ist einfach grob fahrlässig. Wenn es da eine Rolle Team gibt und irgend eine andere Rolle, die nur Team enthält, dann wird das auch angenommen. Das sollte man immer korrekt handhaben. Also z.B. durch etwas wie:
(Das ist jetzt aus dem Kopf geschrieben. Das wäre eine Stream Lösung, die halt nach der Rolle schaut. Kann man auch als eigenständige Methode schreiben:
Java:
publicstaticbooleanisInRoles(String name,List<Role> roles){for(Role role : roles){if(Object.equals(name, role.getName))returntrue;}returnfalse;}
b) event.getMessage().getMentions().getMembers().isEmpty() da schaust Du ja, ob irgendwelche Members erwähnt wurden. Das können ja auch mehrere sein. Da also nur ein "isEmpty()" abzuprüfen um da dann nichts zu tun, ist nicht zielführend. (Da könnte man die Bedingung negieren um dann denn leeren Block ganz los zu werden!)
Da könnte man also einfach eine Schleife machen:
Java:
for(Member member: event.getMessage().getMentions().getMembers()){// hier kannst Du dann etwas mit dem member machen... z.B. member.getOnlineStatus() abfragen.}
Somit könnte man in der Schleife auch die Nachrichten schreiben.
Das einfach nur einmal um paar Punkte zu nennen. Der Code ist ansonsten so im Forum geschrieben worden so dass da Tippfehler vorkommen können und ggf. ist der Code so auch nicht direkt übersetzbar. Aber der Code sollte zeigen, wie es prinzipiell gehen könnte.
Ok danke erstmal für das erklären. Prinzipell weiß ich was der Code macht nur kenne ich noch weit nicht alles in JDA und nutze vieles was ich im Internet sehe oder was man liest. Noch dazu bin ich noch Anfänger. Es wäre trotzdem schön. wenn ich nochmal eine Antwort bezüglich des Activity bekommen könnte.
Ich fürchte, dass es nicht so da steht und dass Du da etwas missverstanden hast.
Du hast eine main Routine, in der Du vermutlich mit dem JDABuilder etwas machst. Da könntest Du dann auch .enableCache(CacheFlag.ACTIVITY) mit aufrufen vor dem build.
Oder wenn Du mit ShardManagerBuilder arbeitest, dann würde es vermutlich da rein gehören.
Bei dem JDA Projekt bekommt man da einen kleinen Überblick:
Und GUILD_PRESENCES ist ähnlich. Das ist ja ein GatewayIntent, das beim JDABuilder auch mit angegeben werden kann / muss. Da ist dann ein Set<GatewayIntent> zu erstellen und dann zu übergeben.
Das ist das, was ich hier so bei einem Blick auf die Dokumentation sehe. Ich muss aber dazu sagen, dass ich noch nie etwas mit JDA und Discord gemacht habe und das daher nur Erkenntnisse vom reinen Überfliegen der Dokumentation sind.
Es ist hier halt wichtig zu verstehen, wo was passiert. Du bist da ja nur im Listener - da ist es doch auch schon viel zu spät, wenn es um die generelle Konfiguration geht.
Wenn Du mit dem Auto zum Baumarkt fährst, dann gibt es Dinge, da brauchst du zum Transport einen Anhänger.
Aber dann hängst Du den Anhänger doch an, ehe du zum Baumarkt startest. Und nicht erst, wenn Du da dann einladen willst. Denn der Anhänger Zuhause in der Garage nützt Dir nichts, wenn Du beim Baumarkt stehst.
Nur um es mal bildlich darzustellen.
Das GUILD_MESSAGES dürfte mindestes benötigt werden, damit der Bot Nachrichten bekommt. Sonst sieht er die Nachrichten nicht und kann daher auch nicht reagieren. https://ci.dv8tion.net/job/JDA/javadoc/net/dv8tion/jda/api/requests/GatewayIntent.html gibt auch kurze Erklärungen, denn ggf. willst Du ja auch direkte Nachrichten an den Bot oder so.
b) Zeig ruhig noch einmal den ganzen Code von Deinem Listener. Dann kann man schauen, ob da alles ok sein müsste.
(Das alles aber natürlich aus einer Position, dass ich auch nur einen groben Überblick über JDA durch die Dokumentation habe. Die Chance, dass ich falsch liege ist also durchaus nicht zu gering.)