# TeamSpeak API getDatabaseId in TextMessageEvent



## MitoCode (29. Jan 2019)

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:



```
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 (29. Jan 2019)

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.


----------



## MitoCode (29. Jan 2019)

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


```
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 (29. Jan 2019)

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


----------



## MitoCode (29. Jan 2019)

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


----------



## Robat (29. Jan 2019)

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


----------



## MitoCode (29. Jan 2019)

Ja, ClientID und DatabaseID stimmen. Der Bot schreibt einen an, wenn man connected:

```
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) {
                   
                }
            }
```


----------



## Robat (29. Jan 2019)

In welcher Zeile flieg die NPE denn?


----------



## MitoCode (29. Jan 2019)

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 (29. Jan 2019)

Schreib im äußersten catch Block mal

```
ex.printStackTrace();
```
Anstatt 
	
	
	
	





```
System.out.println(ex);
```


----------



## MitoCode (29. Jan 2019)

Also, wenn dann etwas anderes da stehen sollte, dann ist das nicht der Fall. :/


----------



## Robat (29. Jan 2019)

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


----------



## mihe7 (30. Jan 2019)

Mal was ganz anderes. Dein Code wiederholt mehrfach die folgenden Zeilen, die sich nur in den Parametern unterscheiden:

```
try {
    Load.api.addClientToServerGroup(140, info.getDatabaseId());
} catch (Exception ex) {
    Load.api.removeClientFromServerGroup(140, info.getDatabaseId());
}
```
Das kann man wunderbar in eine Methode auslagern:

```
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:

```
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:

```
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:

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


----------



## MitoCode (1. Feb 2019)

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:

```
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:


```
//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 (1. Feb 2019)

In beiden Fällen tritt die NPE an der selben Stelle auf:

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


----------



## MitoCode (1. Feb 2019)

Aber wieso? Ich erkenne keinen Fehler. An der Stelle ist

```
ClientInfo info = api.getClientInfo(userid);
```


----------



## mihe7 (1. Feb 2019)

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.


----------



## mihe7 (1. Feb 2019)

Änder mal so ab:

```
// int userid = 0;
        int userid = e.getClientId();
        ...
```


----------



## MitoCode (1. Feb 2019)

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

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


----------



## MitoCode (1. Feb 2019)

mihe7 hat gesagt.:


> Änder mal so ab:
> 
> ```
> // int userid = 0;
> ...


Er würde an der Stelle nur getTargetClientId() zulassen, was allerdings keine Exception behebt.

MfG


----------



## MitoCode (1. Feb 2019)

Also ich erhalte schon mal keine Exceptions beim ClientJoinEvent, da ich im TextMessageEvent folgendes geändert habe:

```
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:

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


----------



## mihe7 (1. Feb 2019)

MitoCode hat gesagt.:


> A "servergroupdelclient" command


Fraglich wäre für mich, wieso da del steht.


----------



## MitoCode (4. Feb 2019)

Gute Frage...


----------

