summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorbill auger <mr.j.spam.me@gmail.com>2013-09-08 03:12:56 -0400
committerbill auger <mr.j.spam.me@gmail.com>2013-09-08 03:12:56 -0400
commit98fcff04f9128f210346244c1e9b80d6075a6d32 (patch)
treed72cc86e1175a567e3d194e810e29086c09b25eb
parent538eef5da2bd062a86de583abb5e0d9fc41c2c93 (diff)
implement chat command handling
-rw-r--r--bridgin.c140
-rw-r--r--bridgin.dbg.h21
-rw-r--r--bridgin.h106
3 files changed, 221 insertions, 46 deletions
diff --git a/bridgin.c b/bridgin.c
index ca5105c..d43da27 100644
--- a/bridgin.c
+++ b/bridgin.c
@@ -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) ; }
diff --git a/bridgin.h b/bridgin.h
index 8dbebbc..38c9fe9 100644
--- a/bridgin.h
+++ b/bridgin.h
@@ -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) ;