Stefan1200's Forum

Deutsch => Allgemeine Diskussionen => Topic started by: DreamGamer on August 10, 2016, 06:38:52 PM

Title: JTS3ServerQuery - Channel Wechseln anzeigen
Post by: DreamGamer on August 10, 2016, 06:38:52 PM
Hallo,
Ich hätte mal eine Frage ich habe jetzt Zwei Tage versucht es selbst herauszufinden aber bin nicht besonders weit gekommen. Ich möchte gerne auflisten wer und wann eine Person den Channel wechselt aber nur wenn er ihn selber wechselt nicht gemoved wird. Und das Event Channel habe ich schon drin bzw. registriert.

LG DreamGamer
Title: Re: Channel Wechseln anzeigen
Post by: Stefan1200 on August 10, 2016, 08:13:06 PM
Beim Event notifyclientmoved schaue dir mal den Wert bei reasonid an. Der sagt dir, warum der Client den Channel gewechselt hat (0 = selbst gewechselt, 1 = verschoben durch andere, etc.).
Title: Re: Channel Wechseln anzeigen
Post by: DreamGamer on August 10, 2016, 09:59:50 PM
Sorry aber ich verstehe das nicht so ganz gibt es dafür vllt. auch ein Example ?
Title: Re: Channel Wechseln anzeigen
Post by: Stefan1200 on August 10, 2016, 10:10:05 PM
Dafür müsste ich erstmal wissen, was du überhaupt machst. Worin möchtest du das gerade implementieren?
Title: Re: Channel Wechseln anzeigen
Post by: DreamGamer on August 10, 2016, 10:17:08 PM
Also ich wollte für meinen TS ein Bot entwerfen der nachschaut wer channel spammt und diese Leute automatisch kickt oder den Rang NoMove für x Sekunden gibt. Ich habe aber noch nicht etwas mit JTSQuery gemacht habe schon viele in Java Halt gemacht aber noch nie Richtung Teamspeak. In der Example Datei habe ich schon viel gelernt aber halt so etwas wie auslesen wer den Channel wann gewechselt hat eben noch nicht.
Title: Re: Channel Wechseln anzeigen
Post by: DreamGamer on August 11, 2016, 04:22:16 AM
Ok ich glaube ich habe es herausgefunden. Aber ein Problem gibt es noch. Wenn man wie im Example das hier z.b Abfragt:
Code: [Select]
Vector<HashMap<String, String>> dataClientServerGroups = query.getList(JTS3ServerQuery.LISTMODE_CLIENTDBLIST);
StringBuffer sb = new StringBuffer();
for (HashMap<String, String> hashMap : dataClientServerGroups)
{
if (debug) outputHashMap(hashMap, System.out);
if (sb.length() > 0)
{
sb.append(", ");
}
sb.append(hashMap.get("channel_name"));
}

Woher weiß man was man bei hashMap.get eintragen soll ?
Title: Re: Channel Wechseln anzeigen
Post by: Stefan1200 on August 11, 2016, 07:46:24 AM
Nein, die Channel Events bekommst du vom TeamspeakActionListener, siehe hier: https://www.stefan1200.de/documentation/jts3serverquery/de/stefan1200/jts3serverquery/TeamspeakActionListener.html

hashMap.get enthält die selben Schlüssel, wie diese vom TS3 Server Query Interface zurück gegeben werden. Natürlich kannst du dir alle Keys auch per hashMap.keySet() zurück geben lassen.
Title: Re: Channel Wechseln anzeigen
Post by: DreamGamer on August 11, 2016, 04:02:03 PM
Ok. Für den TeamspeakActionListener gibt es kein Example oder ?
Title: Re: Channel Wechseln anzeigen
Post by: Stefan1200 on August 11, 2016, 07:50:58 PM
Wenn ich das richtig sehe, hast du dir den JTS3ServerQueryExample doch schon angeschaut. Ohne TeamspeakActionListener würden die Chatbefehle doch gar nicht funktionieren (sind doch auch Events).

