TeamSpeak API getDatabaseId in TextMessageEvent

M

MitoCode

Gast
Ich hänge ein wenig bei meinem Bot für TeamSpeak... Clients, welche sich mit dem Server verbinden, werden angeschrieben, um ein Menü zu erhalten, indem sie auswählen können, welchen Rang sie haben möchten. Hier hänge ich nur bei der DatabaseId des Clients. Ich habe mal einen Ausschnitt vom Code hier:


Java:
public void onTextMessage(TextMessageEvent e) {
                int cid = 0;
                ClientInfo info = api.getClientInfo(cid);
                try {
                    if (e.getTargetMode() == TextMessageTargetMode.CLIENT) {
                        String msg = e.getMessage();
                        if (msg.equalsIgnoreCase("ruhe")) {
                            try {
                            Load.api.addClientToServerGroup(140, info.getDatabaseId());
                            }
                            catch (Exception ex) {
                                Load.api.removeClientFromServerGroup(140, info.getDatabaseId());
                            }
                        }
                        else if (msg.equalsIgnoreCase("nopoke")) {
                            try {
                            Load.api.addClientToServerGroup(142, info.getDatabaseId());
                            }
                            catch (Exception ex) {
                            Load.api.removeClientFromServerGroup(142, info.getDatabaseId());
                            }
                        }
                        else if (msg.equalsIgnoreCase("nomove")) {
                            try {
                            Load.api.addClientToServerGroup(197, info.getDatabaseId());
                            }
                            catch (Exception ex) {
                                Load.api.removeClientFromServerGroup(197, info.getDatabaseId());
                                }
                        }
                        else if (msg.equalsIgnoreCase("afkprotect")) {
                            try {
                            Load.api.addClientToServerGroup(207, info.getDatabaseId());
                            }
                            catch (Exception ex) {
                                Load.api.removeClientFromServerGroup(207, info.getDatabaseId());
                                }
                        }
                    }
                }
                catch (Exception ex) {
                    System.out.println(ex);
                }
            }

Wenn ein Client connected, gibt es viele Fehler... Ich habe das einmal ohne getDatabaseId gemacht und nur dem neu verbundenen Client eine Servergruppe hinzugefügt. Macht natürlich keinen Sinn, da dann jeder Client dem neu verbundenen Client eine Gruppe zuweisen bzw. entfernen kann...


Könnte mir da jemand helfen?

MfG
 

Robat

Top Contributor
Nicht das ich mich mit der Teamspeak API auskennen würde, aber vielleicht hilft es ja, wenn du uns den/die konkreten Exceptions mal mitteilst.
 
M

MitoCode

Gast
Also mit folgendem Code erhalte ich eine Java.Lang.NullPointerException:

Java:
public void onTextMessage(TextMessageEvent e) {
                try {
                    int userid = 0;
                    ClientInfo info = api.getClientInfo(userid);
                    if (e.getTargetMode() == TextMessageTargetMode.CLIENT) {
                        String msg = e.getMessage();
                        if (msg.equalsIgnoreCase("ruhe")) {
                            try {
                            Load.api.addClientToServerGroup(140, info.getDatabaseId());
                            }
                            catch (Exception ex) {
                                Load.api.removeClientFromServerGroup(140, info.getDatabaseId());
                            }
                        }
                        else if (msg.equalsIgnoreCase("nopoke")) {
                            try {
                            Load.api.addClientToServerGroup(142, info.getDatabaseId());
                            }
                            catch (Exception ex) {
                            Load.api.removeClientFromServerGroup(142, info.getDatabaseId());
                            }
                        }
                        else if (msg.equalsIgnoreCase("nomove")) {
                            try {
                            Load.api.addClientToServerGroup(197, info.getDatabaseId());
                            }
                            catch (Exception ex) {
                                Load.api.removeClientFromServerGroup(197, info.getDatabaseId());
                                }
                        }
                        else if (msg.equalsIgnoreCase("afkprotect")) {
                            try {
                            Load.api.addClientToServerGroup(207, info.getDatabaseId());
                            }
                            catch (Exception ex) {
                                Load.api.removeClientFromServerGroup(207, info.getDatabaseId());
                                }
                        }
                    }
                }
                catch (Exception ex) {
                    System.out.println(ex);
                }
            }
 

