]> jfr.im git - irc/evilnet/x3.git/blobdiff - src/proto-common.c
Minor typo in previous commit where returning 0 when it should have been 1 from opser...
[irc/evilnet/x3.git] / src / proto-common.c
index 402ea68486011ba5176c9e5794c8b6f666583709..2d8e1f892b773a84cca1ac79fc0bd30c628dd6bb 100644 (file)
@@ -53,12 +53,6 @@ extern struct cManagerNode cManager;
 extern unsigned long burst_length;
 extern struct cManagerNode cManager;
 extern struct policer_params *oper_policer_params, *luser_policer_params;
-extern server_link_func_t *slf_list;
-extern unsigned int slf_size, slf_used;
-extern new_user_func_t *nuf_list;
-extern unsigned int nuf_size, nuf_used;
-extern del_user_func_t *duf_list;
-extern unsigned int duf_size, duf_used;
 extern time_t boot_time;
 
 void received_ping(void);
@@ -415,6 +409,7 @@ recalc_bursts(struct server *eob_server)
 static struct chanmsg_func {
     chanmsg_func_t func;
     struct userNode *service;
+    void *extra;
 } chanmsg_funcs[256]; /* indexed by trigger character */
 
 static struct allchanmsg_func {
@@ -445,7 +440,7 @@ privmsg_chan_helper(struct chanNode *cn, void *data)
     /* Never send a NOTICE to a channel to one of the services */
     cf = &chanmsg_funcs[(unsigned char)pd->text[0]];
     if (!pd->is_notice && cf->func)
-        cf->func(pd->user, cn, pd->text+1, cf->service, pd->is_notice);
+        cf->func(pd->user, cn, pd->text+1, cf->service, pd->is_notice, cf->extra);
     else
         spamserv_channel_message(cn, pd->user, pd->text);
 
@@ -455,7 +450,7 @@ privmsg_chan_helper(struct chanNode *cn, void *data)
        if (!cf->func)
          break; /* end of list */
        else
-         cf->func(pd->user, cn, pd->text, cf->service, pd->is_notice);
+         cf->func(pd->user, cn, pd->text, cf->service, pd->is_notice, cf->extra);
     }
 }
 
@@ -496,12 +491,13 @@ static CMD_FUNC(cmd_part)
 }
 
 void
-reg_chanmsg_func(unsigned char prefix, struct userNode *service, chanmsg_func_t handler)
+reg_chanmsg_func(unsigned char prefix, struct userNode *service, chanmsg_func_t handler, void *extra)
 {
     if (chanmsg_funcs[prefix].func)
        log_module(MAIN_LOG, LOG_WARNING, "Re-registering new chanmsg handler for character `%c'.", prefix);
     chanmsg_funcs[prefix].func = handler;
     chanmsg_funcs[prefix].service = service;
+    chanmsg_funcs[prefix].extra = extra;
 }
 
 void
@@ -524,40 +520,47 @@ get_chanmsg_bot(unsigned char prefix)
 }
 
 static mode_change_func_t *mcf_list;
+static void **mcf_list_extra;
 static unsigned int mcf_size = 0, mcf_used = 0;
 
 void
-reg_mode_change_func(mode_change_func_t handler)
+reg_mode_change_func(mode_change_func_t handler, void *extra)
 {
     if (mcf_used == mcf_size) {
        if (mcf_size) {
                mcf_size <<= 1;
                mcf_list = realloc(mcf_list, mcf_size*sizeof(mode_change_func_t));
+        mcf_list_extra = realloc(mcf_list_extra, mcf_size*sizeof(void*));
        } else {
                mcf_size = 8;
                mcf_list = malloc(mcf_size*sizeof(mode_change_func_t));
+        mcf_list_extra = malloc(mcf_size*sizeof(void*));
        }
     }
-    mcf_list[mcf_used++] = handler;
+    mcf_list[mcf_used] = handler;
+    mcf_list_extra[mcf_used++] = extra;
 }
 
 static oper_func_t *of_list;
-
+static void **of_list_extra;
 static unsigned int of_size = 0, of_used = 0;
 
 void
