X-Git-Url: https://jfr.im/git/irc/evilnet/x3.git/blobdiff_plain/ff3b058ac51e9caf5cf1fd310b8a401a97a85582..f3aff201b7c64fb4d8e153b189bf9494cdcea991:/src/proto-common.c diff --git a/src/proto-common.c b/src/proto-common.c index 785485b..05203f6 100644 --- a/src/proto-common.c +++ b/src/proto-common.c @@ -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); @@ -108,7 +102,7 @@ void replay_event_loop(void) while (!quit_services) { if (!replay_connected) { /* this time fudging is to get some of the logging right */ - self->link = self->boot = now; + self->link_time = self->boot = now; cManager.uplink->state = AUTHENTICATING; irc_introduce(cManager.uplink->password); replay_connected = 1; @@ -333,7 +327,7 @@ static CMD_FUNC(cmd_dummy) static CMD_FUNC(cmd_error) { - if (argv[1]) log_module(MAIN_LOG, LOG_ERROR, "Error from ircd: %s", argv[1]); + if (argv[1]) log_module(MAIN_LOG, LOG_ERROR, "Error: %s", argv[1]); log_module(MAIN_LOG, LOG_ERROR, "Error received from uplink, squitting."); if (cManager.uplink->state != CONNECTED) { @@ -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 { @@ -434,7 +429,7 @@ privmsg_chan_helper(struct chanNode *cn, void *data) { struct privmsg_desc *pd = data; struct modeNode *mn; - struct chanmsg_func *cf = &chanmsg_funcs[(unsigned char)pd->text[0]]; + struct chanmsg_func *cf; int x; /* Don't complain if it can't find the modeNode because the channel might @@ -443,8 +438,9 @@ privmsg_chan_helper(struct chanNode *cn, void *data) mn->idle_since = now; /* Never send a NOTICE to a channel to one of the services */ - if (!pd->is_notice && cf->func && ((cn->modes & MODE_REGISTERED) || GetUserMode(cn, cf->service))) - cf->func(pd->user, cn, pd->text+1, cf->service); /* XXX- taken out in 1.4rc1 patchset but causes errors */ + 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->extra); else spamserv_channel_message(cn, pd->user, pd->text); @@ -454,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); + cf->func(pd->user, cn, pd->text, cf->service, pd->is_notice, cf->extra); } } @@ -495,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 @@ -540,6 +537,40 @@ reg_mode_change_func(mode_change_func_t handler) mcf_list[mcf_used++] = handler; } +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, 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_extra[of_used++] = extra; +} + +static void +call_oper_funcs(struct userNode *user) +{ + unsigned int n; + if (IsLocal(user)) + return; + for (n=0; (ndead; n++) + { + of_list[n](user, of_list_extra[n]); + } +} + struct mod_chanmode * mod_chanmode_alloc(unsigned int argc) { @@ -941,3 +972,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; +} +