Menu

Show posts

This section allows you to view all posts made by this member. Note that you can only see posts made in areas you currently have access to.

Show posts Menu

Messages - Stefan1200

#2206
General Discussions / Re: Some questions about plugins
February 18, 2011, 01:21:47 PM
This source work here, tested with TS3 client beta 36:

main.cpp:
#include "main.h"

static struct TS3Functions ts3Functions;

#ifdef WINDOWS
#define _strcpy(dest, destSize, src) strcpy_s(dest, destSize, src)
#define snprintf sprintf_s
#else
#define _strcpy(dest, destSize, src) { strncpy(dest, src, destSize-1); dest[destSize-1] = '\0'; }
#endif

#define PATH_BUFSIZE 512
#define COMMAND_BUFSIZE 128

static char* pluginCommandID = NULL;

using namespace std;

/*********************************** Required functions ************************************/
/*
* If any of these required functions is not implemented, TS3 will refuse to load the plugin
*/

/* Unique name identifying this plugin */
const char* ts3plugin_name()
{
    return "TS3KickAll";
}

/* Plugin version */
const char* ts3plugin_version()
{
    return "0.1";
}

/* Plugin API version. Must be the same as the clients API major version, else the plugin fails to load. */
int ts3plugin_apiVersion()
{
return 8;
}

/* Plugin author */
const char* ts3plugin_author()
{
    return "Stefan1200/GodlySOB";
}

/* Plugin description */
const char* ts3plugin_description()
{
    return "Kicks people";
}

/* Set TeamSpeak 3 callback functions */
void ts3plugin_setFunctionPointers(const struct TS3Functions funcs)
{
    ts3Functions = funcs;
}

/*
* Custom code called right after loading the plugin. Returns 0 on success, 1 on failure.
* If the function returns 1 on failure, the plugin will be unloaded again.
*/
int ts3plugin_init()
{
    return 0;  /* 0 = success, 1 = failure */
}

/* Custom code called right before the plugin is unloaded */
void ts3plugin_shutdown()
{
    /* Your plugin cleanup code here */
    printf("TS3KickAll PLUGIN: shutdown\n");

/* Free pluginCommandID if we registered it */
if(pluginCommandID)
{
free(pluginCommandID);
pluginCommandID = NULL;
}
}

/*
* If the plugin wants to use plugin commands, it needs to register a command ID. This function will be automatically called after
* the plugin was initialized. This function is optional. If you don't use plugin commands, the function can be omitted.
* Note the passed commandID parameter is no longer valid after calling this function, so you *must* copy it and store it in the plugin.
*/
void ts3plugin_registerPluginCommandID(const char* commandID)
{
const size_t sz = strlen(commandID) + 1;
pluginCommandID = (char*)malloc(sz);
memset(pluginCommandID, 0, sz);
_strcpy(pluginCommandID, sz, commandID);  /* The commandID buffer will invalidate after existing this function */
printf("TS3KickAll PLUGIN: registerPluginCommandID: %s\n", pluginCommandID);
}

/* Plugin command keyword. Return NULL or "" if not used. */
const char* ts3plugin_commandKeyword()
{
return "a";
}