Klassendefinition der JTS3ServerQueryExample:
public class JTS3ServerQueryExample implements TeamspeakActionListener

Zu implementierende Methode:
public void teamspeakActionPerformed(String eventType, HashMap<String, String> eventInfo)

Wenn eventType equals "notifyclientmoved", dann wertest du die Informationen in der eventInfo aus. Wenn du in Zeile 16 die debug Variable auf true setzt, bekommst du die Inhalte der eventInfo auf der Konsole ausgegeben. Der Wert reasonid in der eventInfo gibt halt einen Grund fürs Verschieben als Zahl an (0 = selbst gewechselt, 1 = verschoben durch andere, etc.).
Title: Re: JTS3ServerQuery - Channel Wechseln anzeigen
Post by: DreamGamer on August 11, 2016, 10:22:12 PM
Also wenn ich das richtig verstanden habe soll ich halt bei eventInfo "notifyclientmoved" abfragen. Und ich habe dann dieses hier geschrieben
Code: [Select]
else if (eventInfo.get("notifyclientmoved") == "2")
{
System.out.println("Channel Switched");

}
Aber irgendwie funktioniert es nicht. Und das Problem es gibt keine Fehler Meldung. Ich denke mal der Fehler ist offensichtlich aber ich checke ihn einfach nicht.

Title: Re: JTS3ServerQuery - Channel Wechseln anzeigen
Post by: Stefan1200 on August 11, 2016, 10:42:50 PM
Also wenn ich das richtig verstanden habe soll ich halt bei eventInfo "notifyclientmoved" abfragen.

Falsch verstanden, bitte meinen obigen Text nochmal langsam lesen.
Title: Re: JTS3ServerQuery - Channel Wechseln anzeigen
Post by: DreamGamer on August 11, 2016, 10:56:17 PM
Ahh ok. also ist es so richtig ?
Code: [Select]
else if (eventType.equals("notifyclientmoved"))
{
System.out.println("Channel Switched");

}
Title: Re: JTS3ServerQuery - Channel Wechseln anzeigen
Post by: Stefan1200 on August 11, 2016, 11:10:23 PM
Das kommt dem näher, richtig. ;-)
Title: Re: JTS3ServerQuery - Channel Wechseln anzeigen
Post by: DreamGamer on August 11, 2016, 11:14:09 PM
Aber es passiert immer noch nichts wenn ich einen Channel Wechsel oder jemanden move warum das ?

UPDATE:

Ich habe bis jetzt das hier als Script aber ich verstehe nicht warum es nicht Funktioniert es scheitert ja bei der else if Abfrage.

Code: [Select]
else if (eventType.equals("notifyclientmoved"))
{
try {

System.out.println("Channel Switched");
String var = eventInfo.get("ctid ");
try {
query.sendTextMessage(Integer.parseInt(eventInfo.get("invokerid")), JTS3ServerQuery.TEXTMESSAGE_TARGET_CHANNEL, "Channel Changed" + var);
} catch (Exception e2) { /* do nothing */ }


} catch (Exception e) {
e.printStackTrace();
try
{
query.sendTextMessage(Integer.parseInt(eventInfo.get("invokerid")), JTS3ServerQuery.TEXTMESSAGE_TARGET_CLIENT, "An error occurred: " + e.toString());
}
catch (Exception e2) { /* do nothing */ }
}

}
Title: Re: JTS3ServerQuery - Channel Wechseln anzeigen
Post by: Stefan1200 on August 12, 2016, 11:02:22 AM
Wie hast du denn das Channel Event registriert? Wie sieht der ganze Source aus?
Title: Re: JTS3ServerQuery - Channel Wechseln anzeigen
Post by: DreamGamer on August 12, 2016, 04:43:43 PM
Update bin zurzeit nicht Zuhause kann erst ab morgen 20 Uhr den Source Code schicken.

Weiter geht es. Also mein Kompletter Source Code sieht zurzeit so aus:

