JTS3ServerQuery - Channel Wechseln anzeigen

Started by DreamGamer, August 10, 2016, 06:38:52 PM

Previous topic - Next topic

DreamGamer

#15
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:


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


DreamGamer

Gibt es mehr Events als diese 5 ?

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

Stefan1200

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.


Quote from: DreamGamer on August 14, 2016, 07:25:26 PM
Gibt es mehr Events als diese 5 ?

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.

DreamGamer

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.

DreamGamer

#19
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:

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 ?

Stefan1200

Quote from: 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?

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

DreamGamer

#21
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.

Mehr als das steht dort nicht.

Stefan1200

Quote from: 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.

ctid ist der Grund, clid ist die Client ID. reasonid weiß ich auswendig gerade nicht.

DreamGamer

#23
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.

DreamGamer

Hat die ReasonID vllt. damit etwas zu tun ?

Stefan1200

#25
Quote from: DreamGamer on August 16, 2016, 07:16:33 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.

DreamGamer

#26
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:

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 ?


Stefan1200

Quote from: DreamGamer on August 16, 2016, 07:23:07 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.

DreamGamer


Silent-Rain

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