-reg_oper_func(oper_func_t handler)
+reg_oper_func(oper_func_t handler, void *extra)
 {
     if (of_used == of_size) {
         if (of_size) {
             of_size <<= 1;
             of_list = realloc(of_list, of_size*sizeof(oper_func_t));
+            of_list_extra = realloc(of_list_extra, of_size*sizeof(void*));
         } else {
             of_size = 8;
             of_list = malloc(of_size*sizeof(oper_func_t));
+            of_list_extra = malloc(of_size*sizeof(void*));
         }
     }
-    of_list[of_used++] = handler;
+    of_list[of_used] = handler;
+    of_list_extra[of_used++] = extra;
 }
 
 static void
@@ -568,7 +571,7 @@ call_oper_funcs(struct userNode *user)
         return;
     for (n=0; (n<of_used) && !user->dead; n++)
     {
-        of_list[n](user);
+        of_list[n](user, of_list_extra[n]);
     }
 }
 
@@ -750,7 +753,7 @@ mod_chanmode(struct userNode *who, struct chanNode *channel, char **modes, unsig
         mod_chanmode_apply(who, channel, change);
     if (flags & MC_NOTIFY)
         for (ii = 0; ii < mcf_used; ++ii)
-            mcf_list[ii](channel, who, change);
+            mcf_list[ii](channel, who, change, mcf_list_extra[ii]);
     mod_chanmode_free(change);
     return 1;
 }
@@ -769,21 +772,25 @@ irc_make_chanmode(struct chanNode *chan, char *out)
 }
 
 static user_mode_func_t *um_list;
+static void **um_list_extra;
 static unsigned int um_size = 0, um_used = 0;
 
 void
-reg_user_mode_func(user_mode_func_t handler)
+reg_user_mode_func(user_mode_func_t handler, void *extra)
 {
        if (um_used == um_size) {
                if (um_size) {
                        um_size <<= 1;
                        um_list = realloc(um_list, um_size*sizeof(user_mode_func_t));
+            um_list_extra = realloc(um_list_extra, um_size*sizeof(void*));
                } else {
                        um_size = 8;
                        um_list = malloc(um_size*sizeof(user_mode_func_t));
+            um_list_extra = malloc(um_size*sizeof(void*));
                }
        }
-       um_list[um_used++] = handler;
+       um_list[um_used] = handler;
+    um_list_extra[um_used++] = extra;
 }
 
 void
@@ -803,26 +810,30 @@ call_user_mode_funcs(struct userNode *user, const char *mode_change)
 {
        unsigned int n;
        for (n=0; n<um_used; n++) {
-               um_list[n](user, mode_change);
+               um_list[n](user, mode_change, um_list_extra[n]);
        }
 }
 
 static channel_mode_func_t *cm_list;
+static void **cm_list_extra;
 static unsigned int cm_size = 0, cm_used = 0;
 
 void
-reg_channel_mode_func(channel_mode_func_t handler)
+reg_channel_mode_func(channel_mode_func_t handler, void *extra)
 {
        if (cm_used == cm_size) {
                if (cm_size) {
                        cm_size <<= 1;
                        cm_list = realloc(cm_list, cm_size*sizeof(channel_mode_func_t));
+            cm_list_extra = realloc(cm_list_extra, cm_size*sizeof(void*));
                } else {
                        cm_size = 8;
                        cm_list = malloc(cm_size*sizeof(channel_mode_func_t));
+            cm_list_extra = malloc(cm_size*sizeof(void*));
                }
        }
-       cm_list[cm_used++] = handler;
+       cm_list[cm_used] = handler;
+    cm_list_extra[cm_used++] = extra;
 }
 
 void
@@ -842,7 +853,7 @@ call_channel_mode_funcs(struct userNode *who, struct chanNode *channel, char **m
 {
        unsigned int n;
        for (n=0; n<cm_used; n++) {
-               cm_list[n](who, channel, modes, argc);
+               cm_list[n](who, channel, modes, argc, cm_list_extra[n]);
        }
 }
 
@@ -973,3 +984,22 @@ IsChannelName(const char *name) {
     }
     return 1;
 }
+
+
+unsigned int
+irc_user_modes(const struct userNode *user, char modes[], size_t length)
+{
+    unsigned int ii, jj;
+
+    for (ii = jj = 0; (jj < length) && (irc_user_mode_chars[ii] != '\0'); ++ii) {
+        if ((user->modes & (1 << ii)) && (irc_user_mode_chars[ii] != ' '))
+            modes[jj++] = irc_user_mode_chars[ii];
+    }
+
+    ii = jj;
+    while (jj < length)
+        modes[jj++] = '\0';
+
+    return ii;
+}
+