commit 903f8fe99a1283e601feacacd6b035ca6d9004aa Author: Niklas Date: Fri Sep 4 19:32:12 2020 +0200 initial commit diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..6a5ccf0 --- /dev/null +++ b/.gitignore @@ -0,0 +1,3 @@ +/_obj +*.o +tsgo_export.h \ No newline at end of file diff --git a/Makefile b/Makefile new file mode 100644 index 0000000..6b8f5d5 --- /dev/null +++ b/Makefile @@ -0,0 +1,18 @@ +CFLAGS = -c -O2 -Wall -fPIC + +all: ts3_plugin.so + +tsgo_export.h: src/go/tsgo_export.go + C_INCLUDE_PATH="ts3client-pluginsdk/include:src/c" go tool cgo -exportheader $@ $^ + +tsgo_export.a: src/go/tsgo_export.go plugin.o + CGO_CFLAGS="-Its3client-pluginsdk/include -Isrc/c" go build -buildmode=c-archive src/go/tsgo_export.go + +plugin.o: src/c/plugin.c tsgo_export.h + gcc src/c/plugin.c -o plugin.o -Its3client-pluginsdk/include -Isrc/c $(CFLAGS) + +ts3_plugin.so: plugin.o tsgo_export.a + gcc -o $@ -shared -lpthread $^ + +clean: + rm -rf plugin.o tsgo_export.a tsgo_export.h _cgo_export.h ts3_plugin.so _obj diff --git a/src/c/plugin.c b/src/c/plugin.c new file mode 100644 index 0000000..3120ee8 --- /dev/null +++ b/src/c/plugin.c @@ -0,0 +1,99 @@ +#include +#include +#include + +#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 "../../tsgo_export.h" +#include "ts3FunctionsWrapper.h" + +static struct TS3Functions ts3Functions; + +#define _strcpy(dest, destSize, src) { strncpy(dest, src, destSize-1); (dest)[destSize-1] = '\0'; } + +static char* pluginID = NULL; + +/*********************************** 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 GoTs3pluginName(); +} + +/* Plugin version */ +const char* ts3plugin_version() { + return GoTs3pluginVersion(); +} + +/* Plugin API version. Must be the same as the clients API major version, else the plugin fails to load. */ +int ts3plugin_apiVersion() { + return GoTs3pluginAPIVersion(); +} + +/* Plugin author */ +const char* ts3plugin_author() { + return GoTs3pluginAuthor(); +} + +/* Plugin description */ +const char* ts3plugin_description() { + return GoTs3pluginDescription(); +} + +/* 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 GoTs3pluginInit(); + /* 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() { + + GoTs3pluginShutdown(); + + /* Free pluginID if we registered it */ + if(pluginID) { + free(pluginID); + pluginID = NULL; + } +} + + +/* + Not so required functions +*/ + +int ts3plugin_onClientPokeEvent(uint64 serverConnectionHandlerID, anyID fromClientID, const char* pokerName, const char* pokerUniqueIdentity, const char* message, int ffIgnored) { + return GoTs3onClientPokeEvent(serverConnectionHandlerID,fromClientID,pokerName,pokerUniqueIdentity,message,ffIgnored); +} + +/* + Ts3 Functions + + This wrapper is required beacuse calling function pointers is not supported in cgo. +*/ + +void Ts3FncPrintMessage(uint64 serverConnectionHandlerID, const char* message, enum PluginMessageTarget messageTarget){ + ts3Functions.printMessage(serverConnectionHandlerID,message,messageTarget); +} diff --git a/src/c/plugin.h b/src/c/plugin.h new file mode 100644 index 0000000..9426c93 --- /dev/null +++ b/src/c/plugin.h @@ -0,0 +1,144 @@ +#ifndef PLUGIN_H +#define PLUGIN_H + +#if defined(WIN32) || defined(__WIN32__) || defined(_WIN32) +#define PLUGINS_EXPORTDLL __declspec(dllexport) +#else +#define PLUGINS_EXPORTDLL __attribute__ ((visibility("default"))) +#endif + +#ifdef __cplusplus +extern "C" { +#endif + +/* 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 int ts3plugin_offersConfigure(); +PLUGINS_EXPORTDLL void ts3plugin_configure(void* handle, void* qParentWidget); +PLUGINS_EXPORTDLL void ts3plugin_registerPluginID(const char* id); +PLUGINS_EXPORTDLL const char* ts3plugin_commandKeyword(); +PLUGINS_EXPORTDLL int ts3plugin_processCommand(uint64 serverConnectionHandlerID, const char* command); +PLUGINS_EXPORTDLL void ts3plugin_currentServerConnectionChanged(uint64 serverConnectionHandlerID); +PLUGINS_EXPORTDLL const char* ts3plugin_infoTitle(); +PLUGINS_EXPORTDLL void ts3plugin_infoData(uint64 serverConnectionHandlerID, uint64 id, enum PluginItemType type, char** data); +PLUGINS_EXPORTDLL void ts3plugin_freeMemory(void* data); +PLUGINS_EXPORTDLL int ts3plugin_requestAutoload(); +PLUGINS_EXPORTDLL void ts3plugin_initMenus(struct PluginMenuItem*** menuItems, char** menuIcon); +PLUGINS_EXPORTDLL void ts3plugin_initHotkeys(struct PluginHotkey*** hotkeys); + +/* Clientlib */ +PLUGINS_EXPORTDLL void ts3plugin_onConnectStatusChangeEvent(uint64 serverConnectionHandlerID, int newStatus, unsigned int errorNumber); +PLUGINS_EXPORTDLL void ts3plugin_onNewChannelEvent(uint64 serverConnectionHandlerID, uint64 channelID, uint64 channelParentID); +PLUGINS_EXPORTDLL void ts3plugin_onNewChannelCreatedEvent(uint64 serverConnectionHandlerID, uint64 channelID, uint64 channelParentID, anyID invokerID, const char* invokerName, const char* invokerUniqueIdentifier); +PLUGINS_EXPORTDLL void ts3plugin_onDelChannelEvent(uint64 serverConnectionHandlerID, uint64 channelID, anyID invokerID, const char* invokerName, const char* invokerUniqueIdentifier); +PLUGINS_EXPORTDLL void ts3plugin_onChannelMoveEvent(uint64 serverConnectionHandlerID, uint64 channelID, uint64 newChannelParentID, anyID invokerID, const char* invokerName, const char* invokerUniqueIdentifier); +PLUGINS_EXPORTDLL void ts3plugin_onUpdateChannelEvent(uint64 serverConnectionHandlerID, uint64 channelID); +PLUGINS_EXPORTDLL void ts3plugin_onUpdateChannelEditedEvent(uint64 serverConnectionHandlerID, uint64 channelID, anyID invokerID, const char* invokerName, const char* invokerUniqueIdentifier); +PLUGINS_EXPORTDLL void ts3plugin_onUpdateClientEvent(uint64 serverConnectionHandlerID, anyID clientID, anyID invokerID, const char* invokerName, const char* invokerUniqueIdentifier); +PLUGINS_EXPORTDLL void ts3plugin_onClientMoveEvent(uint64 serverConnectionHandlerID, anyID clientID, uint64 oldChannelID, uint64 newChannelID, int visibility, const char* moveMessage); +PLUGINS_EXPORTDLL void ts3plugin_onClientMoveSubscriptionEvent(uint64 serverConnectionHandlerID, anyID clientID, uint64 oldChannelID, uint64 newChannelID, int visibility); +PLUGINS_EXPORTDLL void ts3plugin_onClientMoveTimeoutEvent(uint64 serverConnectionHandlerID, anyID clientID, uint64 oldChannelID, uint64 newChannelID, int visibility, const char* timeoutMessage); +PLUGINS_EXPORTDLL void ts3plugin_onClientMoveMovedEvent(uint64 serverConnectionHandlerID, anyID clientID, uint64 oldChannelID, uint64 newChannelID, int visibility, anyID moverID, const char* moverName, const char* moverUniqueIdentifier, const char* moveMessage); +PLUGINS_EXPORTDLL void ts3plugin_onClientKickFromChannelEvent(uint64 serverConnectionHandlerID, anyID clientID, uint64 oldChannelID, uint64 newChannelID, int visibility, anyID kickerID, const char* kickerName, const char* kickerUniqueIdentifier, const char* kickMessage); +PLUGINS_EXPORTDLL void ts3plugin_onClientKickFromServerEvent(uint64 serverConnectionHandlerID, anyID clientID, uint64 oldChannelID, uint64 newChannelID, int visibility, anyID kickerID, const char* kickerName, const char* kickerUniqueIdentifier, const char* kickMessage); +PLUGINS_EXPORTDLL void ts3plugin_onClientIDsEvent(uint64 serverConnectionHandlerID, const char* uniqueClientIdentifier, anyID clientID, const char* clientName); +PLUGINS_EXPORTDLL void ts3plugin_onClientIDsFinishedEvent(uint64 serverConnectionHandlerID); +PLUGINS_EXPORTDLL void ts3plugin_onServerEditedEvent(uint64 serverConnectionHandlerID, anyID editerID, const char* editerName, const char* editerUniqueIdentifier); +PLUGINS_EXPORTDLL void ts3plugin_onServerUpdatedEvent(uint64 serverConnectionHandlerID); +PLUGINS_EXPORTDLL int ts3plugin_onServerErrorEvent(uint64 serverConnectionHandlerID, const char* errorMessage, unsigned int error, const char* returnCode, const char* extraMessage); +PLUGINS_EXPORTDLL void ts3plugin_onServerStopEvent(uint64 serverConnectionHandlerID, const char* shutdownMessage); +PLUGINS_EXPORTDLL int ts3plugin_onTextMessageEvent(uint64 serverConnectionHandlerID, anyID targetMode, anyID toID, anyID fromID, const char* fromName, const char* fromUniqueIdentifier, const char* message, int ffIgnored); +PLUGINS_EXPORTDLL void ts3plugin_onTalkStatusChangeEvent(uint64 serverConnectionHandlerID, int status, int isReceivedWhisper, anyID clientID); +PLUGINS_EXPORTDLL void ts3plugin_onConnectionInfoEvent(uint64 serverConnectionHandlerID, anyID clientID); +PLUGINS_EXPORTDLL void ts3plugin_onServerConnectionInfoEvent(uint64 serverConnectionHandlerID); +PLUGINS_EXPORTDLL void ts3plugin_onChannelSubscribeEvent(uint64 serverConnectionHandlerID, uint64 channelID); +PLUGINS_EXPORTDLL void ts3plugin_onChannelSubscribeFinishedEvent(uint64 serverConnectionHandlerID); +PLUGINS_EXPORTDLL void ts3plugin_onChannelUnsubscribeEvent(uint64 serverConnectionHandlerID, uint64 channelID); +PLUGINS_EXPORTDLL void ts3plugin_onChannelUnsubscribeFinishedEvent(uint64 serverConnectionHandlerID); +PLUGINS_EXPORTDLL void ts3plugin_onChannelDescriptionUpdateEvent(uint64 serverConnectionHandlerID, uint64 channelID); +PLUGINS_EXPORTDLL void ts3plugin_onChannelPasswordChangedEvent(uint64 serverConnectionHandlerID, uint64 channelID); +PLUGINS_EXPORTDLL void ts3plugin_onPlaybackShutdownCompleteEvent(uint64 serverConnectionHandlerID); +PLUGINS_EXPORTDLL void ts3plugin_onSoundDeviceListChangedEvent(const char* modeID, int playOrCap); +PLUGINS_EXPORTDLL void ts3plugin_onEditPlaybackVoiceDataEvent(uint64 serverConnectionHandlerID, anyID clientID, short* samples, int sampleCount, int channels); +PLUGINS_EXPORTDLL void ts3plugin_onEditPostProcessVoiceDataEvent(uint64 serverConnectionHandlerID, anyID clientID, short* samples, int sampleCount, int channels, const unsigned int* channelSpeakerArray, unsigned int* channelFillMask); +PLUGINS_EXPORTDLL void ts3plugin_onEditMixedPlaybackVoiceDataEvent(uint64 serverConnectionHandlerID, short* samples, int sampleCount, int channels, const unsigned int* channelSpeakerArray, unsigned int* channelFillMask); +PLUGINS_EXPORTDLL void ts3plugin_onEditCapturedVoiceDataEvent(uint64 serverConnectionHandlerID, short* samples, int sampleCount, int channels, int* edited); +PLUGINS_EXPORTDLL void ts3plugin_onCustom3dRolloffCalculationClientEvent(uint64 serverConnectionHandlerID, anyID clientID, float distance, float* volume); +PLUGINS_EXPORTDLL void ts3plugin_onCustom3dRolloffCalculationWaveEvent(uint64 serverConnectionHandlerID, uint64 waveHandle, float distance, float* volume); +PLUGINS_EXPORTDLL void ts3plugin_onUserLoggingMessageEvent(const char* logMessage, int logLevel, const char* logChannel, uint64 logID, const char* logTime, const char* completeLogString); + +/* Clientlib rare */ +PLUGINS_EXPORTDLL 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); +PLUGINS_EXPORTDLL int ts3plugin_onClientPokeEvent(uint64 serverConnectionHandlerID, anyID fromClientID, const char* pokerName, const char* pokerUniqueIdentity, const char* message, int ffIgnored); +PLUGINS_EXPORTDLL void ts3plugin_onClientSelfVariableUpdateEvent(uint64 serverConnectionHandlerID, int flag, const char* oldValue, const char* newValue); +PLUGINS_EXPORTDLL void ts3plugin_onFileListEvent(uint64 serverConnectionHandlerID, uint64 channelID, const char* path, const char* name, uint64 size, uint64 datetime, int type, uint64 incompletesize, const char* returnCode); +PLUGINS_EXPORTDLL void ts3plugin_onFileListFinishedEvent(uint64 serverConnectionHandlerID, uint64 channelID, const char* path); +PLUGINS_EXPORTDLL void ts3plugin_onFileInfoEvent(uint64 serverConnectionHandlerID, uint64 channelID, const char* name, uint64 size, uint64 datetime); +PLUGINS_EXPORTDLL void ts3plugin_onServerGroupListEvent(uint64 serverConnectionHandlerID, uint64 serverGroupID, const char* name, int type, int iconID, int saveDB); +PLUGINS_EXPORTDLL void ts3plugin_onServerGroupListFinishedEvent(uint64 serverConnectionHandlerID); +PLUGINS_EXPORTDLL void ts3plugin_onServerGroupByClientIDEvent(uint64 serverConnectionHandlerID, const char* name, uint64 serverGroupList, uint64 clientDatabaseID); +PLUGINS_EXPORTDLL void ts3plugin_onServerGroupPermListEvent(uint64 serverConnectionHandlerID, uint64 serverGroupID, unsigned int permissionID, int permissionValue, int permissionNegated, int permissionSkip); +PLUGINS_EXPORTDLL void ts3plugin_onServerGroupPermListFinishedEvent(uint64 serverConnectionHandlerID, uint64 serverGroupID); +PLUGINS_EXPORTDLL void ts3plugin_onServerGroupClientListEvent(uint64 serverConnectionHandlerID, uint64 serverGroupID, uint64 clientDatabaseID, const char* clientNameIdentifier, const char* clientUniqueID); +PLUGINS_EXPORTDLL void ts3plugin_onChannelGroupListEvent(uint64 serverConnectionHandlerID, uint64 channelGroupID, const char* name, int type, int iconID, int saveDB); +PLUGINS_EXPORTDLL void ts3plugin_onChannelGroupListFinishedEvent(uint64 serverConnectionHandlerID); +PLUGINS_EXPORTDLL void ts3plugin_onChannelGroupPermListEvent(uint64 serverConnectionHandlerID, uint64 channelGroupID, unsigned int permissionID, int permissionValue, int permissionNegated, int permissionSkip); +PLUGINS_EXPORTDLL void ts3plugin_onChannelGroupPermListFinishedEvent(uint64 serverConnectionHandlerID, uint64 channelGroupID); +PLUGINS_EXPORTDLL void ts3plugin_onChannelPermListEvent(uint64 serverConnectionHandlerID, uint64 channelID, unsigned int permissionID, int permissionValue, int permissionNegated, int permissionSkip); +PLUGINS_EXPORTDLL void ts3plugin_onChannelPermListFinishedEvent(uint64 serverConnectionHandlerID, uint64 channelID); +PLUGINS_EXPORTDLL void ts3plugin_onClientPermListEvent(uint64 serverConnectionHandlerID, uint64 clientDatabaseID, unsigned int permissionID, int permissionValue, int permissionNegated, int permissionSkip); +PLUGINS_EXPORTDLL void ts3plugin_onClientPermListFinishedEvent(uint64 serverConnectionHandlerID, uint64 clientDatabaseID); +PLUGINS_EXPORTDLL void ts3plugin_onChannelClientPermListEvent(uint64 serverConnectionHandlerID, uint64 channelID, uint64 clientDatabaseID, unsigned int permissionID, int permissionValue, int permissionNegated, int permissionSkip); +PLUGINS_EXPORTDLL void ts3plugin_onChannelClientPermListFinishedEvent(uint64 serverConnectionHandlerID, uint64 channelID, uint64 clientDatabaseID); +PLUGINS_EXPORTDLL void ts3plugin_onClientChannelGroupChangedEvent(uint64 serverConnectionHandlerID, uint64 channelGroupID, uint64 channelID, anyID clientID, anyID invokerClientID, const char* invokerName, const char* invokerUniqueIdentity); +PLUGINS_EXPORTDLL int ts3plugin_onServerPermissionErrorEvent(uint64 serverConnectionHandlerID, const char* errorMessage, unsigned int error, const char* returnCode, unsigned int failedPermissionID); +PLUGINS_EXPORTDLL void ts3plugin_onPermissionListGroupEndIDEvent(uint64 serverConnectionHandlerID, unsigned int groupEndID); +PLUGINS_EXPORTDLL void ts3plugin_onPermissionListEvent(uint64 serverConnectionHandlerID, unsigned int permissionID, const char* permissionName, const char* permissionDescription); +PLUGINS_EXPORTDLL void ts3plugin_onPermissionListFinishedEvent(uint64 serverConnectionHandlerID); +PLUGINS_EXPORTDLL void ts3plugin_onPermissionOverviewEvent(uint64 serverConnectionHandlerID, uint64 clientDatabaseID, uint64 channelID, int overviewType, uint64 overviewID1, uint64 overviewID2, unsigned int permissionID, int permissionValue, int permissionNegated, int permissionSkip); +PLUGINS_EXPORTDLL void ts3plugin_onPermissionOverviewFinishedEvent(uint64 serverConnectionHandlerID); +PLUGINS_EXPORTDLL void ts3plugin_onServerGroupClientAddedEvent(uint64 serverConnectionHandlerID, anyID clientID, const char* clientName, const char* clientUniqueIdentity, uint64 serverGroupID, anyID invokerClientID, const char* invokerName, const char* invokerUniqueIdentity); +PLUGINS_EXPORTDLL void ts3plugin_onServerGroupClientDeletedEvent(uint64 serverConnectionHandlerID, anyID clientID, const char* clientName, const char* clientUniqueIdentity, uint64 serverGroupID, anyID invokerClientID, const char* invokerName, const char* invokerUniqueIdentity); +PLUGINS_EXPORTDLL void ts3plugin_onClientNeededPermissionsEvent(uint64 serverConnectionHandlerID, unsigned int permissionID, int permissionValue); +PLUGINS_EXPORTDLL void ts3plugin_onClientNeededPermissionsFinishedEvent(uint64 serverConnectionHandlerID); +PLUGINS_EXPORTDLL void ts3plugin_onFileTransferStatusEvent(anyID transferID, unsigned int status, const char* statusMessage, uint64 remotefileSize, uint64 serverConnectionHandlerID); +PLUGINS_EXPORTDLL void ts3plugin_onClientChatClosedEvent(uint64 serverConnectionHandlerID, anyID clientID, const char* clientUniqueIdentity); +PLUGINS_EXPORTDLL void ts3plugin_onClientChatComposingEvent(uint64 serverConnectionHandlerID, anyID clientID, const char* clientUniqueIdentity); +PLUGINS_EXPORTDLL void ts3plugin_onServerLogEvent(uint64 serverConnectionHandlerID, const char* logMsg); +PLUGINS_EXPORTDLL void ts3plugin_onServerLogFinishedEvent(uint64 serverConnectionHandlerID, uint64 lastPos, uint64 fileSize); +PLUGINS_EXPORTDLL void ts3plugin_onMessageListEvent(uint64 serverConnectionHandlerID, uint64 messageID, const char* fromClientUniqueIdentity, const char* subject, uint64 timestamp, int flagRead); +PLUGINS_EXPORTDLL void ts3plugin_onMessageGetEvent(uint64 serverConnectionHandlerID, uint64 messageID, const char* fromClientUniqueIdentity, const char* subject, const char* message, uint64 timestamp); +PLUGINS_EXPORTDLL void ts3plugin_onClientDBIDfromUIDEvent(uint64 serverConnectionHandlerID, const char* uniqueClientIdentifier, uint64 clientDatabaseID); +PLUGINS_EXPORTDLL void ts3plugin_onClientNamefromUIDEvent(uint64 serverConnectionHandlerID, const char* uniqueClientIdentifier, uint64 clientDatabaseID, const char* clientNickName); +PLUGINS_EXPORTDLL void ts3plugin_onClientNamefromDBIDEvent(uint64 serverConnectionHandlerID, const char* uniqueClientIdentifier, uint64 clientDatabaseID, const char* clientNickName); +PLUGINS_EXPORTDLL void ts3plugin_onComplainListEvent(uint64 serverConnectionHandlerID, uint64 targetClientDatabaseID, const char* targetClientNickName, uint64 fromClientDatabaseID, const char* fromClientNickName, const char* complainReason, uint64 timestamp); +PLUGINS_EXPORTDLL void ts3plugin_onBanListEvent(uint64 serverConnectionHandlerID, uint64 banid, const char* ip, const char* name, const char* uid, const char* mytsid, uint64 creationTime, uint64 durationTime, const char* invokerName, uint64 invokercldbid, const char* invokeruid, const char* reason, int numberOfEnforcements, const char* lastNickName); +PLUGINS_EXPORTDLL void ts3plugin_onClientServerQueryLoginPasswordEvent(uint64 serverConnectionHandlerID, const char* loginPassword); +PLUGINS_EXPORTDLL void ts3plugin_onPluginCommandEvent(uint64 serverConnectionHandlerID, const char* pluginName, const char* pluginCommand, anyID invokerClientID, const char* invokerName, const char* invokerUniqueIdentity); +PLUGINS_EXPORTDLL void ts3plugin_onIncomingClientQueryEvent(uint64 serverConnectionHandlerID, const char* commandText); +PLUGINS_EXPORTDLL 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 */ +PLUGINS_EXPORTDLL void ts3plugin_onAvatarUpdated(uint64 serverConnectionHandlerID, anyID clientID, const char* avatarPath); +PLUGINS_EXPORTDLL void ts3plugin_onMenuItemEvent(uint64 serverConnectionHandlerID, enum PluginMenuType type, int menuItemID, uint64 selectedItemID); +PLUGINS_EXPORTDLL void ts3plugin_onHotkeyEvent(const char* keyword); +PLUGINS_EXPORTDLL void ts3plugin_onHotkeyRecordedEvent(const char* keyword, const char* key); +PLUGINS_EXPORTDLL void ts3plugin_onClientDisplayNameChanged(uint64 serverConnectionHandlerID, anyID clientID, const char* displayName, const char* uniqueClientIdentifier); +PLUGINS_EXPORTDLL const char* ts3plugin_keyDeviceName(const char* keyIdentifier); +PLUGINS_EXPORTDLL const char* ts3plugin_displayKeyText(const char* keyIdentifier); +PLUGINS_EXPORTDLL const char* ts3plugin_keyPrefix(); + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/src/c/ts3FunctionsWrapper.h b/src/c/ts3FunctionsWrapper.h new file mode 100644 index 0000000..bf9ab75 --- /dev/null +++ b/src/c/ts3FunctionsWrapper.h @@ -0,0 +1,6 @@ +#ifndef TS3FUNCTIONWRAPPER_H +#define TS3FUNCTIONWRAPPER_H + +void Ts3FncPrintMessage(uint64 serverConnectionHandlerID, const char* message, enum PluginMessageTarget messageTarget); + +#endif diff --git a/src/go/tsgo/tsgo.go b/src/go/tsgo/tsgo.go new file mode 100644 index 0000000..e06169d --- /dev/null +++ b/src/go/tsgo/tsgo.go @@ -0,0 +1,36 @@ +package tsgo + +// Ts3pluginName Name of the plugin +func Ts3pluginName() string { + return "Go Plugin Yay" +} + +// Ts3pluginVersion Version of the plugin +func Ts3pluginVersion() string { + return "1.0" +} + +// Ts3pluginAPIVersion API version of the plugin +func Ts3pluginAPIVersion() int { + return 23 +} + +// Ts3pluginAuthor Plugin author +func Ts3pluginAuthor() string { + return "Author" +} + +// Ts3pluginDescription Plugin description +func Ts3pluginDescription() string { + return "Description" +} + +//Ts3pluginInit init plugin function +func Ts3pluginInit() int { + return 0 +} + +//Ts3pluginShutdown shutdown plugin function +func Ts3pluginShutdown() { + +} diff --git a/src/go/tsgo_export.go b/src/go/tsgo_export.go new file mode 100644 index 0000000..b3788d4 --- /dev/null +++ b/src/go/tsgo_export.go @@ -0,0 +1,66 @@ +package main + +// #cgo CFLAGS: -I../../ts3client-pluginsdk/include -I../c +// #include +// #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 "plugin_definitions.h" +// #include "ts3FunctionsWrapper.h" +import "C" +import ( + tsgo "./tsgo" +) + +func main() {} // Required if you want to export functions + +/* + Required functions. +*/ + +//export GoTs3pluginName +func GoTs3pluginName() *C.char { + return C.CString(tsgo.Ts3pluginName()) +} + +//export GoTs3pluginVersion +func GoTs3pluginVersion() *C.char { + return C.CString(tsgo.Ts3pluginVersion()) +} + +//export GoTs3pluginAPIVersion +func GoTs3pluginAPIVersion() C.int { + return C.int(tsgo.Ts3pluginAPIVersion()) +} + +//export GoTs3pluginAuthor +func GoTs3pluginAuthor() *C.char { + return C.CString(tsgo.Ts3pluginAuthor()) +} + +//export GoTs3pluginDescription +func GoTs3pluginDescription() *C.char { + return C.CString(tsgo.Ts3pluginDescription()) +} + +//export GoTs3pluginInit +func GoTs3pluginInit() C.int { + return C.int(tsgo.Ts3pluginInit()) +} + +//export GoTs3pluginShutdown +func GoTs3pluginShutdown() { + tsgo.Ts3pluginShutdown() +} + +/* + Not so required functions +*/ + +//export GoTs3onClientPokeEvent +func GoTs3onClientPokeEvent(serverConnectionHandlerID uint64, fromClientID C.anyID, pokerName *C.char, pokerUniqueIdentity *C.char, message *C.char, ffIgnored int) int { + C.Ts3FncPrintMessage(serverConnectionHandlerID, C.CString(""), C.PLUGIN_SERVER) + return 0 +}