Code: [Select]
package de.stefan1200.jts3serverqueryexample;

import java.io.PrintStream;
import java.util.Collection;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Vector;

import de.stefan1200.jts3serverquery.JTS3ServerQuery;
import de.stefan1200.jts3serverquery.TS3ServerQueryException;
import de.stefan1200.jts3serverquery.TeamspeakActionListener;

public class JTS3ServerQueryExample implements TeamspeakActionListener
{
JTS3ServerQuery query;
boolean debug = true; // Set to true if you want to see all key / values

public static void main(String[] args)
throws Exception
{
JTS3ServerQueryExample jts3 = new JTS3ServerQueryExample();

jts3.runServerMod();
}

/*
* Just output all key / value pairs
*/
void outputHashMap(HashMap<String, String> hm, PrintStream stream)
{
if (hm == null)
{
return;
}

    Collection<String> cValue = hm.values();
    Collection<String> cKey = hm.keySet();
    Iterator<String> itrValue = cValue.iterator();
    Iterator<String> itrKey = cKey.iterator();

while (itrValue.hasNext() && itrKey.hasNext())
{
stream.println(itrKey.next() + ": " + itrValue.next());
}
}

public void teamspeakActionPerformed(String eventType, HashMap<String, String> eventInfo)
{
if (debug) System.out.println(eventType + " received");
if (debug) outputHashMap(eventInfo, System.out);


if (eventInfo.get("msg").equalsIgnoreCase("liste"))
{
try {

Vector<HashMap<String, String>> dataClientServerGroups = query.getList(JTS3ServerQuery.LISTMODE_CLIENTDBLIST);
StringBuffer sb = new StringBuffer();
for (HashMap<String, String> hashMap : dataClientServerGroups)
{
if (debug) outputHashMap(hashMap, System.out);
if (sb.length() > 0)
{
sb.append(", ");
}
sb.append(hashMap.get("channel_name"));
}
query.sendTextMessage(Integer.parseInt(eventInfo.get("invokerid")), JTS3ServerQuery.TEXTMESSAGE_TARGET_CLIENT, "Alle Channel: " + sb.toString());


} catch (Exception e) {
e.printStackTrace();
try
{
query.sendTextMessage(Integer.parseInt(eventInfo.get("invokerid")), JTS3ServerQuery.TEXTMESSAGE_TARGET_CLIENT, "An error occurred: " + e.toString());
}
catch (Exception e2) { /* do nothing */ }
}
}
else if (eventType.equals("notifyclientmoved"))
{
try {

System.out.println("Channel Switched");
String var = eventInfo.get("ctid ");
try {
query.sendTextMessage(Integer.parseInt(eventInfo.get("invokerid")), JTS3ServerQuery.TEXTMESSAGE_TARGET_CHANNEL, "Channel Changed" + var);
} catch (Exception e2) { /* do nothing */ }


} catch (Exception e) {
e.printStackTrace();
try
{
query.sendTextMessage(Integer.parseInt(eventInfo.get("invokerid")), JTS3ServerQuery.TEXTMESSAGE_TARGET_CLIENT, "An error occurred: " + e.toString());
}
catch (Exception e2) { /* do nothing */ }
}

}
}



void runServerMod()
throws Exception
{
query = new JTS3ServerQuery();

try
{
// Connect to TS3 Server, set your server data here
query.connectTS3Query("localhost", 10011);

// Login with an server query account. If needed, uncomment next line!
query.loginTS3("serveradmin", "11111111");

// Set our class for receiving events
query.setTeamspeakActionListener(this);

// Select virtual Server
query.selectVirtualServer(1);
query.changeThreadName("TestBot");
query.setDisplayName("TestBot");

// Register some events
query.addEventNotify(JTS3ServerQuery.EVENT_MODE_TEXTSERVER, 0); // Server Chat event
query.addEventNotify(JTS3ServerQuery.EVENT_MODE_TEXTCHANNEL, 0);  // Channel Chat event
query.addEventNotify(JTS3ServerQuery.EVENT_MODE_TEXTPRIVATE, 0);  // Private Chat event
query.addEventNotify(JTS3ServerQuery.EVENT_MODE_CHANNEL, 0);
}
catch (TS3ServerQueryException sqe)
{
System.err.println("An error occurred while connecting to the TS3 server, stopping now! More details below.");

if (sqe.getFailedPermissionID() >= 0)
{
HashMap<String, String> permInfo = null;
try
{
// This needs the permission b_serverinstance_permission_list
permInfo = query.getPermissionInfo(sqe.getFailedPermissionID());
System.err.println("Missing permission:");
outputHashMap(permInfo, System.err);
}
catch (Exception e)
{
// Ignore this exception to make sure, that a missing b_serverinstance_permission_list don't quit this program.
}
}

throw sqe;
}
catch (Exception e)
{
System.err.println("An error occurred while connecting to the TS3 server, stopping now! More details below.");
throw e;
}

System.out.println("You can now chat with this program, using server chat,");
System.out.println("channel chat (in default channel) or by private messaging the query connection!");
System.out.println("Commands are (some might need serveradmin permissions):");
System.out.println("!channellist");
System.out.println("!clientlist");
System.out.println("!logview");
System.out.println("!myservergroups");
System.out.println("!serverinfo");
System.out.println("!quitbot");
System.out.println();

while(true)
{
try
{
/*
* Make sure that the Java VM don't quit this program.
*/
Thread.sleep(100);
}
catch (Exception e)
{
}
}
}
}

