X-Git-Url: https://jfr.im/git/irc/quakenet/newserv.git/blobdiff_plain/5a0247f12b0397d42e6ba09bc6f23ee82ebb44d0..78546f2b0f59b5c8fede1ce5535972716eb17041:/channel/channelhandlers.c diff --git a/channel/channelhandlers.c b/channel/channelhandlers.c index 18b8fb4f..19faac26 100644 --- a/channel/channelhandlers.c +++ b/channel/channelhandlers.c @@ -508,9 +508,11 @@ int handletopicmsg(void *source, int cargc, char **cargv) { if (cargc>3) timestamp=strtol(cargv[cargc-3], NULL, 10); + np=getnickbynumericstr((char *)source); + /* The following check removed because servers can set topics.. */ #if 0 - if ((np=getnickbynumericstr((char *)source))==NULL) { + if (np==NULL) { /* We should check the sender exists, but we still change the topic even if it doesn't */ Error("channel",ERR_WARNING,"Topic change by non-existent user %s",(char *)source); } @@ -561,11 +563,11 @@ int handlemodemsg(void *source, int cargc, char **cargv) { int arg=2; char *modestr; unsigned long *lp; - void *harg[3]; + void *harg[4]; nick *np, *target; int hooknum; int changes=0; - + if (cargc<2) { return CMD_OK; } @@ -592,6 +594,7 @@ int handlemodemsg(void *source, int cargc, char **cargv) { /* Set up the hook data */ harg[0]=cp; harg[1]=np; + harg[3]=(void *)(long)(cp->flags); /* Process the mode string one character at a time */ /* Maybe I'll write this more intelligently one day if I can comprehend the ircu code that does this */ @@ -773,7 +776,7 @@ int handlemodemsg(void *source, int cargc, char **cargv) { int handleclearmodemsg(void *source, int cargc, char **cargv) { channel *cp; - void *harg[3]; + void *harg[4]; nick *np, *target; char *mcp; unsigned long usermask=0; @@ -800,7 +803,8 @@ int handleclearmodemsg(void *source, int cargc, char **cargv) { harg[0]=cp; harg[1]=np; - + harg[3]=(void *)(long)(cp->flags); + for (mcp=cargv[1];*mcp;mcp++) { switch (*mcp) { case 'o': @@ -938,10 +942,16 @@ void handlewhoischannels(int hooknum, void *arg) { sstring *name; unsigned long *num; int i; - void **args = (void **)arg; - nick *sender = (nick *)args[0], *target = (nick *)args[1]; - - if(IsService(target) || IsHideChan(target)) + char **args = (char **)arg; + nick *sender = (nick *)args[0]; /* sender nick */ + nick *target = (nick *)args[1]; /* target nick */ + char *sourcenum = args[2]; /* source numeric */ + + /* do not show channels for +k service clients or IRC Operators + * do not show channels for +n users + * unless they whois themselves + */ + if ((IsService(target) || IsHideChan(target)) && sender != target) return; chans = (channel **)(target->channels->content); @@ -964,8 +974,13 @@ void handlewhoischannels(int hooknum, void *arg) { bufpos=0; } + /* + * 319 RPL_WHOISCHANNELS "source 319 target nick :channels" + * "irc.netsplit.net 319 foobar barfoo :@#chan1 +#chan2 #chan3" + * "irc.netsplit.net 319 foobar barfoo :-@#chan1 -+#chan2 -#chan3" + */ if(buffer[0] == '\0') - bufpos=snprintf(buffer, sizeof(buffer), ":%s 319 %s %s :", myserver->content, sender->nick, target->nick); + bufpos=snprintf(buffer, sizeof(buffer), "%s 319 %s %s :", getmynumeric(), sourcenum, target->nick); num = getnumerichandlefromchanhash(chans[i]->users, target->numeric);