/* Plugin processes console command. Return 0 if plugin handled the command, 1 if not handled. */
int ts3plugin_processCommand(uint64 serverConnectionHandlerID, const char* command)
{
char buf[COMMAND_BUFSIZE];
char *s, *param1 = NULL, *param2 = NULL, *param3 = NULL, *kickReason = const_cast<char *>("");
int i = 0;
anyID myID;
enum { CMD_NONE = 0, CMD_KICK, CMD_KICKALL} cmd = CMD_NONE;
#ifdef WINDOWS
char* context = NULL;
#endif

printf("TS3KickAll PLUGIN: process command: '%s'\n", command);

_strcpy(buf, COMMAND_BUFSIZE, command);
#ifdef WINDOWS
s = strtok_s(buf, " ", &context);
#else
s = strtok(buf, " ");
#endif
while(s != NULL)
{
if(i == 0)
{
    if(!strcmp(s, "ka"))
{
cmd = CMD_KICKALL;
}
else if(!strcmp(s, "kickall"))
{
cmd = CMD_KICKALL;
}

}
else if(i == 1)
{
param1 = s;
}
else if(i == 2)
{
param2 = s;
}
else
{
param3 = s;
}
#ifdef WINDOWS
s = strtok_s(NULL, " ", &context);
#else
s = strtok(NULL, " ");
#endif
i++;
}

switch(cmd)
{
case CMD_NONE:
return 1;  /* Command not handled by plugin */
case CMD_KICKALL:
            /* Get own clientID */
            if(ts3Functions.getClientID(serverConnectionHandlerID, &myID) != ERROR_ok)
            {
                ts3Functions.logMessage("Error querying client ID", LogLevel_ERROR, "TS3KickAll Plugin", serverConnectionHandlerID);
                break;
            }

            anyID* clientList;
            if(ts3Functions.getClientList(serverConnectionHandlerID, &clientList) != ERROR_ok)
            {
                ts3Functions.logMessage("Error querying client list", LogLevel_ERROR, "TS3KickAll Plugin", serverConnectionHandlerID);
                break;
            }

            int clientCount = 0;
            int clientType;
            for(i=0; clientList[i]; i++)
            {
                if(ts3Functions.getClientVariableAsInt(serverConnectionHandlerID, clientList[i], CLIENT_TYPE, &clientType) != ERROR_ok)
                {
                    continue;
                }
                if (clientType == 1)
                {
                    continue;
                }
                if (myID == clientList[i])
                {
                    continue;
                }

                /* Request client kick from server */
                ts3Functions.requestClientKickFromServer(serverConnectionHandlerID, clientList[i], "kick reason", NULL);

                ++clientCount;
            }

            char buffer [50];
            sprintf (buffer, "Requested kick of %d clients!", clientCount);
            ts3Functions.printMessageToCurrentTab(buffer);

            ts3Functions.freeMemory(clientList);
            break;
}

return 0;  /* Plugin handled command */
}

bool isServerGroupIDinList(char* list, uint64 id)
{
    char* token = strtok(list,",");
    uint64 tmp = 0;
    while (token != NULL)
    {
        tmp = (uint64)atoi(token);
        if (id == tmp)
        {
            return true;
        }
        token = strtok(NULL,",");
    }

    return false;
}

bool isClientInList(anyID* clientList, anyID* clientID)
{
    for(int i=0; clientList[i]; i++)
    {
        if (clientList[i] == *clientID)
        {
            return true;
        }
    }

    return false;
}

/*
* Plugin requests to be always automatically loaded by the TeamSpeak 3 client unless
* the user manually disabled it in the plugin dialog.
* This function is optional. If missing, no autoload is assumed.
*/
int ts3plugin_requestAutoload()
{
return 1;  /* 1 = request autoloaded, 0 = do not request autoload */
}


main.h:
#ifndef PLUGIN_H
#define PLUGIN_H

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#include "include/public_errors.h"
#include "include/public_definitions.h"
#include "include/public_rare_definitions.h"
#include "include/ts3_functions.h"
#include "include/plugin_events.h"

#ifdef WIN32
#define PLUGINS_EXPORTDLL __declspec(dllexport)
#else
#define PLUGINS_EXPORTDLL __attribute__ ((visibility("default")))
#endif

