rearranged NeonServ code to be modular
[NeonServV5.git] / src / modcmd.c
index 8846d900197bc75b53c1e0181a04b062a093058a..7ba0b939d6cae97eba0645fade114475474accfd 100644 (file)
@@ -30,6 +30,7 @@
 
 struct trigger_callback {
     int botid;
+    int module_id;
     trigger_callback_t *func;
     
     struct trigger_callback *next;
@@ -596,7 +597,7 @@ static void got_privmsg(struct UserNode *user, struct UserNode *target, char *me
     }
 }
 
-int register_command(int botid, char *name, cmd_bind_t *func, int paramcount, char *channel_access, int global_access, unsigned int flags) {
+int register_command(int botid, char *name, int module_id, cmd_bind_t *func, int paramcount, char *channel_access, int global_access, unsigned int flags) {
     struct cmd_function *cmdfunc;
     for(cmdfunc = cmd_functions; cmdfunc; cmdfunc = cmdfunc->next) {
         if((cmdfunc->botid == botid || cmdfunc->botid == 0) && strcmp(cmdfunc->name, name) == 0)
@@ -609,6 +610,7 @@ int register_command(int botid, char *name, cmd_bind_t *func, int paramcount, ch
     }
     cmdfunc->botid = botid;
     cmdfunc->name = strdup(name);
+    cmdfunc->module_id = module_id;
     cmdfunc->func = func;
     cmdfunc->flags = flags;
     cmdfunc->paramcount = paramcount;
@@ -619,7 +621,7 @@ int register_command(int botid, char *name, cmd_bind_t *func, int paramcount, ch
     return 1;
 }
 
-int set_trigger_callback(int botid, trigger_callback_t *func) {
+int set_trigger_callback(int botid, int module_id, trigger_callback_t *func) {
     static struct trigger_callback *cb = NULL;
     for(cb = trigger_callbacks; cb; cb = cb->next) {
         if(cb->botid == botid)
@@ -635,6 +637,7 @@ int set_trigger_callback(int botid, trigger_callback_t *func) {
         cb->next = trigger_callbacks;
         trigger_callbacks = cb;
     }
+    cb->module_id = module_id;
     cb->func = func;
     return 1;
 }
@@ -769,13 +772,13 @@ int unbind_botwise_cmd(int botid, int clientid, char *cmd) {
     return 0;
 }
 
-int unbind_botwise_allcmd(int clientid) {
+int unbind_botwise_allcmd(int botid, int clientid) {
     int i;
     for(i = 0; i < 27; i++) {
         struct cmd_binding *cbind, *next, *last = NULL;
         for(cbind = cmd_binds[i]; cbind; cbind = next) {
             next = cbind->next;
-            if(clientid == cbind->clientid) {
+            if((botid == 0 && clientid == cbind->clientid) || (botid && botid == cbind->botid)) {
                 if(last)
                     last->next = cbind->next;
                 else
@@ -1011,3 +1014,54 @@ struct cmd_binding *getAllBinds(struct cmd_binding *last) {
     } while(bind_index < 27);
     return NULL;
 }
+
+void unregister_module_commands(int module_id) {
+    struct cmd_function *cmdfunct, *nextfunct, *prevfunct = NULL;
+    int i;
+    for(cmdfunct = cmd_functions; cmdfunct; cmdfunct = nextfunct) {
+        nextfunct = cmdfunct->next;
+        if(cmdfunct->module_id == module_id) {
+            for(i = 0; i < 27; i++) {
+                struct cmd_binding *cbind, *next, *last = NULL;
+                for(cbind = cmd_binds[i]; cbind; cbind = next) {
+                    next = cbind->next;
+                    if(cmdfunct == cbind->func) {
+                        if(last)
+                            last->next = cbind->next;
+                        else
+                            cmd_binds[i] = cbind->next;
+                        free(cbind->cmd);
+                        if(cbind->paramcount) {
+                            int j;
+                            for(j = 0; j < cbind->paramcount; j++)
+                                free(cbind->parameters[j]);
+                        }
+                        if(cbind->channel_access)
+                            free(cbind->channel_access);
+                        free(cbind);
+                    } else
+                        last = cbind;
+                }
+            }
+            if(prevfunct) 
+                prevfunct->next = nextfunct;
+            else
+                cmd_functions = nextfunct;
+            free(cmdfunct->name);
+            free(cmdfunct);
+        } else
+            prevfunct = cmdfunct;
+    }
+    static struct trigger_callback *cb, *prevcb = NULL, *nextcb;
+    for(cb = trigger_callbacks; cb; cb = nextcb) {
+        nextcb = cb->next;
+        if(cb->module_id == module_id) {
+            if(prevcb)
+                prevcb->next = nextcb;
+            else
+                trigger_callbacks = nextcb;
+            free(cb);
+        } else
+            prevcb = cb;
+    }
+}