diff options
author | bill auger <mr.j.spam.me@gmail.com> | 2013-09-08 03:12:56 -0400 |
---|---|---|
committer | bill auger <mr.j.spam.me@gmail.com> | 2013-09-08 03:12:56 -0400 |
commit | 98fcff04f9128f210346244c1e9b80d6075a6d32 (patch) | |
tree | d72cc86e1175a567e3d194e810e29086c09b25eb | |
parent | 538eef5da2bd062a86de583abb5e0d9fc41c2c93 (diff) |
implement chat command handling
-rw-r--r-- | bridgin.c | 140 | ||||
-rw-r--r-- | bridgin.dbg.h | 21 | ||||
-rw-r--r-- | bridgin.h | 106 |
3 files changed, 221 insertions, 46 deletions
@@ -1,67 +1,161 @@ #include "bridgin.h" - +#include "bridgin.dbg.h" /* helpers */ -void systemChat(PurpleConversation* conv , const char* msg) +PurpleCmdId RegisterCmd(const char* command , const char* format , + PurpleCmdRet (* callback)() , const char* help) +{ + return purple_cmd_register(command , format , PURPLE_CMD_P_DEFAULT , + PURPLE_CMD_FLAG_IM | PURPLE_CMD_FLAG_CHAT , PLUGIN_ID , callback , help , NULL) ; +} + +void SystemChat(PurpleConversation* conv , const char* msg) { - purple_conversation_write(conv , PLUGIN_NAME , msg , PURPLE_MESSAGE_SYSTEM , time(0)) ; + purple_conversation_write(conv , BRIDGIN_NICK , msg , PURPLE_MESSAGE_SYSTEM , time(0)) ; } /* event handlers */ -gboolean plugin_load(PurplePlugin *plugin) +void HandlePluginInit(PurplePlugin *plugin) {} + +gboolean HandlePluginLoaded(PurplePlugin *aPlugin) { -// purple_notify_message(plugin , PURPLE_NOTIFY_MSG_INFO , "Hello Pidgin!" , PLUGIN_VERSION , NULL , NULL , NULL) ; +// purple_notify_message(aPlugin , PURPLE_NOTIFY_MSG_INFO , "Hello Pidgin!" , PLUGIN_VERSION , NULL , NULL , NULL) ; purple_signal_connect(purple_conversations_get_handle() , "received-im-msg" , - plugin , PURPLE_CALLBACK(received_im_msg_cb) , NULL) ; + aPlugin , PURPLE_CALLBACK(HandleIm) , NULL) ; purple_signal_connect(purple_conversations_get_handle() , "received-chat-msg" , - plugin , PURPLE_CALLBACK(received_chat_msg_cb) , NULL) ; + aPlugin , PURPLE_CALLBACK(HandleChat) , NULL) ; purple_signal_connect(purple_conversations_get_handle() , "deleting-conversation" , - plugin , PURPLE_CALLBACK(deleting_conversation_cb) , NULL) ; + aPlugin , PURPLE_CALLBACK(HandleChannelClosed) , NULL) ; + + CommandIds[0] = RegisterCmd(ADD_CMD , UNARY_FMT , ADD_CB , ADDu_HELP) ; + CommandIds[1] = RegisterCmd(ADD_CMD , BINARY_FMT , ADD_CB , ADDb_HELP) ; + CommandIds[2] = RegisterCmd(REMOVE_CMD , UNARY_FMT , REMOVE_CB , REMOVE_HELP) ; + CommandIds[3] = RegisterCmd(DISABLE_CMD , UNARY_FMT , ENABLE_CB , DISABLEu_HELP) ; + CommandIds[4] = RegisterCmd(DISABLE_CMD , BINARY_FMT , ENABLE_CB , DISABLEb_HELP) ; + CommandIds[5] = RegisterCmd(ENABLE_CMD , UNARY_FMT , ENABLE_CB , ENABLEu_HELP) ; + CommandIds[6] = RegisterCmd(ENABLE_CMD , BINARY_FMT , ENABLE_CB , ENABLEb_HELP) ; + CommandIds[7] = RegisterCmd(ECHO_CMD , BINARY_FMT , ECHO_CB , ECHO_HELP) ; + CommandIds[8] = RegisterCmd(CHAT_CMD , BINARY_FMT , CHAT_CB , CHAT_HELP) ; + CommandIds[9] = RegisterCmd(BCAST_CMD , BINARY_FMT , BCAST_CB , BCAST_HELP) ; + CommandIds[10] = RegisterCmd(STATUS_CMD , UNARY_FMT , STATUS_CB , STATUSu_HELP) ; + CommandIds[11] = RegisterCmd(STATUS_CMD , BINARY_FMT , STATUS_CB , STATUSb_HELP) ; + CommandIds[12] = RegisterCmd(HELP_CMD , UNARY_FMT , HELP_CB , HELP_HELP) ; return TRUE ; } -void init_plugin(PurplePlugin *plugin) +gboolean HandlePluginUnloaded(PurplePlugin *plugin) { + int i ; for (i = 0 ; i < N_COMMANDS ; ++i) purple_cmd_unregister(CommandIds[i]) ; + + return TRUE ; } -void received_im_msg_cb(PurpleAccount* account , char* sender , char* buffer , - PurpleConversation* conv , PurpleMessageFlags flags , void* data) +void HandleIm(PurpleAccount* account , char* sender , char* buffer , + PurpleConversation* conv , PurpleMessageFlags flags , void* data) { -purple_debug_misc(PLUGIN_NAME , "received-im-msg from %s\n\taccount = %d\n\tsender = %s\n\tchannel = %s (%d)\n\tmessage = %s\n\tflags = %d\n\tdata = %d\n" , sender , (int)account , sender , (conv != NULL) ? purple_conversation_get_name(conv) : "(null)" , (int)conv , buffer , flags , (int)data) ; +DBGchat("received-chat-msg" , account , sender , conv , buffer , flags , data) ; + +// purple_conv_chat_send(PURPLE_CONV_CHAT(conv) , formatMessage()) ; } -void received_chat_msg_cb(PurpleAccount* account , char* sender , char* buffer , - PurpleConversation* conv , PurpleMessageFlags flags , void* data) +void HandleChat(PurpleAccount* account , char* sender , char* buffer , + PurpleConversation* conv , PurpleMessageFlags flags , void* data) { -purple_debug_misc(PLUGIN_NAME , "received-chat-msg from %s\n\taccount = %d\n\tsender = %s\n\tchannel = %s (%d)\n\tmessage = %s\n\tflags = %d\n\tdata = %d\n" , sender , (int)account , sender , (conv != NULL) ? purple_conversation_get_name(conv) : "(null)" , (int)conv , buffer , flags , (int)data) ; -if (flags & PURPLE_MESSAGE_SEND) systemChat(conv , "SYSTEM: received-chat-msg - echo dropping") ; else systemChat(conv , "SYSTEM: received-chat-msg") ; +DBGchat("received-chat-msg" , account , sender , conv , buffer , flags , data) ; if (flags & PURPLE_MESSAGE_SEND) return ; - purple_conv_chat_send(PURPLE_CONV_CHAT(conv) , "echo") ; +// purple_conv_chat_send(PURPLE_CONV_CHAT(conv) , formatMessage()) ; +} + +void HandleChannelClosed(PurpleConversation* conv , void* data) +{ +DBGchannelClosed(conv) ; + +} + + +/* callbacks */ + +PurpleCmdRet HandleAddCmd(PurpleConversation* conv , const gchar* command , + gchar** args , gchar** error , void* data) +{ +DBGcmd(command , args[0]) ; + + return PURPLE_CMD_RET_OK ; +} + +PurpleCmdRet HandleRemoveCmd(PurpleConversation* conv , const gchar* command , + gchar** args , gchar** error , void* data) +{ +DBGcmd(command , args[0]) ; + + return PURPLE_CMD_RET_OK ; +} + +PurpleCmdRet HandleEnableCmd(PurpleConversation* conv , const gchar* command , + gchar** args , gchar** error , void* data) +{ +DBGcmd(command , args[0]) ; + + return PURPLE_CMD_RET_OK ; } -void deleting_conversation_cb(PurpleConversation *conv, void *data) +PurpleCmdRet HandleEchoCmd(PurpleConversation* conv , const gchar* command , + gchar** args , gchar** error , void* data) { -purple_debug_misc(PLUGIN_NAME , "deleting-conversation (%s)\n" , purple_conversation_get_name(conv)) ; +DBGcmd(command , args[0]) ; + + return PURPLE_CMD_RET_OK ; } +PurpleCmdRet HandleChatCmd(PurpleConversation* conv , const gchar* command , + gchar** args , gchar** error , void* data) +{ +DBGcmd(command , args[0]) ; + + return PURPLE_CMD_RET_OK ; +} + +PurpleCmdRet HandleBroadcastCmd(PurpleConversation* conv , const gchar* command , + gchar** args , gchar** error , void* data) +{ +DBGcmd(command , args[0]) ; + + return PURPLE_CMD_RET_OK ; +} + +PurpleCmdRet HandleStatusCmd(PurpleConversation* conv , const gchar* command , + gchar** args , gchar** error , void* data) +{ +DBGcmd(command , args[0]) ; + + return PURPLE_CMD_RET_OK ; +} + +PurpleCmdRet HandleHelpCmd(PurpleConversation* conv , const gchar* command , + gchar** args , gchar** error , void* data) +{ +DBGcmd(command , args[0]) ; + + return PURPLE_CMD_RET_OK ; +} /* main */ -static PurplePluginInfo info = +static PurplePluginInfo PluginInfo = { PURPLE_PLUGIN_MAGIC , PURPLE_MAJOR_VERSION , PURPLE_MINOR_VERSION , PLUGIN_TYPE , PLUGIN_GUI_TYPE , 0 , NULL , PURPLE_PRIORITY_DEFAULT , PLUGIN_ID , PLUGIN_NAME , PLUGIN_VERSION , PLUGIN_SHORT_DESC , PLUGIN_LONG_DESC , - PLUGIN_AUTHOR , PLUGIN_WEBSITE , - PLUGIN_ONLOAD_CB , PLUGIN_ONUNLOAD_CB , NULL , NULL , NULL , NULL , NULL , NULL , NULL , NULL , NULL + PLUGIN_AUTHOR , PLUGIN_WEBSITE , PLUGIN_ONLOAD_CB , PLUGIN_ONUNLOAD_CB , + NULL , NULL , NULL , NULL , NULL , NULL , NULL , NULL , NULL } ; -PURPLE_INIT_PLUGIN(bridgin , init_plugin , info) +PURPLE_INIT_PLUGIN(PLUGIN_NAME , HandlePluginInit , PluginInfo) diff --git a/bridgin.dbg.h b/bridgin.dbg.h new file mode 100644 index 0000000..e044abd --- /dev/null +++ b/bridgin.dbg.h @@ -0,0 +1,21 @@ + +#include "debug.h" + +static void DBGchat(char* convType , PurpleAccount* account , char* sender , PurpleConversation* conv , char* buffer , PurpleMessageFlags flags , void* data) +{ + char dbg[64] ; + + purple_debug_misc(PLUGIN_NAME , + "%s from %s\n\taccount = %d\n\tsender = %s\n\tchannel = %s (%d)\n\tmessage = %s\n\tflags = %d\n\tdata = %d\n" , + convType , sender , (int)account , sender , ((conv != NULL) ? purple_conversation_get_name(conv) : "(null)") , + (int)conv , buffer , flags , (int)data) ; + + sprintf(dbg , ((flags & PURPLE_MESSAGE_SEND)? "%s - loopback - dropping" : "%s") , convType) ; + SystemChat(conv , dbg) ; +} + +static void DBGchannelClosed(PurpleConversation* conv) + { purple_debug_misc(PLUGIN_NAME , "deleting-conversation (%s)\n" , purple_conversation_get_name(conv)) ; } + +static void DBGcmd(const gchar* command , gchar* args) + { purple_debug_misc(PLUGIN_ID , "HandleCmd '/%s' args = %s\n" , command , args) ; } @@ -1,39 +1,99 @@ #define PURPLE_PLUGINS -#define PLUGIN_TYPE PURPLE_PLUGIN_STANDARD -#define PLUGIN_GUI_TYPE NULL -#define PLUGIN_ID "core-mr-jonze-bridgin" -#define PLUGIN_NAME "bridgin" -#define PLUGIN_VERSION "0.5s" -#define PLUGIN_SHORT_DESC "short description" -#define PLUGIN_LONG_DESC "long description" -#define PLUGIN_AUTHOR "bill auger <mr.j.spam.me@gmail.com>" -#define PLUGIN_WEBSITE "http://bill-auger.github.com/bridgin" -#define PLUGIN_ONLOAD_CB plugin_load -#define PLUGIN_ONUNLOAD_CB NULL +// app constants +#define PLUGIN_TYPE PURPLE_PLUGIN_STANDARD +#define PLUGIN_GUI_TYPE NULL +#define PLUGIN_ID "core-mr-jonze-bridgin" +#define PLUGIN_NAME "bridgin" +#define PLUGIN_VERSION "0.5s" +#define PLUGIN_SHORT_DESC "short description" +#define PLUGIN_LONG_DESC "long description" +#define PLUGIN_AUTHOR "bill auger <mr.j.spam.me@gmail.com>" +#define PLUGIN_WEBSITE "https://github.com/bill-auger/bridgin" +#define PLUGIN_ONLOAD_CB HandlePluginLoaded +#define PLUGIN_ONUNLOAD_CB HandlePluginUnloaded +#define BRIDGIN_NICK "BRIDGIN" + +// admin commands +#define N_COMMANDS 13 +#define BINARY_FMT "s" +#define UNARY_FMT "" +#define ADD_CMD "add" +#define ADDu_HELP "/ADD_CMD\nadd this channel to the default bridge" +#define ADDb_HELP "/ADD_CMD 'a-bridge-name'\nadd this channel to the bridge 'a-bridge-name'" +#define ADD_CB HandleAddCmd +#define REMOVE_CMD "rem" +#define REMOVE_HELP "/REMOVE_CMD\nunbridge this channel" +#define REMOVE_CB HandleRemoveCmd +#define DISABLE_CMD "disable" +#define DISABLEu_HELP "/DISABLE_CMD\ntemporarily disable all bridges" +#define DISABLEb_HELP "/DISABLE_CMD 'a-bridge-name'\ntemporarily disable the bridge 'a-bridge-name'" +#define ENABLE_CMD "enable" +#define ENABLEu_HELP "/ENABLE_CMD\nenable all bridges" +#define ENABLEb_HELP "/ENABLE_CMD 'a-bridge-name'\nenable the bridge 'a-bridge-name'" +#define ENABLE_CB HandleEnableCmd +#define ECHO_CMD "echo" +#define ECHO_HELP "/ECHO_CMD\necho text to the same channel" +#define ECHO_CB HandleEchoCmd +#define CHAT_CMD "chat" +#define CHAT_HELP "/CHAT_CMD\nrelay text to the all channels on this bridge" +#define CHAT_CB HandleChatCmd +#define BCAST_CMD "broadcast" +#define BCAST_HELP "/BROADCAST_CMD\nrelay text to the all channels on all bridges as BRIDGIN_NICK" +#define BCAST_CB HandleBroadcastCmd +#define STATUS_CMD "status" +#define STATUSu_HELP "/STATUS_CMD\nshow status information for all bridges" +#define STATUSb_HELP "/STATUS_CMD 'a-bridge-name'\nshow status information for the bridge 'a-bridge-name'" +#define STATUS_CB HandleStatusCmd +#define HELP_CMD "help" +#define HELP_HELP "/HELP_CMD\nshow avaiable admin commands" +#define HELP_CB HandleHelpCmd //#include <glib.h> +#include "cmds.h" //#include "conversation.h" -#include "debug.h" -#include "notify.h" -#include "plugin.h" +//#include "notify.h" +//#include "plugin.h" //#include "signals.h" #include "version.h" -static PurplePluginInfo info ; +static PurplePluginInfo PluginInfo ; +static PurpleCmdId CommandIds[N_COMMANDS] ; + // helpers -static void systemChat(PurpleConversation* conv , const char* msg) ; +static PurpleCmdId RegisterCmd(const char* command , const char* format , + PurpleCmdRet (* callback)() , const char* help) ; +static void SystemChat(PurpleConversation* conv , const char* msg) ; // event handlers -static gboolean plugin_load(PurplePlugin *plugin) ; -static void init_plugin(PurplePlugin *plugin) ; -static void received_im_msg_cb(PurpleAccount* account , char* sender , char* buffer , - PurpleConversation* conv , PurpleMessageFlags flags , void* data) ; -static void received_chat_msg_cb(PurpleAccount* account , char* sender , char* buffer , - PurpleConversation* conv , PurpleMessageFlags flags , void* data) ; -static void deleting_conversation_cb(PurpleConversation *conv, void *data) ; +static void HandlePluginInit( PurplePlugin* plugin) ; +static gboolean HandlePluginLoaded( PurplePlugin* plugin) ; +static gboolean HandlePluginUnloaded(PurplePlugin* plugin) ; +static void HandleIm( PurpleAccount* account , char* sender , char* buffer , + PurpleConversation* conv , PurpleMessageFlags flags , void* data) ; +static void HandleChat(PurpleAccount* account , char* sender , char* buffer , + PurpleConversation* conv , PurpleMessageFlags flags , void* data) ; +static void HandleChannelClosed(PurpleConversation* conv, void *data) ; + +// callbacks +static PurpleCmdRet HandleAddCmd( PurpleConversation* conv , const gchar* cmd , + gchar** args , gchar** error , void* data) ; +static PurpleCmdRet HandleRemoveCmd( PurpleConversation* conv , const gchar* cmd , + gchar** args , gchar** error , void* data) ; +static PurpleCmdRet HandleEnableCmd( PurpleConversation* conv , const gchar* cmd , + gchar** args , gchar** error , void* data) ; +static PurpleCmdRet HandleEchoCmd( PurpleConversation* conv , const gchar* cmd , + gchar** args , gchar** error , void* data) ; +static PurpleCmdRet HandleChatCmd( PurpleConversation* conv , const gchar* cmd , + gchar** args , gchar** error , void* data) ; +static PurpleCmdRet HandleBroadcastCmd(PurpleConversation* conv , const gchar* cmd , + gchar** args , gchar** error , void* data) ; +static PurpleCmdRet HandleStatusCmd( PurpleConversation* conv , const gchar* cmd , + gchar** args , gchar** error , void* data) ; +static PurpleCmdRet HandleHelpCmd( PurpleConversation* conv , const gchar* cmd , + gchar** args , gchar** error , void* data) ; |