Online Aktivität getten

FireHorses

Mitglied
Hallo zusammen
ich probiere gerade die Online Aktivität sprich Spielt/Streamt zu getten. Ich habe das ganze oben im Code so definiert
Java:
                Activity activity = mentioned.getActivities().get(0);
Schließlich wird es dann so
Code:
embed.addField("Online Aktivität:", activity.getType().name(), false);
dem Embed beigefügt. Wo ist der Fehler? Danke für jeden der sich das anschaut und darauf antwortet.
 

FireHorses

Mitglied
Meinst du das bin leider was das angeht noch ein Anfänger


Java:
import net.dv8tion.jda.api.EmbedBuilder;
import net.dv8tion.jda.api.entities.Activity;
import net.dv8tion.jda.api.entities.Member;
import net.dv8tion.jda.api.entities.Message;
import net.dv8tion.jda.api.events.message.MessageReceivedEvent;
import net.dv8tion.jda.api.hooks.ListenerAdapter;
 

FireHorses

Mitglied
Der Fehler ist das:
Java:
at Commands.userinfo.onMessageReceived(userinfo.java:31)
Code:
Die Zeile 31 ist:
Code:
 Activity activity = mentioned.getActivities().get(0);
 

KonradN

Super-Moderator
Mitarbeiter
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.
 

Jw456

Top Contributor
getActivities()
Wo bist du in einem Fragnent oder Activity?
In der Activity gibt es die Methode nicht.

getActivities() kenne ich auch nicht
Wenn dann nur getActivity()
 
Zuletzt bearbeitet:

FireHorses

Mitglied
Stacktrace:

Java:
[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)
 

KonradN

Super-Moderator
Mitarbeiter
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:

Die Dokumentation besagt also ganz klar:
If the user does not currently have any activity, this returns an empty list.

Weiterhin gibt es einen Hinweis:
This requires CacheFlag.ACTIVITY to be enabled!

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.
 

FireHorses

Mitglied
Java:
package Commands;

import net.dv8tion.jda.api.EmbedBuilder;
import net.dv8tion.jda.api.entities.Activity;
import net.dv8tion.jda.api.entities.Member;
import net.dv8tion.jda.api.entities.Message;
import net.dv8tion.jda.api.events.message.MessageReceivedEvent;
import net.dv8tion.jda.api.hooks.ListenerAdapter;

import java.time.OffsetDateTime;
import java.util.List;
import java.util.concurrent.TimeUnit;

public class userinfo extends ListenerAdapter {
    protected Member mentioned;
    public  void onMessageReceived(MessageReceivedEvent event) {

        if (event.getMessage().getContentStripped().startsWith("!userinfo")) {
            String roles = String.valueOf(event.getMember().getRoles());
            if (roles.contains("Team")) {
                if (event.getMessage().getMentions().getMembers().isEmpty()) {
                  
                } else {

                    EmbedBuilder embed = new EmbedBuilder();
                    
                    embed.addField("Online Status:", mentioned.getOnlineStatus().toString(), true);
                    embed.addField("Aktivität:", activity.getName(), true);
                    event.getChannel().sendMessageEmbeds(embed.build()).complete();

                }
            }
        }
    }
}

Es wäre auch cool wenn ihr mir beim getOnlineStatus nochmal helfen könntet.
 

KonradN

Super-Moderator
Mitarbeiter
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:
Java:
event.getMember().getRoles().stream()
    .filter(r -> "Team".equals(r.getName()))
    .findAny().isPresent();