#ifdef __cplusplus
extern "C" {
#endif

bool isClientInList(anyID* clientList, anyID* clientID);
bool isServerGroupIDinList(char* list, uint64 id);

/* Required functions */
PLUGINS_EXPORTDLL const char* ts3plugin_name();
PLUGINS_EXPORTDLL const char* ts3plugin_version();
PLUGINS_EXPORTDLL int ts3plugin_apiVersion();
PLUGINS_EXPORTDLL const char* ts3plugin_author();
PLUGINS_EXPORTDLL const char* ts3plugin_description();
PLUGINS_EXPORTDLL void ts3plugin_setFunctionPointers(const struct TS3Functions funcs);
PLUGINS_EXPORTDLL int ts3plugin_init();
PLUGINS_EXPORTDLL void ts3plugin_shutdown();

/* Optional functions */
PLUGINS_EXPORTDLL void ts3plugin_registerPluginCommandID(const char* commandID);
PLUGINS_EXPORTDLL const char* ts3plugin_commandKeyword();
PLUGINS_EXPORTDLL int ts3plugin_processCommand(uint64 serverConnectionHandlerID, const char* command);
PLUGINS_EXPORTDLL int ts3plugin_requestAutoload();

#ifdef __cplusplus
}
#endif

#endif


In TS3 client:
/a kickall

Output:
Requested kick of 2 clients!
#2207
General Discussions / Re: Some questions about plugins
February 18, 2011, 04:12:15 AM
I changed the printMessageToCurrentTab stuff at the end, look in my previous post.
#2208
General Discussions / Re: Some questions about plugins
February 18, 2011, 02:51:59 AM
Seems our messenger clients had some troubles :).

This is my idea of a kick all function, remember to change that first line (case CMD_KA) and the kick reason.

That piece of code is untested, don't know if the compiler would like that.

case CMD_KA:
/* Get own clientID */
if(ts3Functions.getClientID(serverConnectionHandlerID, &myID) != ERROR_ok)
{
ts3Functions.logMessage("Error querying client ID", LogLevel_ERROR, "TS3MassMover Plugin", serverConnectionHandlerID);
break;
}

anyID* clientList;
if(ts3Functions.getClientList(serverConnectionHandlerID, &clientList) != ERROR_ok)
{
ts3Functions.logMessage("Error querying client list", LogLevel_ERROR, "TS3MassMover Plugin", serverConnectionHandlerID);
break;
}

int clientErrorCount = 0;
int clientCount = 0;
int clientType;
for(i=0; clientList[i]; i++)
{
if(ts3Functions.getClientVariableAsInt(serverConnectionHandlerID, clientList[i], CLIENT_TYPE, &clientType) != ERROR_ok)
{
continue;
}
if (clientType == 1)
{
continue;
}
if (myID == clientList[i])
{
continue;
}

/* Move clients to specified channel */
if(ts3Functions.requestClientKickFromServer(serverConnectionHandlerID, clientList[i], "kick reason", NULL) != ERROR_ok)
{
++clientErrorCount;
}

++clientCount;
}

char buffer [50];
sprintf (buffer, "Kicked %d of %d clients!", (clientCount - clientErrorCount), clientCount);
ts3Functions.printMessageToCurrentTab(buffer);

ts3Functions.freeMemory(clientList);
break;
#2209
General Discussions / Re: Some questions about plugins
February 17, 2011, 11:02:26 PM
What is the exact problem you have? I am not very good with C++, because I am primary a Java developer.

Currently I have crashing problems with the Windows Teamspeak 3 client rc1-pre9. The last version I was able to create plugins was TS3 client beta 36. Maybe I am not the perfect guy to ask me C++ and TS3 Client Plugin development related questions :(. Sorry for this.
#2210
Quote from: Lars on February 15, 2011, 02:49:50 AM
Okay, Danke. Es gibt einen Bot für TS3 der das eingebaut hat (ts3phpbot), aber ich bevorzuge lieber den Java Bot.  :)
Vielleicht könnte man sich daran etwas orientieren, eventeull ist da ja ein ansatz bei. :)

Wie das mit dem Sticky Channel generell funktioniert, ist mir schon klar. Mir geht es eher darum, ob und wie das in meinem Bot eingebaut wird, damit er für Bot Neulinge nicht noch unverständlicher wird. Und generell wollte ich vorerst aus meinem Bot die weniger sinnvollen Sachen raus lassen.
#2211
Aktuell ist dies noch nicht mit dem Bot möglich. Desweiteren muss ich noch prüfen ob und wie ich das einbaue, da es nicht zu unübersichtlich werden soll.
#2212
Ok, Problem per ICQ gelöst.
Java war noch nicht installiert.

