X-Git-Url: https://jfr.im/git/solanum.git/blobdiff_plain/765d839d3c25cf804d7c0f8dbf82ad5f04b09a12..b2c208be091670e3c5259eba77187bae6ac6eece:/modules/core/m_join.c diff --git a/modules/core/m_join.c b/modules/core/m_join.c index 1cdf4342..bba9eaf1 100644 --- a/modules/core/m_join.c +++ b/modules/core/m_join.c @@ -41,6 +41,7 @@ #include "modules.h" #include "packet.h" #include "chmode.h" +#include "ratelimit.h" static int m_join(struct Client *, struct Client *, int, const char **); static int ms_join(struct Client *, struct Client *, int, const char **); @@ -92,7 +93,7 @@ check_forward(struct Client *source_p, struct Channel *chptr, char *key, int *err) { int depth = 0, i; - char *next = NULL; + const char *next = NULL; /* The caller (m_join) is only interested in the reason * for the original channel. @@ -100,12 +101,14 @@ check_forward(struct Client *source_p, struct Channel *chptr, if ((*err = can_join(source_p, chptr, key, &next)) == 0) return chptr; - /* User is +Q */ - if (IsNoForward(source_p)) + /* User is +Q, or forwarding disabled */ + if (IsNoForward(source_p) || !ConfigChannel.use_forward) return NULL; while (depth < 16) { + if (next == NULL) + return NULL; chptr = find_channel(next); /* Can only forward to existing channels */ if (chptr == NULL) @@ -122,8 +125,6 @@ check_forward(struct Client *source_p, struct Channel *chptr, i = can_join(source_p, chptr, key, &next); if (i == 0) return chptr; - if (next == NULL) - return NULL; depth++; } @@ -255,8 +256,10 @@ m_join(struct Client *client_p, struct Client *source_p, int parc, const char *p if(moduledata.approved != 0) { +#ifdef XXX_NOTYET sendto_one(source_p, form_str(moduledata.approved), me.name, source_p->name, name); +#endif continue; } @@ -301,9 +304,10 @@ m_join(struct Client *client_p, struct Client *source_p, int parc, const char *p * see extensions/chm_operonly.c for other comments on this * -- dwr */ +#ifdef XXX_NOTYET if(i != ERR_CUSTOM) sendto_one(source_p, form_str(i), me.name, source_p->name, name); - +#endif continue; } else if(chptr != chptr2) @@ -325,6 +329,9 @@ m_join(struct Client *client_p, struct Client *source_p, int parc, const char *p } chptr->join_count++; + /* credit user for join */ + credit_client_join(source_p); + /* we send the user their join here, because we could have to * send a mode out next. */ @@ -363,7 +370,8 @@ m_join(struct Client *client_p, struct Client *source_p, int parc, const char *p sendto_one(source_p, form_str(RPL_TOPICWHOTIME), me.name, source_p->name, chptr->chname, - chptr->topic_info, chptr->topic_time); + chptr->topic_info, + (unsigned long)chptr->topic_time); } channel_member_names(chptr, source_p, 1); @@ -393,7 +401,6 @@ ms_join(struct Client *client_p, struct Client *source_p, int parc, const char * time_t newts; int isnew; int keep_our_modes = YES; - int keep_new_modes = YES; rb_dlink_node *ptr, *next_ptr; /* special case for join 0 */ @@ -455,8 +462,6 @@ ms_join(struct Client *client_p, struct Client *source_p, int parc, const char * keep_our_modes = NO; chptr->channelts = newts; } - else - keep_new_modes = NO; /* Lost the TS, other side wins, so remove modes on this side */ if(!keep_our_modes) @@ -1125,7 +1130,8 @@ set_final_mode(struct Mode *mode, struct Mode *oldmode) len = rb_sprintf(pbuf, "%d:%d ", mode->join_num, mode->join_time); pbuf += len; } - if(mode->forward[0] && strcmp(oldmode->forward, mode->forward)) + if(mode->forward[0] && strcmp(oldmode->forward, mode->forward) && + ConfigChannel.use_forward) { if(dir != MODE_ADD) { @@ -1266,7 +1272,8 @@ remove_ban_list(struct Channel *chptr, struct Client *source_p, banptr = ptr->data; /* trailing space, and the mode letter itself */ - plen = strlen(banptr->banstr) + 2; + plen = strlen(banptr->banstr) + + (banptr->forward ? strlen(banptr->forward) + 1 : 0) + 2; if(count >= MAXMODEPARAMS || (cur_len + plen) > BUFSIZE - 4) { @@ -1284,7 +1291,10 @@ remove_ban_list(struct Channel *chptr, struct Client *source_p, *mbuf++ = c; cur_len += plen; - pbuf += rb_sprintf(pbuf, "%s ", banptr->banstr); + if (banptr->forward) + pbuf += rb_sprintf(pbuf, "%s$%s ", banptr->banstr, banptr->forward); + else + pbuf += rb_sprintf(pbuf, "%s ", banptr->banstr); count++; free_ban(banptr);