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;
/*
return 0;
mbuf = modebuf;
+ ombuf = omodebuf;
mode.key[0] = mode.forward[0] = '\0';
mode.mode = mode.limit = mode.join_num = mode.join_time = 0;
":%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))
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 */
fakesource_p = source_p;
mbuf = modebuf;
+ ombuf = omodebuf;
newts = atol(parv[1]);
s = parv[3];
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);
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;
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;
{
if((mode->mode & chmode_flags[i]) && !(oldmode->mode & chmode_flags[i]))
{
- if(dir != MODE_ADD)
+ if (chmode_table[i].set_func == chm_hidden)
+ {
+ if(odir != MODE_ADD)
+ {
+ *ombuf++ = '+';
+ odir = MODE_ADD;
+ }
+ *ombuf++ = i;
+ }
+ else
{
- *mbuf++ = '+';
- dir = MODE_ADD;
+ if(dir != MODE_ADD)
+ {
+ *mbuf++ = '+';
+ dir = MODE_ADD;
+ }
+ *mbuf++ = i;
+
}
- *mbuf++ = i;
}
}
{
if((oldmode->mode & chmode_flags[i]) && !(mode->mode & chmode_flags[i]))
{
- if(dir != MODE_DEL)
+ if(chmode_table[i].set_func == chm_hidden)
+ {
+ if(odir != MODE_DEL)
+ {
+ *ombuf++ = '-';
+ odir = MODE_DEL;
+ }
+ *ombuf++ = i;
+ }
+ else
{
- *mbuf++ = '-';
- dir = MODE_DEL;
+ if(dir != MODE_DEL)
+ {
+ *mbuf++ = '-';
+ dir = MODE_DEL;
+ }
+ *mbuf++ = i;
}
- *mbuf++ = i;
}
}