Robat

Top Contributor
Gibt es denn einen User mit der UserId = 0?
Möchtest du nicht vielleicht eher sagen int userId = e.getTargetClientId() oder so ähnlich?
 
M

MitoCode

Gast
Stimmt ._.
Ich habe es durch int userid = e.getTargetClientId(); ersetzt, aber es kommt immer noch die selbe Exception... :/
 
Zuletzt bearbeitet von einem Moderator:

Robat

Top Contributor
Hast du mal geschaut ob der User existiert bzw lass dir die userId mal ausgeben und schau ob es die richtige ist
 
M

MitoCode

Gast
Ja, ClientID und DatabaseID stimmen. Der Bot schreibt einen an, wenn man connected:
Java:
public void onClientJoin(ClientJoinEvent e) {
                try {
                    System.out.println(e.getClientDatabaseId());
                    System.out.println(e.getClientId());
                    com.github.theholywaffle.teamspeak3.api.wrapper.Client c = Load.api.getClientInfo(e.getClientId());
                    Load.api.sendPrivateMessage(c.getId(), "\n\t[b]*** Systemchat geöffnet ***[/b]\n\n"
                            + "\tTippe [b]ruhe[/b], [b]nopoke[/b], [b]nomove[/b] oder [b]afkprotect[/b] um diese Ränge zu erhalten bzw. zu entfernen.\n"
                            + "\tDie Erklärungen dieser Ränge findest du in der Beschreibung der Lobby.");
                }
                catch (Exception ex) {
                   
                }
            }
 
M

MitoCode

Gast
Das steht nicht da.. Ich arbeite btw. nicht lange mit Java oder Eclipse, daher weiß ich nicht, wie ich herausfinden kann, wo der Code knallt... Es steht auf jeden Fall immer nur NPE da. Keine Zeile, keine Date, nichts.
?
 

Robat

Top Contributor
Schreib im äußersten catch Block mal
Java:
ex.printStackTrace();
Anstatt
Java:
 System.out.println(ex);
 

Robat

Top Contributor
Dann musst du anders, übers debuggen oder Konsolenausgabe, herausfinden, was null ist. Wenn du das hast musst du herausfinden warum es null ist
 

mihe7