Title: Re: JTS3ServerQuery - Channel Wechseln anzeigen
Post by: DreamGamer on August 14, 2016, 07:25:26 PM
Gibt es mehr Events als diese 5 ?
Code: [Select]
query.addEventNotify(JTS3ServerQuery.EVENT_MODE_TEXTSERVER, 0);
query.addEventNotify(JTS3ServerQuery.EVENT_MODE_TEXTCHANNEL, 0);
query.addEventNotify(JTS3ServerQuery.EVENT_MODE_TEXTPRIVATE, 0);
query.addEventNotify(JTS3ServerQuery.EVENT_MODE_CHANNEL, 0);
query.addEventNotify(JTS3ServerQuery.EVENT_MODE_SERVER, 0);
Title: Re: JTS3ServerQuery - Channel Wechseln anzeigen
Post by: Stefan1200 on August 14, 2016, 08:48:58 PM
Du hast vom Beispiel Source in der Methode teamspeakActionPerformed die Zeile
if (eventType.equals("notifytextmessage"))
entfernt. Das war eine schlechte Entscheidung. Erst per if nach dem Event Typ filtern, dann erst nach der Event Info! Sonst kommt es zu einer NullPointerException, wenn du equalsIgnoreCase("liste") auf ein null Objekt machst. Deswegen wurde der if else Zweig nie ausgeführt. Aber das ist eigentlich Java Basiswissen.


Gibt es mehr Events als diese 5 ?
Code: [Select]
query.addEventNotify(JTS3ServerQuery.EVENT_MODE_TEXTSERVER, 0);
query.addEventNotify(JTS3ServerQuery.EVENT_MODE_TEXTCHANNEL, 0);
query.addEventNotify(JTS3ServerQuery.EVENT_MODE_TEXTPRIVATE, 0);
query.addEventNotify(JTS3ServerQuery.EVENT_MODE_CHANNEL, 0);
query.addEventNotify(JTS3ServerQuery.EVENT_MODE_SERVER, 0);

Nein, nur diese 5.
Title: Re: JTS3ServerQuery - Channel Wechseln anzeigen
Post by: DreamGamer on August 14, 2016, 09:03:20 PM
ohhh ich habe garnicht gesehen das es im EvenType "notifytextmessage" war jetzt funktioniert es :)

