#include "pinc.h" #include #define PLUGIN_NAME "Discord chat bridge by Drewol" #define PLUGIN_DESC "Links the game chat with a discord channel." #define PLUGIN_DESC_LONG "Links the game chat with a discord channel." #define PLUGIN_VER_MAJ 0 #define PLUGIN_VER_MIN 1 cvar_t *cvar_url; typedef struct Message { char sender[36]; char message[1024]; } Message; threadid_t httpThread; qboolean exited; int msgCount; Message messageQueue[8]; void HTTPThreadMain(void* arg) { while(exited == qfalse) { Plugin_SleepMSec(50); if(msgCount == 0) continue; Plugin_EnterCriticalSection(); Message message = messageQueue[0]; msgCount--; int i = 0; for(i; i < 7; ++i) { messageQueue[i] = messageQueue[i+1]; } Plugin_LeaveCriticalSection(); char data[2048]; memset(data, 2048, 0); Plugin_HTTP_CreateString_x_www_form_urlencoded(data, sizeof(data), "username", message.sender); Plugin_HTTP_CreateString_x_www_form_urlencoded(data, sizeof(data), "content", message.message); char url[1024]; memset(url, 1024, 0); Plugin_Cvar_GetString(cvar_url, url, sizeof(url)); ftRequest_t* r = Plugin_HTTP_Request(url, "POST", data, strlen(data), "Content-Type: application/x-www-form-urlencoded\r\n"); Plugin_Printf("posting %s to %s\n", data, url); Plugin_HTTP_FreeObj(r); } Plugin_ExitThread(0); } PCL void OnInfoRequest(pluginInfo_t *info) { // Memory pointed by info is allocated by the server binary, just fill in the fields // ===== MANDATORY FIELDS ===== info->handlerVersion.major = PLUGIN_HANDLER_VERSION_MAJOR; info->handlerVersion.minor = PLUGIN_HANDLER_VERSION_MINOR; // Requested handler version // ===== OPTIONAL FIELDS ===== info->pluginVersion.major = PLUGIN_VER_MAJ; info->pluginVersion.minor = PLUGIN_VER_MIN; // Plugin version strncpy(info->fullName, PLUGIN_NAME,sizeof(info->fullName)); //Full plugin name strncpy(info->shortDescription, PLUGIN_DESC,sizeof(info->shortDescription)); // Short plugin description strncpy(info->longDescription, PLUGIN_DESC_LONG,sizeof(info->longDescription)); } PCL int OnInit() { cvar_url = Plugin_Cvar_RegisterString("discURL", "", 0, "Discord webhook URL"); exited = qfalse; msgCount = 0; threadid_t ti; if(Plugin_CreateNewThread(HTTPThreadMain, &ti, NULL) == qfalse) { Plugin_Printf("Failure creating thread"); return 1; } return 0; } PCL void OnMessageSent(char* message, int slot, qboolean* show, int mode) { Plugin_Printf("Slot: %d Said: %s\n", slot, message); if(!message){ *show = qfalse; return; } client_t* client = Plugin_GetClientForClientNum(slot); if(msgCount < 8) { Plugin_EnterCriticalSection(); Message msg; strcpy(&msg.sender, client->name); strcpy(&msg.message, message + 1); messageQueue[msgCount] = msg; msgCount++; Plugin_LeaveCriticalSection(); } } PCL void OnTerminate() { exited = qtrue; }