Top Contributor
Mal was ganz anderes. Dein Code wiederholt mehrfach die folgenden Zeilen, die sich nur in den Parametern unterscheiden:
Java:
try {
    Load.api.addClientToServerGroup(140, info.getDatabaseId());
} catch (Exception ex) {
    Load.api.removeClientFromServerGroup(140, info.getDatabaseId());
}
Das kann man wunderbar in eine Methode auslagern:
Java:
private void addToServerGroup(int groupId, int dbId) {
    try {
        Load.api.addClientToServerGroup(groupId, dbId);
    } catch (Exception ex) {
        Load.api.removeClientFromServerGroup(groupId, dbId);
    }
Dann solltest Du Dir überlegen, ob es wirklich eine gute Idee ist, allgemeine Exception-Objekte abzufangen. Unabhängig davon reduziert sich Dein Code oben mit dieser Methode zu:
Java:
            public void onTextMessage(TextMessageEvent e) {
                try {
                    int userid = 0;
                    ClientInfo info = api.getClientInfo(userid);
                    if (e.getTargetMode() == TextMessageTargetMode.CLIENT) {
                        String msg = e.getMessage();
                        int dbId = info.getDatabaseId();
                        if (msg.equalsIgnoreCase("ruhe")) {
                            addToServerGroup(140, dbId);
                        } else if (msg.equalsIgnoreCase("nopoke")) {
                            addToServerGroup(142, dbId);
                        } else if (msg.equalsIgnoreCase("nomove")) {
                            addToServerGroup(197, dbId);
                        } else if (msg.equalsIgnoreCase("afkprotect")) {
                            addToServerGroup(207, dbId);
                        }
                    }
                }
                catch (Exception ex) {
                    ex.printStackTrace();
                }
            }
Und wenn Du lustig bist, dann initialisiert Du in Deiner Klasse noch eine Map:
Java:
private static final Map<String,Integer> messageToGroup = new HashMap<String,Integer>();
static {
    messageToGroup.put("ruhe", 140);
    messageToGroup.put("nopoke", 142);
    messageToGroup.put("nomove", 197);
    messageToGroup.put("afkprotect", 207);
}
Dann reduziert sich Dein Code zu:
Java:
            public void onTextMessage(TextMessageEvent e) {
                try {
                    int userid = 0;
                    ClientInfo info = api.getClientInfo(userid);
                    if (e.getTargetMode() == TextMessageTargetMode.CLIENT) {
                        String msg = e.getMessage();
                        int dbId = info.getDatabaseId();
                        Integer groupId = messageToGroup.get(msg.toLowerCase());
                        if (groupId != null) {
                            addToServerGroup(groupId, dbId);
                        }
                    }
                } catch (Exception ex) {
                    ex.printStackTrace();
                }
            }
 
M

MitoCode

Gast
Hallo @mihe7,
erstmal vielen Dank für deine Hilfe!
Ich habe das ganze jetzt einmal ohne Map gemacht... Exceptions sind noch immer vorhanden. Ich denke, es wäre eine bessere Idee, den ganzen Code zu schicken, vielleicht sind noch woanders Fehler.
Zuerst der Code:
Java:
package de.community4friends.Events;

import com.github.theholywaffle.teamspeak3.TS3Api;
import com.github.theholywaffle.teamspeak3.TS3Config;
import com.github.theholywaffle.teamspeak3.TS3Query;
import com.github.theholywaffle.teamspeak3.api.TextMessageTargetMode;
import com.github.theholywaffle.teamspeak3.api.event.ChannelCreateEvent;
import com.github.theholywaffle.teamspeak3.api.event.ChannelDeletedEvent;
import com.github.theholywaffle.teamspeak3.api.event.ChannelDescriptionEditedEvent;
import com.github.theholywaffle.teamspeak3.api.event.ChannelEditedEvent;
import com.github.theholywaffle.teamspeak3.api.event.ChannelMovedEvent;
import com.github.theholywaffle.teamspeak3.api.event.ChannelPasswordChangedEvent;
import com.github.theholywaffle.teamspeak3.api.event.ClientJoinEvent;
import com.github.theholywaffle.teamspeak3.api.event.ClientLeaveEvent;
import com.github.theholywaffle.teamspeak3.api.event.ClientMovedEvent;
import com.github.theholywaffle.teamspeak3.api.event.PrivilegeKeyUsedEvent;
import com.github.theholywaffle.teamspeak3.api.event.ServerEditedEvent;
import com.github.theholywaffle.teamspeak3.api.event.TS3EventAdapter;
import com.github.theholywaffle.teamspeak3.api.event.TS3EventType;
import com.github.theholywaffle.teamspeak3.api.event.TS3Listener;
import com.github.theholywaffle.teamspeak3.api.event.TextMessageEvent;
import com.github.theholywaffle.teamspeak3.api.wrapper.Client;
import com.github.theholywaffle.teamspeak3.api.wrapper.ClientInfo;

import de.community4friends.Main.Load;

public class Event {
    public static int cdbid = 0;
    public static final TS3Config config = new TS3Config();
    public static final TS3Query query = new TS3Query(config);
    public static final TS3Api api = query.getApi();
    public static void loadEvents() {
        Load.api.registerAllEvents();
        Load.api.registerEvent(TS3EventType.TEXT_PRIVATE);
        Load.api.addTS3Listeners(new TS3EventAdapter() {});
        Load.api.addTS3Listeners(new TS3Listener() {

            @Override
            public void onChannelCreate(ChannelCreateEvent e) {
               
               
            }

            @Override
            public void onChannelDeleted(ChannelDeletedEvent arg0) {
                // TODO Auto-generated method stub
               
            }

            @Override
            public void onChannelDescriptionChanged(ChannelDescriptionEditedEvent arg0) {
                // TODO Auto-generated method stub
               
            }

            @Override
            public void onChannelEdit(ChannelEditedEvent arg0) {
                // TODO Auto-generated method stub
               
            }

            @Override
            public void onChannelMoved(ChannelMovedEvent arg0) {
                // TODO Auto-generated method stub
               
            }

            @Override
            public void onChannelPasswordChanged(ChannelPasswordChangedEvent arg0) {
                // TODO Auto-generated method stub
               
            }

            @Override
            public void onClientLeave(ClientLeaveEvent arg0) {
                // TODO Auto-generated method stub
               
            }

            @Override
            public void onClientMoved(ClientMovedEvent arg0) {
                // TODO Auto-generated method stub
               
            }

            @Override
            public void onPrivilegeKeyUsed(PrivilegeKeyUsedEvent arg0) {
                // TODO Auto-generated method stub
               
            }

            @Override
            public void onServerEdit(ServerEditedEvent arg0) {
                // TODO Auto-generated method stub
               
            }

            @Override
            public void onClientJoin(ClientJoinEvent e) {
                try {
                    System.out.println(e.getClientDatabaseId());
                    System.out.println(e.getClientId());
                    Client c = Load.api.getClientInfo(e.getClientId());
                    Load.api.sendPrivateMessage(c.getId(), "\n\t[b]*** Systemchat geöffnet ***[/b]\n\n"
                            + "\tTippe [b]ruhe[/b], [b]nopoke[/b], [b]nomove[/b] oder [b]afkprotect[/b] um diese Ränge zu erhalten bzw. zu entfernen.\n"
                            + "\tDie Erklärungen dieser Ränge findest du in der Beschreibung der Lobby.");
                }
                catch (Exception ex) {
                   
                }
            }
           
            @Override
            public void onTextMessage(TextMessageEvent e) {
                try {
                    int userid = 0;
                    ClientInfo info = api.getClientInfo(userid);
                    if (e.getTargetMode() == TextMessageTargetMode.CLIENT) {
                        String msg = e.getMessage();
                        int dbId = info.getDatabaseId();
                        if (msg.equalsIgnoreCase("ruhe")) {
                            addToServerGroup(140, dbId);
                        } else if (msg.equalsIgnoreCase("nopoke")) {
                            addToServerGroup(142, dbId);
                        } else if (msg.equalsIgnoreCase("nomove")) {
                            addToServerGroup(197, dbId);
                        } else if (msg.equalsIgnoreCase("afkprotect")) {
                            addToServerGroup(207, dbId);
                        }
                    }
                }
                catch (Exception ex) {
                    ex.printStackTrace();
                }
            }
           
        });
    }
        private static void addToServerGroup(int groupId, int dbId) {
            try {
                Load.api.addClientToServerGroup(groupId, dbId);
            } catch (Exception ex) {
                Load.api.removeClientFromServerGroup(groupId, dbId);
            }
        }

}

Und hier noch die Exceptions:

Code:
//Tritt auf bei onClientJoin
java.lang.NullPointerException
    at com.github.theholywaffle.teamspeak3.TS3Query.doCommandAsync(TS3Query.java:226)
    at com.github.theholywaffle.teamspeak3.TS3ApiAsync.executeAndMapFirst(TS3ApiAsync.java:5442)
    at com.github.theholywaffle.teamspeak3.TS3ApiAsync.executeAndTransformFirst(TS3ApiAsync.java:5422)
    at com.github.theholywaffle.teamspeak3.TS3ApiAsync.getClientInfo(TS3ApiAsync.java:2220)
    at com.github.theholywaffle.teamspeak3.TS3Api.getClientInfo(TS3Api.java:1945)
    at de.community4friends.Events.Event$2.onTextMessage(Event.java:117)
    at com.github.theholywaffle.teamspeak3.api.event.TextMessageEvent.fire(TextMessageEvent.java:69)
    at com.github.theholywaffle.teamspeak3.EventManager$ListenerTask.run(EventManager.java:169)
    at com.github.theholywaffle.teamspeak3.TS3Query.lambda$submitUserTask$0(TS3Query.java:232)
    at java.util.concurrent.Executors$RunnableAdapter.call(Unknown Source)
    at java.util.concurrent.FutureTask.run(Unknown Source)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
    at java.lang.Thread.run(Unknown Source)

//Tritt auf bei onTextMessage
java.lang.NullPointerException
    at com.github.theholywaffle.teamspeak3.TS3Query.doCommandAsync(TS3Query.java:226)
    at com.github.theholywaffle.teamspeak3.TS3ApiAsync.executeAndMapFirst(TS3ApiAsync.java:5442)
    at com.github.theholywaffle.teamspeak3.TS3ApiAsync.executeAndTransformFirst(TS3ApiAsync.java:5422)
    at com.github.theholywaffle.teamspeak3.TS3ApiAsync.getClientInfo(TS3ApiAsync.java:2220)
    at com.github.theholywaffle.teamspeak3.TS3Api.getClientInfo(TS3Api.java:1945)
    at de.community4friends.Events.Event$2.onTextMessage(Event.java:117)
    at com.github.theholywaffle.teamspeak3.api.event.TextMessageEvent.fire(TextMessageEvent.java:69)
    at com.github.theholywaffle.teamspeak3.EventManager$ListenerTask.run(EventManager.java:169)
    at com.github.theholywaffle.teamspeak3.TS3Query.lambda$submitUserTask$0(TS3Query.java:232)
    at java.util.concurrent.Executors$RunnableAdapter.call(Unknown Source)
    at java.util.concurrent.FutureTask.run(Unknown Source)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
    at java.lang.Thread.run(Unknown Source)

MfG
 

mihe7

Top Contributor
In beiden Fällen tritt die NPE an der selben Stelle auf:
Code:
    at de.community4friends.Events.Event$2.onTextMessage(Event.java:117)

Zur Sicherheit: was steht bei Dir in dieser Zeile? (EDIT: in Zeile 117 von Event.java)
 
M

MitoCode

Gast
Aber wieso? Ich erkenne keinen Fehler. An der Stelle ist
Java:
ClientInfo info = api.getClientInfo(userid);
 

mihe7

Top Contributor
Gut, dann haben wir die gleiche Zeile. Ich muss meine schlampige Formulierung von oben korrigieren. Die NPE tritt natürlich nicht in dieser Zeile auf, sondern das ist die letzte Zeile Deines Codes, die vor dem Auftreten der NPE aufgerufen wird. Geworfen wird die NPE tatsächlich erst in Teamspeak (com.github.theholywaffle.teamspeak3.TS3Query.doCommandAsync(TS3Query.java:226))

Liegt vermutlich an den userId 0.
 
M

MitoCode

Gast
Also was heißt das konkret für mich? Was kann ich dagegen tun?
NOTE: Ich habe einmal dieses ClientInfo info Zeug raus genommen, dadurch wurde das
Code:
com.github.theholywaffle.teamspeak3.api.wrapper.ClientInfo;
entfernt und es gab nach onClientJoin keine Exception mehr. Irgendwie habe ich das Gefühl, dass sich die beiden Imports (also ClientInfo & Client) nicht vertragen..?
Wäre es denn auch möglich einfach in der Event.java das onClientCoin Event zu lassen und in einer anderen Klasse (zB. ranking.java) das onTextMessage Event zu haben? Dann würden beide Imports getrennt sein, falls das des Rätsels Lösung sein sollte..
 
M

MitoCode

Gast
Also ich erhalte schon mal keine Exceptions beim ClientJoinEvent, da ich im TextMessageEvent folgendes geändert habe:
Java:
try {
                    int userid = e.getTargetClientId();
                    ClientInfo info = Load.api.getClientInfo(userid); //Ursprünglich: api.getClientInfo(userid);
                    if (e.getTargetMode() == TextMessageTargetMode.CLIENT) {
                        String msg = e.getMessage();
                        int dbId = info.getDatabaseId();
                        if (msg.equalsIgnoreCase("nochat")) {
                            addToServerGroup(140, dbId);
                        } else if (msg.equalsIgnoreCase("nopoke")) {
                            addToServerGroup(142, dbId);
                        } else if (msg.equalsIgnoreCase("nomove")) {
                            addToServerGroup(197, dbId);
                        } else if (msg.equalsIgnoreCase("afkprotect")) {
                            addToServerGroup(207, dbId);
                        }
                    }
                }
                catch (Exception ex) {
                    ex.printStackTrace();
                }
Wenn ich jetzt zB "nochat" schreibe, folgender Fehler:
Code:
2019-02-01 14:19:08.092 [DEBUG] TS3 command error: {msg=empty result set, id=2563}
com.github.theholywaffle.teamspeak3.api.exception.TS3CommandFailedException: A "servergroupdelclient" command returned with a server error.
>> empty result set (ID 2563)
 
Ähnliche Java Themen

Ähnliche Java Themen

Neue Themen


Oben