Nachtrag zu den Fragen:

Quote from: Patrick85 on January 29, 2011, 11:55:42 PM
1. Entpackt ist alles, jetzt habe ich ein Ordner der  JTS3ServerMod heißt. Was muss ich jetzt mit dem Ordner genau machen? Ich hab ihn jetzt so wie er ist auf meinen Server geladen. In das Teamspeak Verzeichniss. Weiß nicht ob das so richtig war. Steht auch nichts in der Anleitung

Der Ort kann frei gewählt werden und muss nicht im Teamspeak Ordner sein. Hauptsache die Ordnerstruktur wie in der ZIP Datei bleibt erhalten.


Quote from: Patrick85 on January 29, 2011, 11:55:42 PM
2.Ich habe die config mit meinen Serverdaten geändert und gespeichert. In der Anleitung steht irgendwas von utf 8 und iso speichern, k.p was ich damit anfangen soll. Ich habe alle Dateien so gelassen wie sie waren, nur meine Daten eingetragen und gespeichert. Ist das richtig so, oder muss ich da noch etwas machen?

UTF-8 / ISO sind Kodierungen von Textdateien. Solange nur Buchstaben und Zahlen ohne Umlaute und Sonderzeichen verwendet werden, ist dies relativ egal (da identisch). Aber bei deutschen Umlauten muss dies beachtet werden.

Die meisten Texteditoren bieten die Möglichkeit an, Dateien in UTF-8 (oder Unicode 8-Bit) abzuspeichern. Ich empfehle hier den kostenlosen Notepad++. Aber selbst der Windows Notepad bietet diese Möglichkeit im Menü unter "Datei" -> "Speichern unter".

In den Bot Einstellungen kann aber die Kodierung für die Nachrichten Dateien frei gewählt werden.


Quote from: Patrick85 on January 29, 2011, 11:55:42 PM
3. Dannach habe ich im Putty Screen aktiviert,bin in das Verzeichniss gegangen /home/ts3/teamspeak3-server_linux-x86/JTS3ServerMod/ und habe den Screenbefehl eingegeben:  screen -d -m -S ts3bot java -jar JTS3ServerMod.jar . Nur leider tut sich da garnichts.Keine Fehlermeldung oder sonst irgendwas.

Durch den screen Befehl wird auch keine Meldung ausgegeben. Entweder den screen öffnen (wie in der Bot Anleitung beschrieben) oder in der Log vom Bot schauen. Die Log Datei liegt im Normalfall im Ordner vom Bot.
#2213
Klingt auf jedenfall interessant, danke dafür.

Ich denke aber das ich auf das Plugin SDK für die RC1 Version warte, und dann direkt eine neue Version mit aktueller API Version veröffentliche. Mal sehen wann das Plugin SDK veröffentlicht wird, die pre RC1 vom Client ist ja schon draußen (leider bisher ohne neueres Plugin SDK).
#2214
Quote from: Unitec on December 29, 2010, 02:04:17 AM
Gibt es aber nicht die möglichkeit abzufragen ob ein User Spricht? TS3 mach dann ja das Lämpchen andersfarbig.

Nun, natürlich geht das. Aber in den meisten Away Channels, die ich kenne, kann man im Away Channel nicht sprechen (was auch Sinn macht, man geht ja in den Away Channel um nicht beschallt zu werden). Ergo kann man auch nicht mehr feststellen, ob man spricht.
#2215
Quote from: Unitec on December 25, 2010, 07:20:55 PM
Dein Problem ist das dein TS3 Server den Bot Bannt wegen zuvieler Commands in kurzer zeit.

Das Problem hatte ich bereits mit AgentNix_x3 per Messenger gelöst. Leider hat AgentNix_x3 nicht mehr hier rein geschrieben, wie er das gelöst hat.
#2216
Quote from: Unitec on December 25, 2010, 07:22:51 PM
Mein Bot ist unter Debian (Linux version 2.6.26-2-686 (Debian 2.6.26-25lenny1)) am Laufen Funktioniert auch! Nur haben Ich mit dem Idel Move ein kleines Problem.