(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:
public static boolean isInRoles(String name, List<Role> roles) {
    for (Role role : roles) {
        if (Object.equals(name, role.getName)) return true;
    }
    return false;
}

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.
 

FireHorses

Mitglied
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.
 

KonradN

Super-Moderator
Mitarbeiter
Du hast da doch in #9 einen Ansatz zu bekommen, von dem Du bisher nichts übernommen hast und auf das du bisher nicht wirklich reagiert hast.
 

FireHorses

Mitglied
Ok danke nochmal
Ich habe jetzt das oben eingefügt:
Java:
public class userinfo extends ListenerAdapter {
    public static final GatewayIntent GUILD_PRESENCES;
    public static CacheFlag ACTIVITY;
    public  void onMessageReceived(MessageReceivedEvent event) {
So steht es unter https://ci.dv8tion.net/job/JDA/javadoc/net/dv8tion/jda/api/utils/cache/CacheFlag.html#ACTIVITY
Nun ist der Fehler entstanden:
Code:
Variable 'GUILD_PRESENCES' might not have been initialized
 

KonradN

Super-Moderator
Mitarbeiter
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:
speziell mit

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.
 

FireHorses

Mitglied
Danke ich habe jetzt die beiden Sachen im JDA Builder registriert und habe im Developer Tool es allowed. Der Bot startet ohne Probleme.
Java:
JDABuilder bauplan = JDABuilder.createDefault(token, GatewayIntent.GUILD_PRESENCES);

        bauplan.setStatus(OnlineStatus.ONLINE);
        bauplan.setActivity(Activity.watching(status));
        bauplan.enableCache(CacheFlag.ACTIVITY);
        bauplan.addEventListeners(new userinfo());
JDA bot = bauplan.build();
Nun habe ich trotzdem das Problem, das der Bot durch diese Zeile
Code:
embed.addField("Online Status:", member.getOnlineStatus().toString(), false);
nicht antwortet(!userinfo @user)
 

KonradN

Super-Moderator
Mitarbeiter
a) Der Intent alleine dürfte nicht reichen. Du willst ja mehrere Intents haben. Also vermutlich etwas wie:
Java:
JDABuilder bauplan = JDABuilder.createDefault(token, Set.of(GatewayIntent.GUILD_PRESENCES, GatewayIntent.GUILD_MESSAGES))

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.)
 

FireHorses

Mitglied
ich habe es jetzt hinbekommen
Java:
JDABuilder bauplan = JDABuilder.createDefault(token);

        bauplan.setStatus(OnlineStatus.ONLINE);
        bauplan.setActivity(Activity.watching(status));
        bauplan.enableCache(CacheFlag.ACTIVITY);
        bauplan.enableCache(CacheFlag.ONLINE_STATUS);
        bauplan.enableIntents(GatewayIntent.GUILD_PRESENCES);
JDA bot = bauplan.build();
So funktioniert das ganze jetzt Danke an sie @KonradN das sie mir geholfen haben.
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
Q Möglichkeit Online-Programmieren üben. Allgemeine Java-Themen 9
V Compiler-Fehler Online Compiler Probleme Allgemeine Java-Themen 4
A Kein Online-Zugang mögl.! Allgemeine Java-Themen 4
L Benutzbarkeit kryptografischer APIs - Online Studie Allgemeine Java-Themen 3
R Android Daten online senden Allgemeine Java-Themen 0
J Java Projekt, Online-Datenabfrage, Visualisierung Allgemeine Java-Themen 3
S HTTP Online-Konfigurator Allgemeine Java-Themen 9
L Java Applet - ClassNotFound online, offline korrekt Allgemeine Java-Themen 13
H Problem mit Applet (online / offline) Allgemeine Java-Themen 8
S ID3-Tag eines Online-Radios auslesen Allgemeine Java-Themen 28
pg1337 Übungsaufgabe Online Shop Allgemeine Java-Themen 21
eskimo328 Offline/Online Web-Anwendung, Datensynchronisation etc. Allgemeine Java-Themen 9
T Online-Hilfe Allgemeine Java-Themen 3
S Applet funktioniert online - nur nicht lokal..? Allgemeine Java-Themen 2
B PrintService - Wie prüfen ob Drucker online ist? Allgemeine Java-Themen 2
S Datum einer Datei online? Allgemeine Java-Themen 6
B ZipDatei direkt online auslesen? Allgemeine Java-Themen 8
Z GWT Online Shop erstellen ? Allgemeine Java-Themen 3
W Suche ein Applet zur Bildbearbeitung online Allgemeine Java-Themen 4
Chucky Java Buch - nur welches? online oder kaufbuch? Allgemeine Java-Themen 18
O Threads Aktivität anzeigen... Allgemeine Java-Themen 5
X CPU Cores, CPU Speed und GPU getten Allgemeine Java-Themen 3

Ähnliche Java Themen

Neue Themen


Oben