Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #define _CRT_SECURE_NO_WARNINGS
- #include <stdio.h>
- #include <stdlib.h>
- #include <string.h>
- #include <assert.h>
- #include "teamspeak/public_errors.h"
- #include "teamspeak/public_errors_rare.h"
- #include "teamspeak/public_definitions.h"
- #include "teamspeak/public_rare_definitions.h"
- #include "teamspeak/clientlib_publicdefinitions.h"
- #include "ts3_functions.h"
- #include "plugin.h"
- #include "sqlite3.h"
- #include <chrono>
- #include <thread>
- #include <atomic>
- #include <map>
- #include <string>
- #include <random>
- #include <sstream>
- #include <vector>
- std::map<std::string, uint64> threadlist;
- static struct TS3Functions ts3Functions;
- const char * botTag = "[b][color=red][HESC][/b] "; //[/color] neni treba jaksi, b to maze asi taky
- #define _strcpy(dest, destSize, src) { strncpy(dest, src, destSize-1); (dest)[destSize-1] = '\0'; }
- #define PLUGIN_API_VERSION 20
- #define PATH_BUFSIZE 512
- #define COMMAND_BUFSIZE 128
- #define INFODATA_BUFSIZE 128
- #define SERVERINFO_BUFSIZE 256
- #define CHANNELINFO_BUFSIZE 512
- #define RETURNCODE_BUFSIZE 128
- sqlite3 *db;
- static char* pluginID = NULL;
- std::vector<std::string> split(const char* msg, char delim = ' ')
- {
- std::string msgstr = msg;
- std::vector<std::string> parameters;
- std::stringstream ss(msgstr);
- std::string item;
- while (std::getline(ss, item, delim)) {
- if (strcmp(item.c_str(), "") == 0) continue;
- parameters.push_back(item);
- }
- return parameters;
- }
- /*********************************** 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 "Hemirt's Plugin";
- }
- /* Plugin version */
- const char* ts3plugin_version() {
- return "1.0";
- }
- /* Plugin API version. Must be the same as the clients API major version, else the plugin fails to load. */
- int ts3plugin_apiVersion() {
- return PLUGIN_API_VERSION;
- }
- /* Plugin author */
- const char* ts3plugin_author() {
- /* If you want to use wchar_t, see ts3plugin_name() on how to use */
- return "Hemirt";
- }
- /* Plugin description */
- const char* ts3plugin_description() {
- /* If you want to use wchar_t, see ts3plugin_name() on how to use */
- return "Hemirt's everything plugin.";
- }
- /* 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() {
- // char appPath[PATH_BUFSIZE];
- // char resourcesPath[PATH_BUFSIZE];
- // char configPath[PATH_BUFSIZE];
- //char pluginPath[PATH_BUFSIZE];
- // /* Your plugin init code here */
- // printf("PLUGIN: init\n");
- // /* Example on how to query application, resources and configuration paths from client */
- // /* Note: Console client returns empty string for app and resources path */
- // ts3Functions.getAppPath(appPath, PATH_BUFSIZE);
- // ts3Functions.getResourcesPath(resourcesPath, PATH_BUFSIZE);
- // ts3Functions.getConfigPath(configPath, PATH_BUFSIZE);
- //ts3Functions.getPluginPath(pluginPath, PATH_BUFSIZE);
- //printf("PLUGIN: App path: %s\nResources path: %s\nConfig path: %s\nPlugin path: %s\n", appPath, resourcesPath, configPath, pluginPath);
- int rc;
- rc = sqlite3_open("plugins/hemirt-bot/hemirt-bot.sqlite3", &db);
- if (rc) {
- fprintf(stderr, "Can't open database: %s\n", sqlite3_errmsg(db));
- sqlite3_close(db);
- return 1;
- }
- char *error;
- const char *sqlCreateTable = "CREATE TABLE IF NOT EXISTS Users(id INTEGER PRIMARY KEY ASC, ts3id TEXT UNIQUE, lastname TEXT, points INTEGER);";
- rc = sqlite3_exec(db, sqlCreateTable, NULL, NULL, &error);
- if (rc)
- {
- fprintf(stderr, "Error executing SQLite3 statement: %s\n", sqlite3_errmsg(db));
- }
- return 0; /* 0 = success, 1 = failure, -2 = failure but client will not show a "failed to load" warning */
- /* -2 is a very special case and should only be used if a plugin displays a dialog (e.g. overlay) asking the user to disable
- * the plugin again, avoiding the show another dialog by the client telling the user the plugin failed to load.
- * For normal case, if a plugin really failed to load because of an error, the correct return value is 1. */
- }
- /* Custom code called right before the plugin is unloaded */
- void ts3plugin_shutdown() {
- /* Your plugin cleanup code here */
- printf("PLUGIN: shutdown\n");
- sqlite3_close(db);
- /*
- * Note:
- * If your plugin implements a settings dialog, it must be closed and deleted here, else the
- * TeamSpeak client will most likely crash (DLL removed but dialog from DLL code still open).
- */
- /* Free pluginID if we registered it */
- threadlist.clear();
- if (pluginID) {
- free(pluginID);
- pluginID = NULL;
- }
- }
- /****************************** Optional functions ********************************/
- /*
- * Following functions are optional, if not needed you don't need to implement them.
- */
- /* Tell client if plugin offers a configuration window. If this function is not implemented, it's an assumed "does not offer" (PLUGIN_OFFERS_NO_CONFIGURE). */
- int ts3plugin_offersConfigure() {
- //printf("PLUGIN: offersConfigure\n");
- /*
- * Return values:
- * PLUGIN_OFFERS_NO_CONFIGURE - Plugin does not implement ts3plugin_configure
- * PLUGIN_OFFERS_CONFIGURE_NEW_THREAD - Plugin does implement ts3plugin_configure and requests to run this function in an own thread
- * PLUGIN_OFFERS_CONFIGURE_QT_THREAD - Plugin does implement ts3plugin_configure and requests to run this function in the Qt GUI thread
- */
- return PLUGIN_OFFERS_NO_CONFIGURE; /* In this case ts3plugin_configure does not need to be implemented */
- }
- /* Plugin might offer a configuration window. If ts3plugin_offersConfigure returns 0, this function does not need to be implemented. */
- //void ts3plugin_configure(void* handle, void* qParentWidget) {
- //printf("PLUGIN: configure\n");
- //}
- /*
- * If the plugin wants to use error return codes, plugin commands, hotkeys or menu items, 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 these features, this function can be omitted.
- * Note the passed pluginID parameter is no longer valid after calling this function, so you must copy it and store it in the plugin.
- */
- void ts3plugin_registerPluginID(const char* id) {
- const size_t sz = strlen(id) + 1;
- pluginID = (char*)malloc(sz * sizeof(char));
- _strcpy(pluginID, sz, id); /* The id buffer will invalidate after exiting this function */
- printf("PLUGIN: registerPluginID: %s\n", pluginID);
- }
- /* Plugin command keyword. Return NULL or "" if not used. */
- const char* ts3plugin_commandKeyword() {
- return "Hemirt";
- }
- /* 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;
- // int i = 0;
- // enum { CMD_NONE = 0, CMD_JOIN, CMD_COMMAND, CMD_SERVERINFO, CMD_CHANNELINFO, CMD_AVATAR, CMD_ENABLEMENU, CMD_SUBSCRIBE, CMD_UNSUBSCRIBE, CMD_SUBSCRIBEALL, CMD_UNSUBSCRIBEALL } cmd = CMD_NONE;
- //#ifdef _WIN32
- // char* context = NULL;
- //#endif
- //
- // printf("PLUGIN: process command: '%s'\n", command);
- //
- // _strcpy(buf, COMMAND_BUFSIZE, command);
- //#ifdef _WIN32
- // s = strtok_s(buf, " ", &context);
- //#else
- // s = strtok(buf, " ");
- //#endif
- // while(s != NULL) {
- // if(i == 0) {
- // if(!strcmp(s, "join")) {
- // cmd = CMD_JOIN;
- // } else if(!strcmp(s, "command")) {
- // cmd = CMD_COMMAND;
- // } else if(!strcmp(s, "serverinfo")) {
- // cmd = CMD_SERVERINFO;
- // } else if(!strcmp(s, "channelinfo")) {
- // cmd = CMD_CHANNELINFO;
- // } else if(!strcmp(s, "avatar")) {
- // cmd = CMD_AVATAR;
- // } else if(!strcmp(s, "enablemenu")) {
- // cmd = CMD_ENABLEMENU;
- // } else if(!strcmp(s, "subscribe")) {
- // cmd = CMD_SUBSCRIBE;
- // } else if(!strcmp(s, "unsubscribe")) {
- // cmd = CMD_UNSUBSCRIBE;
- // } else if(!strcmp(s, "subscribeall")) {
- // cmd = CMD_SUBSCRIBEALL;
- // } else if(!strcmp(s, "unsubscribeall")) {
- // cmd = CMD_UNSUBSCRIBEALL;
- // }
- // } else if(i == 1) {
- // param1 = s;
- // } else {
- // param2 = s;
- // }
- //#ifdef _WIN32
- // 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_JOIN: /* /test join <channelID> [optionalCannelPassword] */
- // if(param1) {
- // uint64 channelID = (uint64)atoi(param1);
- // char* password = param2 ? param2 : "";
- // char returnCode[RETURNCODE_BUFSIZE];
- // anyID myID;
- //
- // /* Get own clientID */
- // if(ts3Functions.getClientID(serverConnectionHandlerID, &myID) != ERROR_ok) {
- // ts3Functions.logMessage("Error querying client ID", LogLevel_ERROR, "Plugin", serverConnectionHandlerID);
- // break;
- // }
- //
- // /* Create return code for requestClientMove function call. If creation fails, returnCode will be NULL, which can be
- // * passed into the client functions meaning no return code is used.
- // * Note: To use return codes, the plugin needs to register a plugin ID using ts3plugin_registerPluginID */
- // ts3Functions.createReturnCode(pluginID, returnCode, RETURNCODE_BUFSIZE);
- //
- // /* In a real world plugin, the returnCode should be remembered (e.g. in a dynamic STL vector, if it's a C++ plugin).
- // * onServerErrorEvent can then check the received returnCode, compare with the remembered ones and thus identify
- // * which function call has triggered the event and react accordingly. */
- //
- // /* Request joining specified channel using above created return code */
- // if(ts3Functions.requestClientMove(serverConnectionHandlerID, myID, channelID, password, returnCode) != ERROR_ok) {
- // ts3Functions.logMessage("Error requesting client move", LogLevel_INFO, "Plugin", serverConnectionHandlerID);
- // }
- // } else {
- // ts3Functions.printMessageToCurrentTab("Missing channel ID parameter.");
- // }
- // break;
- // case CMD_COMMAND: /* /test command <command> */
- // if(param1) {
- // /* Send plugin command to all clients in current channel. In this case targetIds is unused and can be NULL. */
- // if(pluginID) {
- // /* See ts3plugin_registerPluginID for how to obtain a pluginID */
- // printf("PLUGIN: Sending plugin command to current channel: %s\n", param1);
- // ts3Functions.sendPluginCommand(serverConnectionHandlerID, pluginID, param1, PluginCommandTarget_CURRENT_CHANNEL, NULL, NULL);
- // } else {
- // printf("PLUGIN: Failed to send plugin command, was not registered.\n");
- // }
- // } else {
- // ts3Functions.printMessageToCurrentTab("Missing command parameter.");
- // }
- // break;
- // case CMD_SERVERINFO: { /* /test serverinfo */
- // /* Query host, port and server password of current server tab.
- // * The password parameter can be NULL if the plugin does not want to receive the server password.
- // * Note: Server password is only available if the user has actually used it when connecting. If a user has
- // * connected with the permission to ignore passwords (b_virtualserver_join_ignore_password) and the password,
- // * was not entered, it will not be available.
- // * getServerConnectInfo returns 0 on success, 1 on error or if current server tab is disconnected. */
- // char host[SERVERINFO_BUFSIZE];
- // /*char password[SERVERINFO_BUFSIZE];*/
- // char* password = NULL; /* Don't receive server password */
- // unsigned short port;
- // if(!ts3Functions.getServerConnectInfo(serverConnectionHandlerID, host, &port, password, SERVERINFO_BUFSIZE)) {
- // char msg[SERVERINFO_BUFSIZE];
- // snprintf(msg, sizeof(msg), "Server Connect Info: %s:%d", host, port);
- // ts3Functions.printMessageToCurrentTab(msg);
- // } else {
- // ts3Functions.printMessageToCurrentTab("No server connect info available.");
- // }
- // break;
- // }
- // case CMD_CHANNELINFO: { /* /test channelinfo */
- // /* Query channel path and password of current server tab.
- // * The password parameter can be NULL if the plugin does not want to receive the channel password.
- // * Note: Channel password is only available if the user has actually used it when entering the channel. If a user has
- // * entered a channel with the permission to ignore passwords (b_channel_join_ignore_password) and the password,
- // * was not entered, it will not be available.
- // * getChannelConnectInfo returns 0 on success, 1 on error or if current server tab is disconnected. */
- // char path[CHANNELINFO_BUFSIZE];
- // /*char password[CHANNELINFO_BUFSIZE];*/
- // char* password = NULL; /* Don't receive channel password */
- //
- // /* Get own clientID and channelID */
- // anyID myID;
- // uint64 myChannelID;
- // if(ts3Functions.getClientID(serverConnectionHandlerID, &myID) != ERROR_ok) {
- // ts3Functions.logMessage("Error querying client ID", LogLevel_ERROR, "Plugin", serverConnectionHandlerID);
- // break;
- // }
- // /* Get own channel ID */
- // if(ts3Functions.getChannelOfClient(serverConnectionHandlerID, myID, &myChannelID) != ERROR_ok) {
- // ts3Functions.logMessage("Error querying channel ID", LogLevel_ERROR, "Plugin", serverConnectionHandlerID);
- // break;
- // }
- //
- // /* Get channel connect info of own channel */
- // if(!ts3Functions.getChannelConnectInfo(serverConnectionHandlerID, myChannelID, path, password, CHANNELINFO_BUFSIZE)) {
- // char msg[CHANNELINFO_BUFSIZE];
- // snprintf(msg, sizeof(msg), "Channel Connect Info: %s", path);
- // ts3Functions.printMessageToCurrentTab(msg);
- // } else {
- // ts3Functions.printMessageToCurrentTab("No channel connect info available.");
- // }
- // break;
- // }
- // case CMD_AVATAR: { /* /test avatar <clientID> */
- // char avatarPath[PATH_BUFSIZE];
- // anyID clientID = (anyID)atoi(param1);
- // unsigned int error;
- //
- // memset(avatarPath, 0, PATH_BUFSIZE);
- // error = ts3Functions.getAvatar(serverConnectionHandlerID, clientID, avatarPath, PATH_BUFSIZE);
- // if(error == ERROR_ok) { /* ERROR_ok means the client has an avatar set. */
- // if(strlen(avatarPath)) { /* Avatar path contains the full path to the avatar image in the TS3Client cache directory */
- // printf("Avatar path: %s\n", avatarPath);
- // } else { /* Empty avatar path means the client has an avatar but the image has not yet been cached. The TeamSpeak
- // * client will automatically start the download and call onAvatarUpdated when done */
- // printf("Avatar not yet downloaded, waiting for onAvatarUpdated...\n");
- // }
- // } else if(error == ERROR_database_empty_result) { /* Not an error, the client simply has no avatar set */
- // printf("Client has no avatar\n");
- // } else { /* Other error occured (invalid server connection handler ID, invalid client ID, file io error etc) */
- // printf("Error getting avatar: %d\n", error);
- // }
- // break;
- // }
- // case CMD_ENABLEMENU: /* /test enablemenu <menuID> <0|1> */
- // if(param1) {
- // int menuID = atoi(param1);
- // int enable = param2 ? atoi(param2) : 0;
- // ts3Functions.setPluginMenuEnabled(pluginID, menuID, enable);
- // } else {
- // ts3Functions.printMessageToCurrentTab("Usage is: /test enablemenu <menuID> <0|1>");
- // }
- // break;
- // case CMD_SUBSCRIBE: /* /test subscribe <channelID> */
- // if(param1) {
- // char returnCode[RETURNCODE_BUFSIZE];
- // uint64 channelIDArray[2];
- // channelIDArray[0] = (uint64)atoi(param1);
- // channelIDArray[1] = 0;
- // ts3Functions.createReturnCode(pluginID, returnCode, RETURNCODE_BUFSIZE);
- // if(ts3Functions.requestChannelSubscribe(serverConnectionHandlerID, channelIDArray, returnCode) != ERROR_ok) {
- // ts3Functions.logMessage("Error subscribing channel", LogLevel_INFO, "Plugin", serverConnectionHandlerID);
- // }
- // }
- // break;
- // case CMD_UNSUBSCRIBE: /* /test unsubscribe <channelID> */
- // if(param1) {
- // char returnCode[RETURNCODE_BUFSIZE];
- // uint64 channelIDArray[2];
- // channelIDArray[0] = (uint64)atoi(param1);
- // channelIDArray[1] = 0;
- // ts3Functions.createReturnCode(pluginID, returnCode, RETURNCODE_BUFSIZE);
- // if(ts3Functions.requestChannelUnsubscribe(serverConnectionHandlerID, channelIDArray, NULL) != ERROR_ok) {
- // ts3Functions.logMessage("Error unsubscribing channel", LogLevel_INFO, "Plugin", serverConnectionHandlerID);
- // }
- // }
- // break;
- // case CMD_SUBSCRIBEALL: { /* /test subscribeall */
- // char returnCode[RETURNCODE_BUFSIZE];
- // ts3Functions.createReturnCode(pluginID, returnCode, RETURNCODE_BUFSIZE);
- // if(ts3Functions.requestChannelSubscribeAll(serverConnectionHandlerID, returnCode) != ERROR_ok) {
- // ts3Functions.logMessage("Error subscribing channel", LogLevel_INFO, "Plugin", serverConnectionHandlerID);
- // }
- // break;
- // }
- // case CMD_UNSUBSCRIBEALL: { /* /test unsubscribeall */
- // char returnCode[RETURNCODE_BUFSIZE];
- // ts3Functions.createReturnCode(pluginID, returnCode, RETURNCODE_BUFSIZE);
- // if(ts3Functions.requestChannelUnsubscribeAll(serverConnectionHandlerID, returnCode) != ERROR_ok) {
- // ts3Functions.logMessage("Error subscribing channel", LogLevel_INFO, "Plugin", serverConnectionHandlerID);
- // }
- // break;
- // }
- // }
- //
- // return 0; /* Plugin handled command */
- //}
- /* Client changed current server connection handler */
- //void ts3plugin_currentServerConnectionChanged(uint64 serverConnectionHandlerID) {
- // printf("PLUGIN: currentServerConnectionChanged %llu (%llu)\n", (long long unsigned int)serverConnectionHandlerID, (long long unsigned int)ts3Functions.getCurrentServerConnectionHandlerID());
- //}
- /*
- * Implement the following three functions when the plugin should display a line in the server/channel/client info.
- * If any of ts3plugin_infoTitle, ts3plugin_infoData or ts3plugin_freeMemory is missing, the info text will not be displayed.
- */
- /* Static title shown in the left column in the info frame */
- //const char* ts3plugin_infoTitle() {
- // return "Test plugin info";
- //}
- /*
- * Dynamic content shown in the right column in the info frame. Memory for the data string needs to be allocated in this
- * function. The client will call ts3plugin_freeMemory once done with the string to release the allocated memory again.
- * Check the parameter "type" if you want to implement this feature only for specific item types. Set the parameter
- * "data" to NULL to have the client ignore the info data.
- */
- //void ts3plugin_infoData(uint64 serverConnectionHandlerID, uint64 id, enum PluginItemType type, char** data) {
- // char* name;
- //
- // /* For demonstration purpose, display the name of the currently selected server, channel or client. */
- // switch(type) {
- // case PLUGIN_SERVER:
- // if(ts3Functions.getServerVariableAsString(serverConnectionHandlerID, VIRTUALSERVER_NAME, &name) != ERROR_ok) {
- // printf("Error getting virtual server name\n");
- // return;
- // }
- // break;
- // case PLUGIN_CHANNEL:
- // if(ts3Functions.getChannelVariableAsString(serverConnectionHandlerID, id, CHANNEL_NAME, &name) != ERROR_ok) {
- // printf("Error getting channel name\n");
- // return;
- // }
- // break;
- // case PLUGIN_CLIENT:
- // if(ts3Functions.getClientVariableAsString(serverConnectionHandlerID, (anyID)id, CLIENT_NICKNAME, &name) != ERROR_ok) {
- // printf("Error getting client nickname\n");
- // return;
- // }
- // break;
- // default:
- // printf("Invalid item type: %d\n", type);
- // data = NULL; /* Ignore */
- // return;
- // }
- //
- // *data = (char*)malloc(INFODATA_BUFSIZE * sizeof(char)); /* Must be allocated in the plugin! */
- // snprintf(*data, INFODATA_BUFSIZE, "The nickname is [I]\"%s\"[/I]", name); /* bbCode is supported. HTML is not supported */
- // ts3Functions.freeMemory(name);
- //}
- /* Required to release the memory for parameter "data" allocated in ts3plugin_infoData and ts3plugin_initMenus */
- void ts3plugin_freeMemory(void* data) {
- free(data);
- }
- /*
- * 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 */
- }
- /* Helper function to create a menu item */
- //static struct PluginMenuItem* createMenuItem(enum PluginMenuType type, int id, const char* text, const char* icon) {
- // struct PluginMenuItem* menuItem = (struct PluginMenuItem*)malloc(sizeof(struct PluginMenuItem));
- // menuItem->type = type;
- // menuItem->id = id;
- // _strcpy(menuItem->text, PLUGIN_MENU_BUFSZ, text);
- // _strcpy(menuItem->icon, PLUGIN_MENU_BUFSZ, icon);
- // return menuItem;
- //}
- //
- ///* Some makros to make the code to create menu items a bit more readable */
- //#define BEGIN_CREATE_MENUS(x) const size_t sz = x + 1; size_t n = 0; *menuItems = (struct PluginMenuItem**)malloc(sizeof(struct PluginMenuItem*) * sz);
- //#define CREATE_MENU_ITEM(a, b, c, d) (*menuItems)[n++] = createMenuItem(a, b, c, d);
- //#define END_CREATE_MENUS (*menuItems)[n++] = NULL; assert(n == sz);
- //
- ///*
- // * Menu IDs for this plugin. Pass these IDs when creating a menuitem to the TS3 client. When the menu item is triggered,
- // * ts3plugin_onMenuItemEvent will be called passing the menu ID of the triggered menu item.
- // * These IDs are freely choosable by the plugin author. It's not really needed to use an enum, it just looks prettier.
- // */
- //enum {
- // MENU_ID_CLIENT_1 = 1,
- // MENU_ID_CLIENT_2,
- // MENU_ID_CHANNEL_1,
- // MENU_ID_CHANNEL_2,
- // MENU_ID_CHANNEL_3,
- // MENU_ID_GLOBAL_1,
- // MENU_ID_GLOBAL_2
- //};
- //
- ///*
- // * Initialize plugin menus.
- // * This function is called after ts3plugin_init and ts3plugin_registerPluginID. A pluginID is required for plugin menus to work.
- // * Both ts3plugin_registerPluginID and ts3plugin_freeMemory must be implemented to use menus.
- // * If plugin menus are not used by a plugin, do not implement this function or return NULL.
- // */
- //void ts3plugin_initMenus(struct PluginMenuItem*** menuItems, char** menuIcon) {
- // /*
- // * Create the menus
- // * There are three types of menu items:
- // * - PLUGIN_MENU_TYPE_CLIENT: Client context menu
- // * - PLUGIN_MENU_TYPE_CHANNEL: Channel context menu
- // * - PLUGIN_MENU_TYPE_GLOBAL: "Plugins" menu in menu bar of main window
- // *
- // * Menu IDs are used to identify the menu item when ts3plugin_onMenuItemEvent is called
- // *
- // * The menu text is required, max length is 128 characters
- // *
- // * The icon is optional, max length is 128 characters. When not using icons, just pass an empty string.
- // * Icons are loaded from a subdirectory in the TeamSpeak client plugins folder. The subdirectory must be named like the
- // * plugin filename, without dll/so/dylib suffix
- // * e.g. for "test_plugin.dll", icon "1.png" is loaded from <TeamSpeak 3 Client install dir>\plugins\test_plugin\1.png
- // */
- //
- // BEGIN_CREATE_MENUS(7); /* IMPORTANT: Number of menu items must be correct! */
- // CREATE_MENU_ITEM(PLUGIN_MENU_TYPE_CLIENT, MENU_ID_CLIENT_1, "Client item 1", "1.png");
- // CREATE_MENU_ITEM(PLUGIN_MENU_TYPE_CLIENT, MENU_ID_CLIENT_2, "Client item 2", "2.png");
- // CREATE_MENU_ITEM(PLUGIN_MENU_TYPE_CHANNEL, MENU_ID_CHANNEL_1, "Channel item 1", "1.png");
- // CREATE_MENU_ITEM(PLUGIN_MENU_TYPE_CHANNEL, MENU_ID_CHANNEL_2, "Channel item 2", "2.png");
- // CREATE_MENU_ITEM(PLUGIN_MENU_TYPE_CHANNEL, MENU_ID_CHANNEL_3, "Channel item 3", "3.png");
- // CREATE_MENU_ITEM(PLUGIN_MENU_TYPE_GLOBAL, MENU_ID_GLOBAL_1, "Global item 1", "1.png");
- // CREATE_MENU_ITEM(PLUGIN_MENU_TYPE_GLOBAL, MENU_ID_GLOBAL_2, "Global item 2", "2.png");
- // END_CREATE_MENUS; /* Includes an assert checking if the number of menu items matched */
- //
- // /*
- // * Specify an optional icon for the plugin. This icon is used for the plugins submenu within context and main menus
- // * If unused, set menuIcon to NULL
- // */
- // *menuIcon = (char*)malloc(PLUGIN_MENU_BUFSZ * sizeof(char));
- // _strcpy(*menuIcon, PLUGIN_MENU_BUFSZ, "t.png");
- //
- // /*
- // * Menus can be enabled or disabled with: ts3Functions.setPluginMenuEnabled(pluginID, menuID, 0|1);
- // * Test it with plugin command: /test enablemenu <menuID> <0|1>
- // * Menus are enabled by default. Please note that shown menus will not automatically enable or disable when calling this function to
- // * ensure Qt menus are not modified by any thread other the UI thread. The enabled or disable state will change the next time a
- // * menu is displayed.
- // */
- // /* For example, this would disable MENU_ID_GLOBAL_2: */
- // /* ts3Functions.setPluginMenuEnabled(pluginID, MENU_ID_GLOBAL_2, 0); */
- //
- // /* All memory allocated in this function will be automatically released by the TeamSpeak client later by calling ts3plugin_freeMemory */
- //}
- //
- ///* Helper function to create a hotkey */
- //static struct PluginHotkey* createHotkey(const char* keyword, const char* description) {
- // struct PluginHotkey* hotkey = (struct PluginHotkey*)malloc(sizeof(struct PluginHotkey));
- // _strcpy(hotkey->keyword, PLUGIN_HOTKEY_BUFSZ, keyword);
- // _strcpy(hotkey->description, PLUGIN_HOTKEY_BUFSZ, description);
- // return hotkey;
- //}
- //
- ///* Some makros to make the code to create hotkeys a bit more readable */
- //#define BEGIN_CREATE_HOTKEYS(x) const size_t sz = x + 1; size_t n = 0; *hotkeys = (struct PluginHotkey**)malloc(sizeof(struct PluginHotkey*) * sz);
- //#define CREATE_HOTKEY(a, b) (*hotkeys)[n++] = createHotkey(a, b);
- //#define END_CREATE_HOTKEYS (*hotkeys)[n++] = NULL; assert(n == sz);
- //
- ///*
- // * Initialize plugin hotkeys. If your plugin does not use this feature, this function can be omitted.
- // * Hotkeys require ts3plugin_registerPluginID and ts3plugin_freeMemory to be implemented.
- // * This function is automatically called by the client after ts3plugin_init.
- // */
- //void ts3plugin_initHotkeys(struct PluginHotkey*** hotkeys) {
- // /* Register hotkeys giving a keyword and a description.
- // * The keyword will be later passed to ts3plugin_onHotkeyEvent to identify which hotkey was triggered.
- // * The description is shown in the clients hotkey dialog. */
- // BEGIN_CREATE_HOTKEYS(3); /* Create 3 hotkeys. Size must be correct for allocating memory. */
- // CREATE_HOTKEY("keyword_1", "Test hotkey 1");
- // CREATE_HOTKEY("keyword_2", "Test hotkey 2");
- // CREATE_HOTKEY("keyword_3", "Test hotkey 3");
- // END_CREATE_HOTKEYS;
- //
- // /* The client will call ts3plugin_freeMemory to release all allocated memory */
- //}
- /************************** TeamSpeak callbacks ***************************/
- /*
- * Following functions are optional, feel free to remove unused callbacks.
- * See the clientlib documentation for details on each function.
- */
- /* Clientlib */
- //void ts3plugin_onConnectStatusChangeEvent(uint64 serverConnectionHandlerID, int newStatus, unsigned int errorNumber) {
- // /* Some example code following to show how to use the information query functions. */
- //
- // if(newStatus == STATUS_CONNECTION_ESTABLISHED) { /* connection established and we have client and channels available */
- // char* s;
- // char msg[1024];
- // anyID myID;
- // uint64* ids;
- // size_t i;
- // unsigned int error;
- //
- // /* Print clientlib version */
- // if(ts3Functions.getClientLibVersion(&s) == ERROR_ok) {
- // printf("PLUGIN: Client lib version: %s\n", s);
- // ts3Functions.freeMemory(s); /* Release string */
- // } else {
- // ts3Functions.logMessage("Error querying client lib version", LogLevel_ERROR, "Plugin", serverConnectionHandlerID);
- // return;
- // }
- //
- // /* Write plugin name and version to log */
- // snprintf(msg, sizeof(msg), "Plugin %s, Version %s, Author: %s", ts3plugin_name(), ts3plugin_version(), ts3plugin_author());
- // ts3Functions.logMessage(msg, LogLevel_INFO, "Plugin", serverConnectionHandlerID);
- //
- // /* Print virtual server name */
- // if((error = ts3Functions.getServerVariableAsString(serverConnectionHandlerID, VIRTUALSERVER_NAME, &s)) != ERROR_ok) {
- // if(error != ERROR_not_connected) { /* Don't spam error in this case (failed to connect) */
- // ts3Functions.logMessage("Error querying server name", LogLevel_ERROR, "Plugin", serverConnectionHandlerID);
- // }
- // return;
- // }
- // printf("PLUGIN: Server name: %s\n", s);
- // ts3Functions.freeMemory(s);
- //
- // /* Print virtual server welcome message */
- // if(ts3Functions.getServerVariableAsString(serverConnectionHandlerID, VIRTUALSERVER_WELCOMEMESSAGE, &s) != ERROR_ok) {
- // ts3Functions.logMessage("Error querying server welcome message", LogLevel_ERROR, "Plugin", serverConnectionHandlerID);
- // return;
- // }
- // printf("PLUGIN: Server welcome message: %s\n", s);
- // ts3Functions.freeMemory(s); /* Release string */
- //
- // /* Print own client ID and nickname on this server */
- // if(ts3Functions.getClientID(serverConnectionHandlerID, &myID) != ERROR_ok) {
- // ts3Functions.logMessage("Error querying client ID", LogLevel_ERROR, "Plugin", serverConnectionHandlerID);
- // return;
- // }
- // if(ts3Functions.getClientSelfVariableAsString(serverConnectionHandlerID, CLIENT_NICKNAME, &s) != ERROR_ok) {
- // ts3Functions.logMessage("Error querying client nickname", LogLevel_ERROR, "Plugin", serverConnectionHandlerID);
- // return;
- // }
- // printf("PLUGIN: My client ID = %d, nickname = %s\n", myID, s);
- // ts3Functions.freeMemory(s);
- //
- // /* Print list of all channels on this server */
- // if(ts3Functions.getChannelList(serverConnectionHandlerID, &ids) != ERROR_ok) {
- // ts3Functions.logMessage("Error getting channel list", LogLevel_ERROR, "Plugin", serverConnectionHandlerID);
- // return;
- // }
- // printf("PLUGIN: Available channels:\n");
- // for(i=0; ids[i]; i++) {
- // /* Query channel name */
- // if(ts3Functions.getChannelVariableAsString(serverConnectionHandlerID, ids[i], CHANNEL_NAME, &s) != ERROR_ok) {
- // ts3Functions.logMessage("Error querying channel name", LogLevel_ERROR, "Plugin", serverConnectionHandlerID);
- // return;
- // }
- // printf("PLUGIN: Channel ID = %llu, name = %s\n", (long long unsigned int)ids[i], s);
- // ts3Functions.freeMemory(s);
- // }
- // ts3Functions.freeMemory(ids); /* Release array */
- //
- // /* Print list of existing server connection handlers */
- // printf("PLUGIN: Existing server connection handlers:\n");
- // if(ts3Functions.getServerConnectionHandlerList(&ids) != ERROR_ok) {
- // ts3Functions.logMessage("Error getting server list", LogLevel_ERROR, "Plugin", serverConnectionHandlerID);
- // return;
- // }
- // for(i=0; ids[i]; i++) {
- // if((error = ts3Functions.getServerVariableAsString(ids[i], VIRTUALSERVER_NAME, &s)) != ERROR_ok) {
- // if(error != ERROR_not_connected) { /* Don't spam error in this case (failed to connect) */
- // ts3Functions.logMessage("Error querying server name", LogLevel_ERROR, "Plugin", serverConnectionHandlerID);
- // }
- // continue;
- // }
- // printf("- %llu - %s\n", (long long unsigned int)ids[i], s);
- // ts3Functions.freeMemory(s);
- // }
- // ts3Functions.freeMemory(ids);
- // }
- //}
- //
- //void ts3plugin_onNewChannelEvent(uint64 serverConnectionHandlerID, uint64 channelID, uint64 channelParentID) {
- //}
- //
- //void ts3plugin_onNewChannelCreatedEvent(uint64 serverConnectionHandlerID, uint64 channelID, uint64 channelParentID, anyID invokerID, const char* invokerName, const char* invokerUniqueIdentifier) {
- //}
- //
- //void ts3plugin_onDelChannelEvent(uint64 serverConnectionHandlerID, uint64 channelID, anyID invokerID, const char* invokerName, const char* invokerUniqueIdentifier) {
- //}
- //
- //void ts3plugin_onChannelMoveEvent(uint64 serverConnectionHandlerID, uint64 channelID, uint64 newChannelParentID, anyID invokerID, const char* invokerName, const char* invokerUniqueIdentifier) {
- //}
- //
- //void ts3plugin_onUpdateChannelEvent(uint64 serverConnectionHandlerID, uint64 channelID) {
- //}
- //
- //void ts3plugin_onUpdateChannelEditedEvent(uint64 serverConnectionHandlerID, uint64 channelID, anyID invokerID, const char* invokerName, const char* invokerUniqueIdentifier) {
- //}
- //
- //void ts3plugin_onUpdateClientEvent(uint64 serverConnectionHandlerID, anyID clientID, anyID invokerID, const char* invokerName, const char* invokerUniqueIdentifier) {
- //}
- //
- //void ts3plugin_onClientMoveEvent(uint64 serverConnectionHandlerID, anyID clientID, uint64 oldChannelID, uint64 newChannelID, int visibility, const char* moveMessage) {
- //}
- //
- //void ts3plugin_onClientMoveSubscriptionEvent(uint64 serverConnectionHandlerID, anyID clientID, uint64 oldChannelID, uint64 newChannelID, int visibility) {
- //}
- //
- //void ts3plugin_onClientMoveTimeoutEvent(uint64 serverConnectionHandlerID, anyID clientID, uint64 oldChannelID, uint64 newChannelID, int visibility, const char* timeoutMessage) {
- //}
- //
- //void ts3plugin_onClientMoveMovedEvent(uint64 serverConnectionHandlerID, anyID clientID, uint64 oldChannelID, uint64 newChannelID, int visibility, anyID moverID, const char* moverName, const char* moverUniqueIdentifier, const char* moveMessage) {
- //}
- //
- //void ts3plugin_onClientKickFromChannelEvent(uint64 serverConnectionHandlerID, anyID clientID, uint64 oldChannelID, uint64 newChannelID, int visibility, anyID kickerID, const char* kickerName, const char* kickerUniqueIdentifier, const char* kickMessage) {
- //}
- //
- //void ts3plugin_onClientKickFromServerEvent(uint64 serverConnectionHandlerID, anyID clientID, uint64 oldChannelID, uint64 newChannelID, int visibility, anyID kickerID, const char* kickerName, const char* kickerUniqueIdentifier, const char* kickMessage) {
- //}
- //
- //void ts3plugin_onClientIDsEvent(uint64 serverConnectionHandlerID, const char* uniqueClientIdentifier, anyID clientID, const char* clientName) {
- //}
- //
- //void ts3plugin_onClientIDsFinishedEvent(uint64 serverConnectionHandlerID) {
- //}
- //
- //void ts3plugin_onServerEditedEvent(uint64 serverConnectionHandlerID, anyID editerID, const char* editerName, const char* editerUniqueIdentifier) {
- //}
- //
- //void ts3plugin_onServerUpdatedEvent(uint64 serverConnectionHandlerID) {
- //}
- //
- //int ts3plugin_onServerErrorEvent(uint64 serverConnectionHandlerID, const char* errorMessage, unsigned int error, const char* returnCode, const char* extraMessage) {
- // printf("PLUGIN: onServerErrorEvent %llu %s %d %s\n", (long long unsigned int)serverConnectionHandlerID, errorMessage, error, (returnCode ? returnCode : ""));
- // if(returnCode) {
- // /* A plugin could now check the returnCode with previously (when calling a function) remembered returnCodes and react accordingly */
- // /* In case of using a a plugin return code, the plugin can return:
- // * 0: Client will continue handling this error (print to chat tab)
- // * 1: Client will ignore this error, the plugin announces it has handled it */
- // return 1;
- // }
- // return 0; /* If no plugin return code was used, the return value of this function is ignored */
- //}
- //
- //void ts3plugin_onServerStopEvent(uint64 serverConnectionHandlerID, const char* shutdownMessage) {
- ////}
- //
- //int ts3plugin_onTextMessageEvent(uint64 serverConnectionHandlerID, anyID targetMode, anyID toID, anyID fromID, const char* fromName, const char* fromUniqueIdentifier, const char* message, int ffIgnored) {
- // printf("PLUGIN: onTextMessageEvent %llu %d %d %s %s %d\n", (long long unsigned int)serverConnectionHandlerID, targetMode, fromID, fromName, message, ffIgnored);
- //
- // /* Friend/Foe manager has ignored the message, so ignore here as well. */
- // if(ffIgnored) {
- // return 0; /* Client will ignore the message anyways, so return value here doesn't matter */
- // }
- //
- //#if 0
- // {
- // /* Example code: Autoreply to sender */
- // /* Disabled because quite annoying, but should give you some ideas what is possible here */
- // /* Careful, when two clients use this, they will get banned quickly... */
- // anyID myID;
- // if(ts3Functions.getClientID(serverConnectionHandlerID, &myID) != ERROR_ok) {
- // ts3Functions.logMessage("Error querying own client id", LogLevel_ERROR, "Plugin", serverConnectionHandlerID);
- // return 0;
- // }
- // if(fromID != myID) { /* Don't reply when source is own client */
- // if(ts3Functions.requestSendPrivateTextMsg(serverConnectionHandlerID, "Text message back!", fromID, NULL) != ERROR_ok) {
- // ts3Functions.logMessage("Error requesting send text message", LogLevel_ERROR, "Plugin", serverConnectionHandlerID);
- // }
- // }
- // }
- //#endif
- //
- // return 0; /* 0 = handle normally, 1 = client will ignore the text message */
- //}
- //void ts3plugin_onTalkStatusChangeEvent(uint64 serverConnectionHandlerID, int status, int isReceivedWhisper, anyID clientID) {
- // /* Demonstrate usage of getClientDisplayName */
- // char name[512];
- // if(ts3Functions.getClientDisplayName(serverConnectionHandlerID, clientID, name, 512) == ERROR_ok) {
- // if(status == STATUS_TALKING) {
- // printf("--> %s starts talking\n", name);
- // } else {
- // printf("--> %s stops talking\n", name);
- // }
- // }
- //}
- //
- //void ts3plugin_onConnectionInfoEvent(uint64 serverConnectionHandlerID, anyID clientID) {
- //}
- //
- //void ts3plugin_onServerConnectionInfoEvent(uint64 serverConnectionHandlerID) {
- //}
- //
- //void ts3plugin_onChannelSubscribeEvent(uint64 serverConnectionHandlerID, uint64 channelID) {
- //}
- //
- //void ts3plugin_onChannelSubscribeFinishedEvent(uint64 serverConnectionHandlerID) {
- //}
- //
- //void ts3plugin_onChannelUnsubscribeEvent(uint64 serverConnectionHandlerID, uint64 channelID) {
- //}
- //
- //void ts3plugin_onChannelUnsubscribeFinishedEvent(uint64 serverConnectionHandlerID) {
- //}
- //
- //void ts3plugin_onChannelDescriptionUpdateEvent(uint64 serverConnectionHandlerID, uint64 channelID) {
- //}
- //
- //void ts3plugin_onChannelPasswordChangedEvent(uint64 serverConnectionHandlerID, uint64 channelID) {
- //}
- //
- //void ts3plugin_onPlaybackShutdownCompleteEvent(uint64 serverConnectionHandlerID) {
- //}
- //
- //void ts3plugin_onSoundDeviceListChangedEvent(const char* modeID, int playOrCap) {
- //}
- //
- //void ts3plugin_onEditPlaybackVoiceDataEvent(uint64 serverConnectionHandlerID, anyID clientID, short* samples, int sampleCount, int channels) {
- //}
- //
- //void ts3plugin_onEditPostProcessVoiceDataEvent(uint64 serverConnectionHandlerID, anyID clientID, short* samples, int sampleCount, int channels, const unsigned int* channelSpeakerArray, unsigned int* channelFillMask) {
- //}
- //
- //void ts3plugin_onEditMixedPlaybackVoiceDataEvent(uint64 serverConnectionHandlerID, short* samples, int sampleCount, int channels, const unsigned int* channelSpeakerArray, unsigned int* channelFillMask) {
- //}
- //
- //void ts3plugin_onEditCapturedVoiceDataEvent(uint64 serverConnectionHandlerID, short* samples, int sampleCount, int channels, int* edited) {
- //}
- //
- //void ts3plugin_onCustom3dRolloffCalculationClientEvent(uint64 serverConnectionHandlerID, anyID clientID, float distance, float* volume) {
- //}
- //
- //void ts3plugin_onCustom3dRolloffCalculationWaveEvent(uint64 serverConnectionHandlerID, uint64 waveHandle, float distance, float* volume) {
- //}
- //
- //void ts3plugin_onUserLoggingMessageEvent(const char* logMessage, int logLevel, const char* logChannel, uint64 logID, const char* logTime, const char* completeLogString) {
- //}
- //
- ///* Clientlib rare */
- //
- //void ts3plugin_onClientBanFromServerEvent(uint64 serverConnectionHandlerID, anyID clientID, uint64 oldChannelID, uint64 newChannelID, int visibility, anyID kickerID, const char* kickerName, const char* kickerUniqueIdentifier, uint64 time, const char* kickMessage) {
- //}
- //
- //int ts3plugin_onClientPokeEvent(uint64 serverConnectionHandlerID, anyID fromClientID, const char* pokerName, const char* pokerUniqueIdentity, const char* message, int ffIgnored) {
- // anyID myID;
- //
- // printf("PLUGIN onClientPokeEvent: %llu %d %s %s %d\n", (long long unsigned int)serverConnectionHandlerID, fromClientID, pokerName, message, ffIgnored);
- //
- // /* Check if the Friend/Foe manager has already blocked this poke */
- // if(ffIgnored) {
- // return 0; /* Client will block anyways, doesn't matter what we return */
- // }
- //
- // /* Example code: Send text message back to poking client */
- // if(ts3Functions.getClientID(serverConnectionHandlerID, &myID) != ERROR_ok) { /* Get own client ID */
- // ts3Functions.logMessage("Error querying own client id", LogLevel_ERROR, "Plugin", serverConnectionHandlerID);
- // return 0;
- // }
- // if(fromClientID != myID) { /* Don't reply when source is own client */
- // if(ts3Functions.requestSendPrivateTextMsg(serverConnectionHandlerID, "Received your poke!", fromClientID, NULL) != ERROR_ok) {
- // ts3Functions.logMessage("Error requesting send text message", LogLevel_ERROR, "Plugin", serverConnectionHandlerID);
- // }
- // }
- //
- // return 0; /* 0 = handle normally, 1 = client will ignore the poke */
- //}
- //
- //void ts3plugin_onClientSelfVariableUpdateEvent(uint64 serverConnectionHandlerID, int flag, const char* oldValue, const char* newValue) {
- //}
- //
- //void ts3plugin_onFileListEvent(uint64 serverConnectionHandlerID, uint64 channelID, const char* path, const char* name, uint64 size, uint64 datetime, int type, uint64 incompletesize, const char* returnCode) {
- //}
- //
- //void ts3plugin_onFileListFinishedEvent(uint64 serverConnectionHandlerID, uint64 channelID, const char* path) {
- //}
- //
- //void ts3plugin_onFileInfoEvent(uint64 serverConnectionHandlerID, uint64 channelID, const char* name, uint64 size, uint64 datetime) {
- //}
- //
- //void ts3plugin_onServerGroupListEvent(uint64 serverConnectionHandlerID, uint64 serverGroupID, const char* name, int type, int iconID, int saveDB) {
- //}
- //
- //void ts3plugin_onServerGroupListFinishedEvent(uint64 serverConnectionHandlerID) {
- //}
- //
- //void ts3plugin_onServerGroupByClientIDEvent(uint64 serverConnectionHandlerID, const char* name, uint64 serverGroupList, uint64 clientDatabaseID) {
- //}
- //
- //void ts3plugin_onServerGroupPermListEvent(uint64 serverConnectionHandlerID, uint64 serverGroupID, unsigned int permissionID, int permissionValue, int permissionNegated, int permissionSkip) {
- //}
- //
- //void ts3plugin_onServerGroupPermListFinishedEvent(uint64 serverConnectionHandlerID, uint64 serverGroupID) {
- //}
- //
- //void ts3plugin_onServerGroupClientListEvent(uint64 serverConnectionHandlerID, uint64 serverGroupID, uint64 clientDatabaseID, const char* clientNameIdentifier, const char* clientUniqueID) {
- //}
- //
- //void ts3plugin_onChannelGroupListEvent(uint64 serverConnectionHandlerID, uint64 channelGroupID, const char* name, int type, int iconID, int saveDB) {
- //}
- //
- //void ts3plugin_onChannelGroupListFinishedEvent(uint64 serverConnectionHandlerID) {
- //}
- //
- //void ts3plugin_onChannelGroupPermListEvent(uint64 serverConnectionHandlerID, uint64 channelGroupID, unsigned int permissionID, int permissionValue, int permissionNegated, int permissionSkip) {
- //}
- //
- //void ts3plugin_onChannelGroupPermListFinishedEvent(uint64 serverConnectionHandlerID, uint64 channelGroupID) {
- //}
- //
- //void ts3plugin_onChannelPermListEvent(uint64 serverConnectionHandlerID, uint64 channelID, unsigned int permissionID, int permissionValue, int permissionNegated, int permissionSkip) {
- //}
- //
- //void ts3plugin_onChannelPermListFinishedEvent(uint64 serverConnectionHandlerID, uint64 channelID) {
- //}
- //
- //void ts3plugin_onClientPermListEvent(uint64 serverConnectionHandlerID, uint64 clientDatabaseID, unsigned int permissionID, int permissionValue, int permissionNegated, int permissionSkip) {
- //}
- //
- //void ts3plugin_onClientPermListFinishedEvent(uint64 serverConnectionHandlerID, uint64 clientDatabaseID) {
- //}
- //
- //void ts3plugin_onChannelClientPermListEvent(uint64 serverConnectionHandlerID, uint64 channelID, uint64 clientDatabaseID, unsigned int permissionID, int permissionValue, int permissionNegated, int permissionSkip) {
- //}
- //
- //void ts3plugin_onChannelClientPermListFinishedEvent(uint64 serverConnectionHandlerID, uint64 channelID, uint64 clientDatabaseID) {
- //}
- //
- //void ts3plugin_onClientChannelGroupChangedEvent(uint64 serverConnectionHandlerID, uint64 channelGroupID, uint64 channelID, anyID clientID, anyID invokerClientID, const char* invokerName, const char* invokerUniqueIdentity) {
- //}
- //
- //int ts3plugin_onServerPermissionErrorEvent(uint64 serverConnectionHandlerID, const char* errorMessage, unsigned int error, const char* returnCode, unsigned int failedPermissionID) {
- // return 0; /* See onServerErrorEvent for return code description */
- //}
- //
- //void ts3plugin_onPermissionListGroupEndIDEvent(uint64 serverConnectionHandlerID, unsigned int groupEndID) {
- //}
- //
- //void ts3plugin_onPermissionListEvent(uint64 serverConnectionHandlerID, unsigned int permissionID, const char* permissionName, const char* permissionDescription) {
- //}
- //
- //void ts3plugin_onPermissionListFinishedEvent(uint64 serverConnectionHandlerID) {
- //}
- //
- //void ts3plugin_onPermissionOverviewEvent(uint64 serverConnectionHandlerID, uint64 clientDatabaseID, uint64 channelID, int overviewType, uint64 overviewID1, uint64 overviewID2, unsigned int permissionID, int permissionValue, int permissionNegated, int permissionSkip) {
- //}
- //
- //void ts3plugin_onPermissionOverviewFinishedEvent(uint64 serverConnectionHandlerID) {
- //}
- //
- //void ts3plugin_onServerGroupClientAddedEvent(uint64 serverConnectionHandlerID, anyID clientID, const char* clientName, const char* clientUniqueIdentity, uint64 serverGroupID, anyID invokerClientID, const char* invokerName, const char* invokerUniqueIdentity) {
- //}
- //
- //void ts3plugin_onServerGroupClientDeletedEvent(uint64 serverConnectionHandlerID, anyID clientID, const char* clientName, const char* clientUniqueIdentity, uint64 serverGroupID, anyID invokerClientID, const char* invokerName, const char* invokerUniqueIdentity) {
- //}
- //
- //void ts3plugin_onClientNeededPermissionsEvent(uint64 serverConnectionHandlerID, unsigned int permissionID, int permissionValue) {
- //}
- //
- //void ts3plugin_onClientNeededPermissionsFinishedEvent(uint64 serverConnectionHandlerID) {
- //}
- //
- //void ts3plugin_onFileTransferStatusEvent(anyID transferID, unsigned int status, const char* statusMessage, uint64 remotefileSize, uint64 serverConnectionHandlerID) {
- //}
- //
- //void ts3plugin_onClientChatClosedEvent(uint64 serverConnectionHandlerID, anyID clientID, const char* clientUniqueIdentity) {
- //}
- //
- //void ts3plugin_onClientChatComposingEvent(uint64 serverConnectionHandlerID, anyID clientID, const char* clientUniqueIdentity) {
- //}
- //
- //void ts3plugin_onServerLogEvent(uint64 serverConnectionHandlerID, const char* logMsg) {
- //}
- //
- //void ts3plugin_onServerLogFinishedEvent(uint64 serverConnectionHandlerID, uint64 lastPos, uint64 fileSize) {
- //}
- //
- //void ts3plugin_onMessageListEvent(uint64 serverConnectionHandlerID, uint64 messageID, const char* fromClientUniqueIdentity, const char* subject, uint64 timestamp, int flagRead) {
- //}
- //
- //void ts3plugin_onMessageGetEvent(uint64 serverConnectionHandlerID, uint64 messageID, const char* fromClientUniqueIdentity, const char* subject, const char* message, uint64 timestamp) {
- //}
- //
- //void ts3plugin_onClientDBIDfromUIDEvent(uint64 serverConnectionHandlerID, const char* uniqueClientIdentifier, uint64 clientDatabaseID) {
- //}
- //
- //void ts3plugin_onClientNamefromUIDEvent(uint64 serverConnectionHandlerID, const char* uniqueClientIdentifier, uint64 clientDatabaseID, const char* clientNickName) {
- //}
- //
- //void ts3plugin_onClientNamefromDBIDEvent(uint64 serverConnectionHandlerID, const char* uniqueClientIdentifier, uint64 clientDatabaseID, const char* clientNickName) {
- //}
- //
- //void ts3plugin_onComplainListEvent(uint64 serverConnectionHandlerID, uint64 targetClientDatabaseID, const char* targetClientNickName, uint64 fromClientDatabaseID, const char* fromClientNickName, const char* complainReason, uint64 timestamp) {
- //}
- //
- //void ts3plugin_onBanListEvent(uint64 serverConnectionHandlerID, uint64 banid, const char* ip, const char* name, const char* uid, uint64 creationTime, uint64 durationTime, const char* invokerName,
- // uint64 invokercldbid, const char* invokeruid, const char* reason, int numberOfEnforcements, const char* lastNickName) {
- //}
- //
- //void ts3plugin_onClientServerQueryLoginPasswordEvent(uint64 serverConnectionHandlerID, const char* loginPassword) {
- //}
- //
- //void ts3plugin_onPluginCommandEvent(uint64 serverConnectionHandlerID, const char* pluginName, const char* pluginCommand) {
- // printf("ON PLUGIN COMMAND: %s %s\n", pluginName, pluginCommand);
- //}
- //
- //void ts3plugin_onIncomingClientQueryEvent(uint64 serverConnectionHandlerID, const char* commandText) {
- //}
- //
- //void ts3plugin_onServerTemporaryPasswordListEvent(uint64 serverConnectionHandlerID, const char* clientNickname, const char* uniqueClientIdentifier, const char* description, const char* password, uint64 timestampStart, uint64 timestampEnd, uint64 targetChannelID, const char* targetChannelPW) {
- //}
- //
- ///* Client UI callbacks */
- //
- ///*
- // * Called from client when an avatar image has been downloaded to or deleted from cache.
- // * This callback can be called spontaneously or in response to ts3Functions.getAvatar()
- // */
- //void ts3plugin_onAvatarUpdated(uint64 serverConnectionHandlerID, anyID clientID, const char* avatarPath) {
- // /* If avatarPath is NULL, the avatar got deleted */
- // /* If not NULL, avatarPath contains the path to the avatar file in the TS3Client cache */
- // if(avatarPath != NULL) {
- // printf("onAvatarUpdated: %llu %d %s\n", (long long unsigned int)serverConnectionHandlerID, clientID, avatarPath);
- // } else {
- // printf("onAvatarUpdated: %llu %d - deleted\n", (long long unsigned int)serverConnectionHandlerID, clientID);
- // }
- //}
- //
- ///*
- // * Called when a plugin menu item (see ts3plugin_initMenus) is triggered. Optional function, when not using plugin menus, do not implement this.
- // *
- // * Parameters:
- // * - serverConnectionHandlerID: ID of the current server tab
- // * - type: Type of the menu (PLUGIN_MENU_TYPE_CHANNEL, PLUGIN_MENU_TYPE_CLIENT or PLUGIN_MENU_TYPE_GLOBAL)
- // * - menuItemID: Id used when creating the menu item
- // * - selectedItemID: Channel or Client ID in the case of PLUGIN_MENU_TYPE_CHANNEL and PLUGIN_MENU_TYPE_CLIENT. 0 for PLUGIN_MENU_TYPE_GLOBAL.
- // */
- //void ts3plugin_onMenuItemEvent(uint64 serverConnectionHandlerID, enum PluginMenuType type, int menuItemID, uint64 selectedItemID) {
- // printf("PLUGIN: onMenuItemEvent: serverConnectionHandlerID=%llu, type=%d, menuItemID=%d, selectedItemID=%llu\n", (long long unsigned int)serverConnectionHandlerID, type, menuItemID, (long long unsigned int)selectedItemID);
- // switch(type) {
- // case PLUGIN_MENU_TYPE_GLOBAL:
- // /* Global menu item was triggered. selectedItemID is unused and set to zero. */
- // switch(menuItemID) {
- // case MENU_ID_GLOBAL_1:
- // /* Menu global 1 was triggered */
- // break;
- // case MENU_ID_GLOBAL_2:
- // /* Menu global 2 was triggered */
- // break;
- // default:
- // break;
- // }
- // break;
- // case PLUGIN_MENU_TYPE_CHANNEL:
- // /* Channel contextmenu item was triggered. selectedItemID is the channelID of the selected channel */
- // switch(menuItemID) {
- // case MENU_ID_CHANNEL_1:
- // /* Menu channel 1 was triggered */
- // break;
- // case MENU_ID_CHANNEL_2:
- // /* Menu channel 2 was triggered */
- // break;
- // case MENU_ID_CHANNEL_3:
- // /* Menu channel 3 was triggered */
- // break;
- // default:
- // break;
- // }
- // break;
- // case PLUGIN_MENU_TYPE_CLIENT:
- // /* Client contextmenu item was triggered. selectedItemID is the clientID of the selected client */
- // switch(menuItemID) {
- // case MENU_ID_CLIENT_1:
- // /* Menu client 1 was triggered */
- // break;
- // case MENU_ID_CLIENT_2:
- // /* Menu client 2 was triggered */
- // break;
- // default:
- // break;
- // }
- // break;
- // default:
- // break;
- // }
- //}
- //
- ///* This function is called if a plugin hotkey was pressed. Omit if hotkeys are unused. */
- //void ts3plugin_onHotkeyEvent(const char* keyword) {
- // printf("PLUGIN: Hotkey event: %s\n", keyword);
- // /* Identify the hotkey by keyword ("keyword_1", "keyword_2" or "keyword_3" in this example) and handle here... */
- //}
- //
- ///* Called when recording a hotkey has finished after calling ts3Functions.requestHotkeyInputDialog */
- //void ts3plugin_onHotkeyRecordedEvent(const char* keyword, const char* key) {
- //}
- //
- ///* Called when client custom nickname changed */
- //void ts3plugin_onClientDisplayNameChanged(uint64 serverConnectionHandlerID, anyID clientID, const char* displayName, const char* uniqueClientIdentifier) {
- //}
- //
- //int ts3plugin_onTextMessageEvent(uint64 serverConnectionHandlerID, anyID targetMode, anyID toID, anyID fromID, const char* fromName, const char* fromUniqueIdentifier, const char* message, int ffIgnored) {
- // printf("PLUGIN: onTextMessageEvent %llu %d %d %s %s %d\n", (long long unsigned int)serverConnectionHandlerID, targetMode, fromID, fromName, message, ffIgnored);
- //
- // /* Friend/Foe manager has ignored the message, so ignore here as well. */
- // if(ffIgnored) {
- // return 0; /* Client will ignore the message anyways, so return value here doesn't matter */
- // }
- //
- //
- //
- //#if 0
- // {
- // /* Example code: Autoreply to sender */
- // /* Disabled because quite annoying, but should give you some ideas what is possible here */
- // /* Careful, when two clients use this, they will get banned quickly... */
- // anyID myID;
- // if(ts3Functions.getClientID(serverConnectionHandlerID, &myID) != ERROR_ok) {
- // ts3Functions.logMessage("Error querying own client id", LogLevel_ERROR, "Plugin", serverConnectionHandlerID);
- // return 0;
- // }
- // if(fromID != myID) { /* Don't reply when source is own client */
- // if(ts3Functions.requestSendPrivateTextMsg(serverConnectionHandlerID, "Text message back!", fromID, NULL) != ERROR_ok) {
- // ts3Functions.logMessage("Error requesting send text message", LogLevel_ERROR, "Plugin", serverConnectionHandlerID);
- // }
- // }
- // }
- //#endif
- //
- // return 0; /* 0 = handle normally, 1 = client will ignore the text message */
- //}
- void addPoints(uint64 serverConnectionHandlerID)
- {
- anyID* ids;
- size_t i;
- /* Print list of all clients on this server */
- if (ts3Functions.getClientList(serverConnectionHandlerID, &ids) != ERROR_ok) {
- return;
- }
- std::map<char *, char *> unikidsnames;
- for (i = 0; ids[i]; i++) {
- char* unikveid;
- char* uzernejm;
- unsigned int error;
- error = ts3Functions.getClientVariableAsString(serverConnectionHandlerID, ids[i], CLIENT_UNIQUE_IDENTIFIER, &unikveid);
- if (error != ERROR_ok) continue;
- error = ts3Functions.getClientVariableAsString(serverConnectionHandlerID, ids[i], CLIENT_NICKNAME, &uzernejm);
- if (error != ERROR_ok) continue;
- std::pair<std::map<char *, char *>::iterator, bool> deg = unikidsnames.insert(std::pair<char *, char *>(unikveid, uzernejm));
- if (deg.second == true)
- {
- sqlite3_stmt * statement;
- sqlite3_prepare_v2(db, "INSERT OR IGNORE INTO Users('ts3id', 'lastname', 'points') VALUES(?, ?, 0);", -1, &statement, NULL);
- sqlite3_bind_text(statement, 1, unikveid, -1, 0);
- sqlite3_bind_text(statement, 2, uzernejm, -1, 0);
- sqlite3_step(statement);
- sqlite3_finalize(statement);
- sqlite3_prepare_v2(db, "UPDATE Users SET points = points + 15, lastname = ? WHERE ts3id = ?;", -1, &statement, NULL);
- sqlite3_bind_text(statement, 1, uzernejm, -1, 0);
- sqlite3_bind_text(statement, 2, unikveid, -1, 0);
- sqlite3_step(statement);
- sqlite3_finalize(statement);
- }
- ts3Functions.freeMemory(unikveid);
- ts3Functions.freeMemory(uzernejm);
- }
- ts3Functions.freeMemory(ids); /* Release array */
- }
- void pointsMinute(char* result, uint64 serverConnectionHandlerID)
- {
- while (threadlist.find(result) != threadlist.end())
- {
- char* resultc;
- unsigned int error;
- //printf("wut\n");
- error = ts3Functions.getServerVariableAsString(serverConnectionHandlerID, VIRTUALSERVER_UNIQUE_IDENTIFIER, &resultc);
- if (strcmp(resultc, result) != 0 || error != ERROR_ok)
- {
- if (error == ERROR_ok) ts3Functions.freeMemory(resultc);
- std::map<std::string, uint64>::iterator it;
- it = threadlist.find(result);
- threadlist.erase(it);
- //printf("erase %s\n", result);
- uint64* resulti;
- unsigned int errorz;
- errorz = ts3Functions.getServerConnectionHandlerList(&resulti);
- if (errorz != ERROR_ok) break;
- //printf("checking\n");
- for (int i = 0; resulti[i] != NULL; i++)
- {
- char* resultg;
- errorz = ts3Functions.getServerVariableAsString(resulti[i], VIRTUALSERVER_UNIQUE_IDENTIFIER, &resultg);
- if (errorz != ERROR_ok) continue;
- //printf("unique sv ids: %llu result: %s \n", resulti[i], resultg);
- if (strcmp(resultg, result) == 0)
- {
- std::pair<std::map<std::string, uint64>::iterator, bool> ret = threadlist.insert(std::pair<std::string, uint64>(resultg, resulti[i]));
- if (ret.second == true)
- {
- std::thread repeat(pointsMinute, resultg, resulti[i]);
- repeat.detach();
- //printf("thread made %s\n", resultg);
- }
- //else printf("no thread made (from thread) %s \n", resultg); //fnguje
- }
- }
- ts3Functions.freeMemory(resulti);
- break;
- }
- //printf("deges 5\n");
- addPoints(serverConnectionHandlerID);
- using namespace std::chrono_literals;
- auto start = std::chrono::high_resolution_clock::now();
- std::this_thread::sleep_for(5s);
- auto end = std::chrono::high_resolution_clock::now();
- }
- ts3Functions.freeMemory(result);
- return;
- }
- void ts3plugin_onConnectStatusChangeEvent(uint64 serverConnectionHandlerID, int newStatus, unsigned int errorNumber) {
- /* Some example code following to show how to use the information query functions. */
- if (newStatus == STATUS_CONNECTION_ESTABLISHED) { /* connection established and we have client and channels available */
- char* result;
- unsigned int error;
- error = ts3Functions.getServerVariableAsString(serverConnectionHandlerID, VIRTUALSERVER_UNIQUE_IDENTIFIER, &result);
- if (error != ERROR_ok) return;
- std::pair<std::map<std::string, uint64>::iterator, bool> ret = threadlist.insert(std::pair<std::string, uint64>(result, serverConnectionHandlerID));
- if (ret.second == true)
- {
- std::thread repeat(pointsMinute, result, serverConnectionHandlerID);
- repeat.detach();
- //printf("thread made %s\n", result);
- }
- //else printf("no thread made %s \n", result); //fnguje
- }
- if (newStatus == STATUS_DISCONNECTED) {
- //char* result;
- //ts3Functions.getServerVariableAsString(serverConnectionHandlerID, VIRTUALSERVER_UNIQUE_IDENTIFIER, &result);
- //std::map<std::string, bool>::iterator it;
- //it = threadlist.find(result);
- //threadlist.erase(it);
- //printf("result removed %s \n", result); //fnguje
- //bool zmena = false;
- //uint64* resulti;
- //unsigned int error;
- //error = ts3Functions.getServerConnectionHandlerList(&resulti);
- //printf("jantar %u", error);
- //if (error != ERROR_ok) return;
- //printf("jantar \n");
- //for (int i = 0; resulti[i] != NULL; i++)
- //{
- // char* resultg;
- // error = ts3Functions.getServerVariableAsString(resulti[i], VIRTUALSERVER_UNIQUE_IDENTIFIER, &resultg);
- // if (error != ERROR_ok) continue;
- // printf("unique sv ids: %llu result: %s \n", resulti[i], resultg);
- // std::map<std::string, uint64>::iterator itg = threadlist.find(resultg);
- // if (itg != threadlist.end() && itg->second != resulti[i])
- // {
- // itg->second = resulti[i];
- // zmena = true;
- // }
- // ts3Functions.freeMemory(resultg);
- //}
- //ts3Functions.freeMemory(resulti);
- }
- }
- int pointsof(const char* targetname, uint64 serverConnectionHandlerID)
- {
- char* s;
- anyID* ids;
- size_t i;
- int result;
- if (ts3Functions.getClientList(serverConnectionHandlerID, &ids) != ERROR_ok) {
- ts3Functions.logMessage("Error getting channel list", LogLevel_ERROR, "Plugin", serverConnectionHandlerID);
- return 0;
- }
- for (i = 0; ids[i]; i++)
- {
- if (ts3Functions.getClientVariableAsString(serverConnectionHandlerID, ids[i], CLIENT_NICKNAME, &s) != ERROR_ok) {
- ts3Functions.logMessage("Error querying channel name", LogLevel_ERROR, "Plugin", serverConnectionHandlerID);
- return -2;
- }
- if (strcmp(targetname, s) == 0)
- {
- char* unikveid;
- int error = ts3Functions.getClientVariableAsString(serverConnectionHandlerID, ids[i], CLIENT_UNIQUE_IDENTIFIER, &unikveid);
- if (error != ERROR_ok) continue;
- char *err_msg = 0;
- sqlite3_stmt *res;
- char *sql = "SELECT * FROM Users WHERE ts3id = ?";
- sqlite3_prepare_v2(db, sql, -1, &res, 0);
- sqlite3_bind_text(res, 1, unikveid, -1, 0);
- sqlite3_step(res);
- result = sqlite3_column_int(res, 3);
- //printf("result = %i", result);
- sqlite3_finalize(res);
- ts3Functions.freeMemory(unikveid);
- ts3Functions.freeMemory(s);
- ts3Functions.freeMemory(ids);
- return result;
- }
- ts3Functions.freeMemory(s);
- }
- ts3Functions.freeMemory(ids); /* Release array */
- return -1;
- }
- std::string gibPoints(const char* odhraca, const char* hracovy, const char * lastparametr, uint64 serverConnectionHandlerID)
- {
- char* s;
- char* unikveod = NULL;
- char* unikvekomu = NULL;
- bool fromSet = false;
- bool toSet = false;
- long long pocetPointu = atoll(lastparametr);
- anyID* ids;
- size_t i;
- if (ts3Functions.getClientList(serverConnectionHandlerID, &ids) != ERROR_ok) {
- ts3Functions.logMessage("Error getting channel list", LogLevel_ERROR, "Plugin", serverConnectionHandlerID);
- return 0;
- }
- for (i = 0; ids[i]; i++)
- {
- if (ts3Functions.getClientVariableAsString(serverConnectionHandlerID, ids[i], CLIENT_NICKNAME, &s) != ERROR_ok) {
- ts3Functions.logMessage("Error querying channel name", LogLevel_ERROR, "Plugin", serverConnectionHandlerID);
- return 0;
- }
- if (pocetPointu > 0)
- {
- int hracovyid;
- if (strcmp(odhraca, s) == 0)
- {
- ts3Functions.getClientVariableAsString(serverConnectionHandlerID, ids[i], CLIENT_UNIQUE_IDENTIFIER, &unikveod);
- fromSet = true;
- }
- if (strcmp(hracovy, s) == 0)
- {
- ts3Functions.getClientVariableAsString(serverConnectionHandlerID, ids[i], CLIENT_UNIQUE_IDENTIFIER, &unikvekomu);
- toSet = true;
- hracovyid = ids[i];
- }
- //printf("========\n%s %s\n", unikveod, unikvekomu);
- if (fromSet && toSet)
- {
- int points = pointsof(hracovy, serverConnectionHandlerID);
- int mojepoints = pointsof(odhraca, serverConnectionHandlerID);
- if (mojepoints >= pocetPointu)
- {
- //sql
- sqlite3_stmt * statement;
- int popointy = mojepoints - (int)pocetPointu;
- sqlite3_prepare_v2(db, "UPDATE Users SET points = ? WHERE ts3id = ?;", -1, &statement, NULL);
- sqlite3_bind_int(statement, 1, popointy);
- sqlite3_bind_text(statement, 2, unikveod, -1, 0);
- sqlite3_step(statement);
- sqlite3_finalize(statement);
- popointy = mojepoints + (int)pocetPointu;
- sqlite3_prepare_v2(db, "UPDATE Users SET points = ? WHERE ts3id = ?;", -1, &statement, NULL);
- sqlite3_bind_int(statement, 1, popointy);
- sqlite3_bind_text(statement, 2, unikvekomu, -1, 0);
- sqlite3_step(statement);
- sqlite3_finalize(statement);
- //sql
- ts3Functions.freeMemory(unikvekomu);
- ts3Functions.freeMemory(unikveod);
- ts3Functions.freeMemory(ids);
- std::string sprava = botTag;
- sprava += "You have given: [b]";
- sprava += std::to_string(pocetPointu);
- sprava += "[/b] points to: [b]";
- sprava += hracovy;
- sprava += "[/b]";
- std::string spravadva = botTag;
- spravadva += "You have received: [b]";
- spravadva += std::to_string(pocetPointu);
- spravadva += "[/b] Points from [b]";
- spravadva += odhraca;
- spravadva += "[/b]";
- ts3Functions.requestSendPrivateTextMsg(serverConnectionHandlerID, spravadva.c_str(), hracovyid, NULL);
- return sprava;
- }
- else
- {
- ts3Functions.freeMemory(unikvekomu);
- ts3Functions.freeMemory(unikveod);
- ts3Functions.freeMemory(ids);
- return "Not enough points";
- }
- }
- }
- ts3Functions.freeMemory(s);
- if (toSet) ts3Functions.freeMemory(unikvekomu);
- if (fromSet) ts3Functions.freeMemory(unikveod);
- }
- ts3Functions.freeMemory(ids); /* Release array */
- return 0;
- }
- int ts3plugin_onTextMessageEvent(uint64 serverConnectionHandlerID, anyID targetMode, anyID toID, anyID fromID, const char* fromName, const char* fromUniqueIdentifier, const char* message, int ffIgnored) {
- printf("PLUGIN: onTextMessageEvent %llu %d %d %s %s %d\n", (long long unsigned int)serverConnectionHandlerID, targetMode, fromID, fromName, message, ffIgnored);
- if (strncmp(message, botTag, strlen(botTag)) == 0)
- {
- return 0;
- }
- if (strncmp(message, "!points", strlen("!points")) == 0)
- {
- if (strlen(message) == strlen("!points") || strlen(message) == strlen("!points "))
- {
- int points = pointsof(fromName, serverConnectionHandlerID);
- std::string msgback = botTag;
- msgback += "You have [b]";
- msgback += std::to_string(points);
- msgback += "[/b] points.";
- ts3Functions.requestSendPrivateTextMsg(serverConnectionHandlerID, msgback.c_str(), fromID, NULL);
- return 0;
- }
- const char * parametr = message + strlen("!points") + 1;
- int points = pointsof(parametr, serverConnectionHandlerID);
- if (points == -1)
- {
- std::string msgback = botTag;
- msgback += "User named [b] ";
- msgback += parametr;
- msgback += "[/b] not found.";
- ts3Functions.requestSendPrivateTextMsg(serverConnectionHandlerID, msgback.c_str(), fromID, NULL);
- return 0;
- }
- else if (points == -2) return 0; // error
- else
- {
- std::string msgback = botTag;
- msgback += "[b]";
- msgback += parametr;
- msgback += "[/b] has [b]";
- msgback += std::to_string(points);
- msgback += "[/b] points.";
- ts3Functions.requestSendPrivateTextMsg(serverConnectionHandlerID, msgback.c_str(), fromID, NULL);
- return 0;
- }
- }
- if (strncmp(message, "!gibpoints", strlen("!gibpoints")) == 0)
- {
- if (strlen(message) <= strlen("!gibpoints") + 1)
- {
- std::stringstream stringStream;
- stringStream << botTag << "Correct syntax: [b]!gibpoints[/b] [i]username[/i] [i]number[/i].";
- ts3Functions.requestSendPrivateTextMsg(serverConnectionHandlerID, stringStream.str().c_str(), fromID, NULL);
- return 0;
- }
- const char * parametr = message + strlen("!gibpoints") + 1;
- std::string msgback = botTag;
- const char * lastparametr = strrchr(parametr, ' ');
- if (lastparametr == NULL)
- {
- std::stringstream stringStream;
- stringStream << botTag << "Correct syntax: [b]!gibpoints[/b] [i]username[/i] [i]number[/i].";
- ts3Functions.requestSendPrivateTextMsg(serverConnectionHandlerID, stringStream.str().c_str(), fromID, NULL);
- return 0;
- }
- lastparametr++; //zbaveni se mezery
- std::string name = parametr;
- name = name.substr(0, name.size() - strlen(lastparametr) - 1);
- int points = pointsof(name.c_str(), serverConnectionHandlerID);
- if (strlen(message) != strlen("!gibpoints") && strlen(message) != strlen("!gibpoints "))
- {
- if (strlen(name.c_str()) == 0 || strlen(lastparametr) == 0)
- {
- std::stringstream stringStream;
- stringStream << botTag << "Correct syntax: [b]!gibpoints[/b] [i]username[/i] [i]number[/i].";
- ts3Functions.requestSendPrivateTextMsg(serverConnectionHandlerID, stringStream.str().c_str(), fromID, NULL);
- return 0;
- }
- if (points == -1)
- {
- msgback += "User named [b] ";
- msgback += name.c_str();
- msgback += "[/b] not found.";
- ts3Functions.requestSendPrivateTextMsg(serverConnectionHandlerID, msgback.c_str(), fromID, NULL);
- return 0;
- }
- else if (points == -2) return 0; // error
- else
- {
- if (atoi(lastparametr) > 0) {
- //kto //komu //kolko //server
- std::string sprava;
- //vo funkci to posle spravu aj cielu btw :D ked tak nezabudnut
- sprava += gibPoints(fromName, name.c_str(), lastparametr, serverConnectionHandlerID);
- ts3Functions.requestSendPrivateTextMsg(serverConnectionHandlerID, sprava.c_str(), fromID, NULL);
- }
- return 0;
- }
- }
- }
- return 0; /* 0 = handle normally, 1 = client will ignore the text message */
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement