Befehl mit argumenten

Started by Darkandro, September 14, 2016, 03:29:30 PM

Previous topic - Next topic

Darkandro

Heyho,

ist es möglich einen Befehl mit argumenten zu erstellen?

Beispiel: !gaming <irgendwas>

Und wie kann ich mit der API eine Channelbeschreibung ändern?

Danke im Voraus

Stefan1200

Du müsstest ein Plugin für den JTS3ServerMod schreiben. Dazu gibt es eine Anleitung im plugins Verzeichnis. Im Beispiel Plugin ist sogar auch ein Chat Befehl vorhanden, das ein Argument verwendet.

Darkandro

Und wie ist der Befehl für das editieren der channelbeschreibung?
Also in der API?

Stefan1200

Da gibt es keinen fertigen Befehl in der API, aber das kannst du mit der doCommand(String command) Methode von der Klasse JTS3ServerQuery (ist in der Plugin API vom JTS3ServerMod enthalten) realisieren.

Der TS3 Befehl wäre dafür, hier ein Beispiel:
channeledit cid=15 channel_description=My\sDescription

Die Channel Description einfach mit der Methode encodeTS3String(String str) von der Klasse JTS3ServerQuery vorher encodieren (der ersetzt dann die Leerzeichen mit \s und so weiter).

Darkandro

wenn ich \s \n oder so verwende kommt invalid escape sequence

Stefan1200

Quote from: Darkandro on September 14, 2016, 08:59:07 PM
wenn ich \s \n oder so verwende kommt invalid escape sequence

Das macht doch encodeTS3String(String str) alles für dich.

Darkandro

#6
Und wie mach ich dann den Zeilenumbruch?


queryLib.doCommand("channeledit cid=189 channel_description=" + queryLib.encodeTS3String("My Description test"));


Fehler:

java.lang.NullPointerException
at java.util.concurrent.ConcurrentHashMap.hash(ConcurrentHashMap.java:333)
at java.util.concurrent.ConcurrentHashMap.putIfAbsent(ConcurrentHashMap.java:1145)
at java.lang.ClassLoader.getClassLoadingLock(ClassLoader.java:464)
at java.lang.ClassLoader.loadClass(ClassLoader.java:405)
at java.lang.ClassLoader.loadClass(ClassLoader.java:358)
at de.stefan1200.jts3servermod.JTS3ServerMod.c(Unknown Source)
at de.stefan1200.jts3servermod.JTS3ServerMod.b(Unknown Source)
at de.stefan1200.jts3servermod.JTS3ServerMod.b(Unknown Source)
at de.stefan1200.jts3servermod.i.run(Unknown Source)
at java.lang.Thread.run(Thread.java:745)

Stefan1200

Quote from: Darkandro on September 14, 2016, 09:12:22 PM
Und wie mach ich dann den Zeilenumbruch?


queryLib.doCommand("channeledit cid=189 channel_description=" + queryLib.encodeTS3String("My Description test"));


Fehler:

java.lang.NullPointerException
at java.util.concurrent.ConcurrentHashMap.hash(ConcurrentHashMap.java:333)
at java.util.concurrent.ConcurrentHashMap.putIfAbsent(ConcurrentHashMap.java:1145)
at java.lang.ClassLoader.getClassLoadingLock(ClassLoader.java:464)
at java.lang.ClassLoader.loadClass(ClassLoader.java:405)
at java.lang.ClassLoader.loadClass(ClassLoader.java:358)
at de.stefan1200.jts3servermod.JTS3ServerMod.c(Unknown Source)
at de.stefan1200.jts3servermod.JTS3ServerMod.b(Unknown Source)
at de.stefan1200.jts3servermod.JTS3ServerMod.b(Unknown Source)
at de.stefan1200.jts3servermod.i.run(Unknown Source)
at java.lang.Thread.run(Thread.java:745)



Ganz normal in Java:

queryLib.doCommand("channeledit cid=189 channel_description=" + queryLib.encodeTS3String("My Description test\nIch bin die zweite Zeile"));



Was steht zusammen mit der NullPointerException in der Logdatei? Sicher, das du die Mainclass im JAR Manifest hinzugefügt hast?

Darkandro

#8
Sobald ich diese Zeile entferne lädt er das Plugin wieder richtig.
Edit: Jetzt funktioniert es, wenn ich die main-class selber definiere. xD

Danke :D

Edit2: Warum bekomme ich hier die Fehlermeldung?
Die beiden 8en sind nur Debug
ServerQuery Error 512: invalid clientID 8 8


int clientid = Integer.parseInt(eventInfo.get("clid"));
client = queryLib.getInfo(queryLib.INFOMODE_CLIENTINFO, clientid).toString();

Stefan1200

Quote from: Darkandro on September 15, 2016, 07:23:17 AM
Edit2: Warum bekomme ich hier die Fehlermeldung?
Die beiden 8en sind nur Debug
ServerQuery Error 512: invalid clientID 8 8

"Invalid ClientID" ist eine Fehlermeldung, die vom TS3 Server kommt. D.h. der Client mit der Client ID, die du übergeben hast, ist aktuell nicht mehr online.

Darkandro

Wie kann ich dann die DBID von einem Client bekommen, wenn dieser sich ausloggt??

Stefan1200

Quote from: Darkandro on September 15, 2016, 12:55:05 PM
Wie kann ich dann die DBID von einem Client bekommen, wenn dieser sich ausloggt??

ClientInfo geht nur bei Clients, die gerade online sind. Deswegen nur ClientID. Die ClientDBInfo geht auch von offline clients, enthält aber weniger / andere Informationen.
https://www.stefan1200.de/documentation/jts3serverquery/de/stefan1200/jts3serverquery/JTS3ServerQuery.html#INFOMODE_CLIENTDBINFO

Darkandro

Quote from: Stefan1200 on September 15, 2016, 03:08:17 PM
Quote from: Darkandro on September 15, 2016, 12:55:05 PM
Wie kann ich dann die DBID von einem Client bekommen, wenn dieser sich ausloggt??

ClientInfo geht nur bei Clients, die gerade online sind. Deswegen nur ClientID. Die ClientDBInfo geht auch von offline clients, enthält aber weniger / andere Informationen.
https://www.stefan1200.de/documentation/jts3serverquery/de/stefan1200/jts3serverquery/JTS3ServerQuery.html#INFOMODE_CLIENTDBINFO

Dafür benötige ich aber die Datenbank ID und wird von den Disconnect-Event nicht übergeben. Ich habe schon alles mögliche probiert nur noch keine Lösung gefunden.

Stefan1200

Quote from: Darkandro on September 15, 2016, 03:15:17 PM
Dafür benötige ich aber die Datenbank ID und wird von den Disconnect-Event nicht übergeben. Ich habe schon alles mögliche probiert nur noch keine Lösung gefunden.

Die Unique ID hast du aber. Damit kann man arbeiten. Falls du das in einem JTS3ServerMod Plugin benötigst, liefert der JTS3ServerMod eine API dafür mit. Schaue dir mal die Doku an: https://www.stefan1200.de/documentation/jts3servermod/Plugin_API/de/stefan1200/jts3servermod/interfaces/ClientDatabaseCache_Interface.html
Zum Beispiel: getDatabaseID(String clientUniqueID)
Mit der Database ID kannst du dann in dieser Klasse auch andere Dinge direkt abfragen, ohne an den TS3 Server gehen zu müssen (falls der Cache aktiv ist, sonst macht die Klasse das Online, wenn möglich).

Darkandro

Das Event "notifyclientleftview" gibt mir keine UniqueID