From 565f4362f206d5f45a5e0acbe656aa3e0389140e Mon Sep 17 00:00:00 2001 From: JD Horelick Date: Wed, 3 Mar 2010 15:16:06 -0500 Subject: [PATCH] A couple more chm_hidden cleanups/fixes. --- modules/core/m_join.c | 64 ++++++++++++++++++++++++++++++++++--------- src/channel.c | 2 +- 2 files changed, 52 insertions(+), 14 deletions(-) diff --git a/modules/core/m_join.c b/modules/core/m_join.c index 79ab428..3a5d05c 100644 --- a/modules/core/m_join.c +++ b/modules/core/m_join.c @@ -67,9 +67,10 @@ static void remove_ban_list(struct Channel *chptr, struct Client *source_p, rb_dlink_list * list, char c, int mems); static char modebuf[MODEBUFLEN]; +static char omodebuf[MODEBUFLEN]; static char parabuf[MODEBUFLEN]; static const char *para[MAXMODEPARAMS]; -static char *mbuf; +static char *mbuf, *ombuf; static int pargs; /* @@ -122,6 +123,7 @@ ms_join(struct Client *client_p, struct Client *source_p, int parc, const char * return 0; mbuf = modebuf; + ombuf = omodebuf; mode.key[0] = mode.forward[0] = '\0'; mode.mode = mode.limit = mode.join_num = mode.join_time = 0; @@ -190,7 +192,12 @@ ms_join(struct Client *client_p, struct Client *source_p, int parc, const char * ":%s MODE %s %s %s", source_p->servptr->name, chptr->chname, modebuf, parabuf); - *modebuf = *parabuf = '\0'; + if(*omodebuf != '\0') + sendto_channel_local(ONLY_OPERS, chptr, + ":%s MODE %s %s %s", + source_p->servptr->name, + chptr->chname, modebuf, parabuf); + *omodebuf = *modebuf = *parabuf = '\0'; } if(!IsMember(source_p, chptr)) @@ -249,7 +256,7 @@ ms_sjoin(struct Client *client_p, struct Client *source_p, int parc, const char if(*parv[2] == '&') return 0; - modebuf[0] = parabuf[0] = mode.key[0] = mode.forward[0] = '\0'; + omodebuf[0] = modebuf[0] = parabuf[0] = mode.key[0] = mode.forward[0] = '\0'; pargs = mode.mode = mode.limit = mode.join_num = mode.join_time = 0; /* Hide connecting server on netburst -- jilles */ @@ -259,6 +266,7 @@ ms_sjoin(struct Client *client_p, struct Client *source_p, int parc, const char fakesource_p = source_p; mbuf = modebuf; + ombuf = omodebuf; newts = atol(parv[1]); s = parv[3]; @@ -457,7 +465,11 @@ ms_sjoin(struct Client *client_p, struct Client *source_p, int parc, const char sendto_channel_local(ALL_MEMBERS, chptr, ":%s MODE %s %s %s", fakesource_p->name, chptr->chname, modebuf, parabuf); - *modebuf = *parabuf = '\0'; + if(*omodebuf != '\0') + sendto_channel_local(ONLY_OPERS, chptr, ":%s MODE %s %s %s", + fakesource_p->name, chptr->chname, omodebuf, parabuf); + + *omodebuf = *modebuf = *parabuf = '\0'; if(parv[3][0] != '0' && keep_new_modes) modes = channel_modes(chptr, source_p); @@ -469,6 +481,7 @@ ms_sjoin(struct Client *client_p, struct Client *source_p, int parc, const char ptr_uid = buf_uid + mlen_uid; mbuf = modebuf; + ombuf = omodebuf; para[0] = para[1] = para[2] = para[3] = empty; pargs = 0; len_nick = len_uid = 0; @@ -799,7 +812,7 @@ ms_sjoin(struct Client *client_p, struct Client *source_p, int parc, const char static void set_final_mode(struct Mode *mode, struct Mode *oldmode) { - int dir = MODE_QUERY; + int dir = MODE_QUERY, odir = MODE_QUERY; char *pbuf = parabuf; int len; int i; @@ -809,12 +822,25 @@ set_final_mode(struct Mode *mode, struct Mode *oldmode) { if((mode->mode & chmode_flags[i]) && !(oldmode->mode & chmode_flags[i])) { - if(dir != MODE_ADD) + if (chmode_table[i].set_func == chm_hidden) { - *mbuf++ = '+'; - dir = MODE_ADD; + if(odir != MODE_ADD) + { + *ombuf++ = '+'; + odir = MODE_ADD; + } + *ombuf++ = i; + } + else + { + if(dir != MODE_ADD) + { + *mbuf++ = '+'; + dir = MODE_ADD; + } + *mbuf++ = i; + } - *mbuf++ = i; } } @@ -823,12 +849,24 @@ set_final_mode(struct Mode *mode, struct Mode *oldmode) { if((oldmode->mode & chmode_flags[i]) && !(mode->mode & chmode_flags[i])) { - if(dir != MODE_DEL) + if(chmode_table[i].set_func == chm_hidden) { - *mbuf++ = '-'; - dir = MODE_DEL; + if(odir != MODE_DEL) + { + *ombuf++ = '-'; + odir = MODE_DEL; + } + *ombuf++ = i; + } + else + { + if(dir != MODE_DEL) + { + *mbuf++ = '-'; + dir = MODE_DEL; + } + *mbuf++ = i; } - *mbuf++ = i; } } diff --git a/src/channel.c b/src/channel.c index fb0fd35..4dd6b82 100644 --- a/src/channel.c +++ b/src/channel.c @@ -1253,7 +1253,7 @@ channel_modes(struct Channel *chptr, struct Client *client_p) for (i = 0; i < 256; i++) { - if(chmode_table[i].set_func == chm_hidden && !IsOper(client_p)) + if(chmode_table[i].set_func == chm_hidden && !IsOper(client_p) && IsClient(client_p)) continue; if(chptr->mode.mode & chmode_flags[i]) *mbuf++ = i;