Danke nochmals für die Hilfe. Ich hoffe dass das jetzt alle Probleme waren.
Title: Re: JTS3ServerQuery - Channel Wechseln anzeigen
Post by: DreamGamer on August 16, 2016, 03:28:27 PM
Eine schnelle Frage. In den Docs die beim Download dabei sind steht zwar welche EventTypen es gibt aber nicht welche EventInfos. Kann man dies irgendwo sehen ?

bzw. Wenn ich im EventType notifyclientmoved bin und diesen Code ausführen will:
Code: [Select]
query.sendTextMessage(Integer.parseInt(eventInfo.get("invokerid")), JTS3ServerQuery.TEXTMESSAGE_TARGET_CLIENT, "Channel Changed: " + var);

Kriege ich als Fehler "numberformatexception" und das in dieser Zeile und zwar weil das hier: "Integer.parseInt(eventInfo.get("invokerid"))" null ist. Und ich denke mal weil es halt bei clientmoved nichtmehr invokerid ist oder ?
Title: Re: JTS3ServerQuery - Channel Wechseln anzeigen
Post by: Stefan1200 on August 16, 2016, 04:37:33 PM
Eine schnelle Frage. In den Docs die beim Download dabei sind steht zwar welche EventTypen es gibt aber nicht welche EventInfos. Kann man dies irgendwo sehen?

Diese Frage habe ich dir bereits beantwortet am 11 August 2016, 19:50:58: https://www.stefan1200.de/forum/index.php?topic=457.msg2578#msg2578
Title: Re: JTS3ServerQuery - Channel Wechseln anzeigen
Post by: DreamGamer on August 16, 2016, 04:57:15 PM
Dort steht aber nur clid und reasonid. clid ist der Grund und was reasonid sein soll verstehe ich nicht weil es immer 0 ist. und mehr sehe ich dort nicht.

(http://image.prntscr.com/image/661ffcc7ebd84d5da7a7774c320438f5.jpg) Mehr als das steht dort nicht.
Title: Re: JTS3ServerQuery - Channel Wechseln anzeigen
Post by: Stefan1200 on August 16, 2016, 05:42:50 PM
Dort steht aber nur clid und reasonid. clid ist der Grund und was reasonid sein soll verstehe ich nicht weil es immer 0 ist. und mehr sehe ich dort nicht.

ctid ist der Grund, clid ist die Client ID. reasonid weiß ich auswendig gerade nicht.
Title: Re: JTS3ServerQuery - Channel Wechseln anzeigen
Post by: DreamGamer on August 16, 2016, 05:43:56 PM
ohhh. Danke habe gedacht das wäre beides clid. Das erklärt alles. Danke für die Hilfe erneut.


Aber wenn ich ctid Abfrage bekomme ich ja immer die ID des Channels nicht gesagt ob er gemoved wurde oder denn channel gewechselt hat.
Title: Re: JTS3ServerQuery - Channel Wechseln anzeigen
Post by: DreamGamer on August 16, 2016, 07:16:33 PM
Hat die ReasonID vllt. damit etwas zu tun ?
Title: Re: JTS3ServerQuery - Channel Wechseln anzeigen
Post by: Stefan1200 on August 16, 2016, 07:21:40 PM
Hat die ReasonID vllt. damit etwas zu tun ?

Sorry, natürlich hast du recht. Hatte vorhin nur aus dem Kopf heraus geantwortet. In meinen Aufzeichnungen habe ich folgendes gefunden:
notifyclientmoved ctid=2 reasonid=0 clid=2
Selbst den Channel gewechselt (sowohl rein und raus). ctid=2  (Channel ID Ziel) / clid=3  (Client ID)
notifyclientmoved ctid=3 reasonid=1 invokerid=5 invokername=Stefan1200 invokeruid=kYbTRDwDPE7R17Av3PorhMwaZW45 clid=8
Durch jemanden verschoben.

Habe mal meine vorherigen Beiträge entsprechend angepasst.
Title: Re: JTS3ServerQuery - Channel Wechseln anzeigen
Post by: DreamGamer on August 16, 2016, 07:23:07 PM
Ok gut Danke :) Eine letze Frage noch wenn der Bot ungefähr 10 Minuten connectet ist. macht er nichts mehr und wenn man die verbindung trennen will kommt das hier:

