]> jfr.im git - irc/evilnet/x3.git/blobdiff - src/modcmd.c
Couple of srvx updates.
[irc/evilnet/x3.git] / src / modcmd.c
index 268d96432d26f4a5c90c4ff917251bfb7b509af3..4103a3c302effb15fda7ea0bf9e8f92a7134f128 100644 (file)
@@ -1031,7 +1031,7 @@ modcmd_privmsg(struct userNode *user, struct userNode *bot, const char *text, in
 }
 
 void
-modcmd_chanmsg(struct userNode *user, struct chanNode *chan, const char *text, struct userNode *bot, unsigned int is_notice) {
+modcmd_chanmsg(struct userNode *user, struct chanNode *chan, const char *text, struct userNode *bot, unsigned int is_notice, UNUSED_ARG(void *extra)) {
     struct service *service;
     if (!(service = dict_find(services, bot->nick, NULL)))
         return;
@@ -1278,20 +1278,24 @@ service_recheck_bindings(struct service *service, struct module *module) {
 }
 
 static svccmd_unbind_func_t *suf_list;
+static void **suf_list_extra;
 unsigned int suf_size, suf_used;
 
 void
-reg_svccmd_unbind_func(svccmd_unbind_func_t handler) {
+reg_svccmd_unbind_func(svccmd_unbind_func_t handler, void *extra) {
     if (suf_used == suf_size) {
         if (suf_size) {
             suf_size <<= 1;
             suf_list = realloc(suf_list, suf_size*sizeof(svccmd_unbind_func_t));
+            suf_list_extra = realloc(suf_list_extra, suf_size*sizeof(void*));
         } else {
             suf_size = 8;
             suf_list = malloc(suf_size*sizeof(svccmd_unbind_func_t));
+            suf_list_extra = malloc(suf_size*sizeof(void*));
         }
     }
-    suf_list[suf_used++] = handler;
+    suf_list[suf_used] = handler;
+    suf_list_extra[suf_used++] = extra;
 }
 
 static MODCMD_FUNC(cmd_unbind) {
@@ -1324,7 +1328,7 @@ static MODCMD_FUNC(cmd_unbind) {
     }
 
     for (ii=0; ii<suf_used; ii++)
-        suf_list[ii](bound);
+        suf_list[ii](bound, suf_list_extra[ii]);
     /* If this command binding is removing itself, we must take care
      * not to dereference it after the dict_remove.
      */
@@ -1937,7 +1941,7 @@ static MODCMD_FUNC(cmd_service_trigger) {
         return 1;
     }
     if (service->trigger)
-        reg_chanmsg_func(service->trigger, NULL, NULL);
+        reg_chanmsg_func(service->trigger, NULL, NULL, NULL);
     if (!irccasecmp(argv[2], "none") || !irccasecmp(argv[2], "remove")) {
         service->trigger = 0;
         reply("MCMSG_REMOVED_TRIGGER", service->bot->nick);
@@ -1946,7 +1950,7 @@ static MODCMD_FUNC(cmd_service_trigger) {
         return 1;
     } else {
         service->trigger = argv[2][0];
-        reg_chanmsg_func(service->trigger, service->bot, modcmd_chanmsg);
+        reg_chanmsg_func(service->trigger, service->bot, modcmd_chanmsg, NULL);
         reply("MCMSG_NEW_TRIGGER", service->bot->nick, service->trigger);
     }
     return 1;
@@ -2066,7 +2070,7 @@ static MODCMD_FUNC(cmd_tell) {
 }
 
 void
-modcmd_nick_change(struct userNode *user, const char *old_nick) {
+modcmd_nick_change(struct userNode *user, const char *old_nick, UNUSED_ARG(void *extra)) {
     struct service *svc;
     if (!(svc = dict_find(services, old_nick, NULL)))
         return;
@@ -2075,11 +2079,13 @@ modcmd_nick_change(struct userNode *user, const char *old_nick) {
 }
 
 void
-modcmd_cleanup(void) {
+modcmd_cleanup(UNUSED_ARG(void* extra)) {
     dict_delete(services);
     dict_delete(modules);
     if (suf_list)
         free(suf_list);
+    if (suf_list_extra)
+        free(suf_list_extra);
 }
 
 static void
@@ -2290,8 +2296,8 @@ modcmd_init(void) {
     dict_set_free_data(modules, free_module);
     services = dict_new();
     dict_set_free_data(services, free_service);
-    reg_nick_change_func(modcmd_nick_change);
-    reg_exit_func(modcmd_cleanup);
+    reg_nick_change_func(modcmd_nick_change, NULL);
+    reg_exit_func(modcmd_cleanup, NULL);
     conf_register_reload(modcmd_conf_read);
 
     modcmd_module = module_register("modcmd", MAIN_LOG, "modcmd.help", modcmd_expand);
@@ -2602,7 +2608,7 @@ modcmd_finalize(void) {
     for (it = dict_first(services); it; it = iter_next(it)) {
         struct service *svc = iter_data(it);
         if (svc->trigger)
-            reg_chanmsg_func(svc->trigger, svc->bot, modcmd_chanmsg);
+            reg_chanmsg_func(svc->trigger, svc->bot, modcmd_chanmsg, NULL);
     }
 
     /* Resolve command rule-templates. */