Der Idler wird in den entsprechenden Channel verschoben aber nicht wieder zurück geholt.

Der Idle Mover kann dies auch nicht. Diese Funktion besitzten nur der Mute Mover und der Away Mover.
Beim Idle Mover wäre das technisch auch kaum realisierbar. Wie soll der Bot erkennen, wenn jemand nicht mehr idle ist? Dazu müsste der Client den Channel wechseln oder im Chat was schreiben. Macht also recht wenig Sinn.
#2217
Quote from: froesch on December 01, 2010, 05:00:57 PM
ich starte erst den ts server, logge mich mit client ein und dann nur die batch datei (fenster bleibt offen). danach bleibt nur logs checken. win7 sowie der ts3 server sind 64bit. hoffe das macht keine probleme.

ok batch hab ich abgeändert. steht ja nun nicht mehr viel drin ;-)

Hast du nochmal mit der neusten Bot Version getestet? Wie schaut es nun aus?
#2218
Quote from: froesch on December 01, 2010, 01:57:40 AM
JTS3ServerMod_InstanceManager.log

2010-12-01 03:33:35 START_MANAGER JTS3ServerMod 3.4.0 Final (25.10.2010) Instance Manager started...
2010-12-01 03:33:35 START_INSTANCE Start bot instance instance1...
2010-12-01 03:33:35 SHUTDOWN Got signal from operating system, quitting now...
2010-12-01 03:33:35 STOP_ALL Stopping all instances and quit manager...

Sehr interessant. Das Betriebssystem sendet ein KILL / Stopp Signal an den Bot, wodurch der direkt wieder beendet wird.
Da dies kein Fehler vom Bot ist, kann ich das hier nur schwer reproduzieren.

Kannst du bitte jeden kleinen Schritt aufschreiben, was du machst um den Bot zu starten und was du danach machst?

Übrigens solang sich der Config Pfad nicht ändert, brauchst du diesen nicht mal angeben, denn "config/JTS3ServerMod_InstanceManager.cfg" ist der Standardort an dem der Bot sucht. Dies ist aber auch kein Fehler.

Deine Batch Datei könnte also so aussehen:
java -jar JTS3ServerMod.jar
pause

Diese einfach in dem Ordner von dem Bot legen und doppelt anklicken. Aber wichtig, das Fenster darf nicht geschlossen werden, sonst wird der Bot beendet. Wenn es dann später alles funktioniert, kann ja die JTS3ServerMod-Windows_NoWindow.exe verwendet werden, diese öffnet kein Fenster.
#2219
Wo liegen die Konfigdateien für den Bot, also in welchem Ordner auf der Festplatte? Denn bei deinem ersten Start direkt per java -jar hast du dich im Ordner von Java befunden. Da wird der die Konfig Dateien mit relativen Pfaden nicht finden. Entweder müssen dann alle Konfig- und Logpfade absolut angegeben werden, oder du musst vorher in den Ordner vom Bot wechseln. Selbstverständlich werde ich prüfen, warum in diesem Fall keine Fehlermeldung ausgegeben wird und dies korrigieren.

Existiert der Query Account, der in der Bot Konfig Datei angegeben wurde? Ansonsten verwende doch einfach den serveradmin Account, wie er beim ersten Start des TS3 Servers angezeigt wird.

Nachtrag:
Habe versucht den Fehler, das keine Fehlermeldung erscheint, zu reproduzieren. Bei mir kommt eine Fehlermeldung wenn die Datei nicht existiert. Kannst du mir die Konfig Dateien bitte mal zusenden?
#2220
Was wird denn auf der Konsole ausgegeben? Zum Testen ruhig mal direkt auf der Konsole ohne Skript starten.

Beim Startargument -log nicht die selbe Datei angeben, wie bei der Virtuellen Bot Instanz. Die schreiben getrennte Logs.