Code: [Select]
java.lang.IllegalStateException: Closed TS3 Connection: java.net.SocketException: Software caused connection abort: recv failed
        at de.stefan1200.jts3serverquery.JTS3ServerQuery.readIncoming(JTS3ServerQuery.java:1657)
        at de.stefan1200.jts3serverquery.JTS3ServerQuery.doInternalCommand(JTS3ServerQuery.java:1187)
        at de.stefan1200.jts3serverquery.JTS3ServerQuery.removeAllEvents(JTS3ServerQuery.java:517)
        at de.stefan1200.jts3serverquery.JTS3ServerQuery.removeTeamspeakActionListener(JTS3ServerQuery.java:419)
        at de.stefan1200.jts3serverqueryexample.JTS3ServerQueryExample.runServerMod(JTS3ServerQueryExample.java:454)
        at de.stefan1200.jts3serverqueryexample.JTS3ServerQueryExample.main(JTS3ServerQueryExample.java:27)
Caused by: java.net.SocketException: Software caused connection abort: recv failed
        at java.net.SocketInputStream.socketRead0(Native Method)
        at java.net.SocketInputStream.socketRead(Unknown Source)
        at java.net.SocketInputStream.read(Unknown Source)
        at java.net.SocketInputStream.read(Unknown Source)
        at sun.nio.cs.StreamDecoder.readBytes(Unknown Source)
        at sun.nio.cs.StreamDecoder.implRead(Unknown Source)
        at sun.nio.cs.StreamDecoder.read(Unknown Source)
        at java.io.InputStreamReader.read(Unknown Source)
        at java.io.BufferedReader.fill(Unknown Source)
        at java.io.BufferedReader.readLine(Unknown Source)
        at java.io.BufferedReader.readLine(Unknown Source)
        at de.stefan1200.jts3serverquery.JTS3ServerQuery.readIncoming(JTS3ServerQuery.java:1646)
        ... 5 more
An error occurred: java.lang.IllegalStateException: Closed TS3 Connection: java.net.SocketException: Software caused connection abort: recv failed

Aber warum passiert das ?

Title: Re: JTS3ServerQuery - Channel Wechseln anzeigen
Post by: Stefan1200 on August 16, 2016, 10:33:40 PM
[...]wenn der Bot ungefähr 10 Minuten connectet ist. macht er nichts mehr und wenn man die verbindung trennen will kommt das hier:
[...]
Aber warum passiert das ?

Der TS3 Server trennt alle Query Clients, die seit 10 Minuten keinen Befehl mehr abgesetzt haben. Einfach alle 9 Minuten irgendein Befehl ausführen lassen.
Title: Re: JTS3ServerQuery - Channel Wechseln anzeigen
Post by: DreamGamer on August 17, 2016, 03:54:49 PM
Ok :) Dann erneut Danke für die Hilfe.
Title: Re: JTS3ServerQuery - Channel Wechseln anzeigen
Post by: Silent-Rain on November 06, 2016, 02:18:53 PM
Guten Tag,

wäre es möglich, mich dabei zu unterstützen dieses bei uns einzupflegen?
Es geht darum, nachvollziehen zu können, wann und wer welchen Channel Editiert. Dieses wäre ja über die Funktion TeamspeakActionListener möglich. Jedoch konnte ich aus dem Thread nicht raus lesen, wie man so etwas implementiert.

Stefan schrieb zwar schon eingangs das man dieses als Plugin und mit Java umsetzen kann, doch leider bin ich keiner Programmiersprache Herr und bräuchte da die Unterstützung.

Ich selber verwende einen VServer worauf ein paar Webseiten laufen und halt für die Community, der ich angehöre, einen Teamspeakserver inkl. dem Mod von Stefan (jts3servermod).