diff options
author | viper viper@31f1291d-b8d6-0310-a050-a5561fc1590b <viper viper@31f1291d-b8d6-0310-a050-a5561fc1590b@5417fbe8-f217-4b02-8779-1006273d7864> | 2008-09-14 13:30:50 +0000 |
---|---|---|
committer | viper viper@31f1291d-b8d6-0310-a050-a5561fc1590b <viper viper@31f1291d-b8d6-0310-a050-a5561fc1590b@5417fbe8-f217-4b02-8779-1006273d7864> | 2008-09-14 13:30:50 +0000 |
commit | 42f6fa51dba1fc5fafe1db7adb99f6f15498d914 (patch) | |
tree | 58991d76b1c9d90cc10b23c6d59e65fdd86c320c | |
parent | feaa01b2722b1acc9b741ac632d0e069548411fe (diff) |
BUILD : 1.7.21 (1436) BUGS : 937 NOTES : Rewrote CLEAR OPS to have it send correct mode changes on all ircds.
git-svn-id: svn://svn.anope.org/anope/trunk@1436 31f1291d-b8d6-0310-a050-a5561fc1590b
git-svn-id: http://anope.svn.sourceforge.net/svnroot/anope/trunk@1151 5417fbe8-f217-4b02-8779-1006273d7864
-rw-r--r-- | Changes | 1 | ||||
-rw-r--r-- | src/core/cs_clear.c | 175 | ||||
-rw-r--r-- | version.log | 6 |
3 files changed, 68 insertions, 114 deletions
@@ -59,6 +59,7 @@ Anope Version S V N 09/03 F Fixed variables not correctly shown in help. [#873] 09/04 F Rewrote the ignore system to fix several issues. [#930] 09/13 F AKICK now respects the PEACE setting. [#935] +09/14 F Fixed CLEAR not always sending correct modes. [#938] Provided by Jobe <jobe@anope.org> - 2008 09/13 F Fixed bug in ratbox RESV support. [#937] diff --git a/src/core/cs_clear.c b/src/core/cs_clear.c index 5596d0900..da30e4ceb 100644 --- a/src/core/cs_clear.c +++ b/src/core/cs_clear.c @@ -69,7 +69,6 @@ int do_clear(User * u) { char *chan = strtok(NULL, " "); char *what = strtok(NULL, " "); - char tmp[BUFSIZE]; Channel *c; ChannelInfo *ci; @@ -181,13 +180,13 @@ int do_clear(User * u) notice_lang(s_ChanServ, u, CHAN_CLEARED_MODES, chan); } else if (stricmp(what, "ops") == 0) { - char *av[4]; - int ac; - char buf[BUFSIZE]; + char *av[6]; /* The max we have to hold: chan, ts, modes(max3), nick, nick, nick */ + int ac, isop, isadmin, isown, count, i; + char buf[BUFSIZE], tmp[BUFSIZE], tmp2[BUFSIZE]; struct c_userlist *cu, *next; if (ircd->svsmode_ucmode) { - av[0] = sstrdup(chan); + av[0] = chan; anope_cmd_svsmode_chan(av[0], "-o", NULL); if (ircd->owner) { anope_cmd_svsmode_chan(av[0], ircd->ownerunset, NULL); @@ -197,127 +196,77 @@ int do_clear(User * u) } for (cu = c->users; cu; cu = next) { next = cu->next; - if (!chan_has_user_status(c, cu->user, CUS_OP)) { - if (!chan_has_user_status(c, cu->user, CUS_PROTECT)) { - if (!chan_has_user_status(c, cu->user, CUS_OWNER)) { - continue; - } else { - snprintf(tmp, BUFSIZE, "%so", - ircd->ownerunset); - - if (ircdcap->tsmode) { - snprintf(buf, BUFSIZE - 1, "%ld", (long int) time(NULL)); - av[1] = buf; - av[2] = sstrdup(tmp); - } else { - av[1] = sstrdup(tmp); - } - - } - } else { - snprintf(tmp, BUFSIZE, "%so", ircd->adminunset); - - if (ircdcap->tsmode) { - snprintf(buf, BUFSIZE - 1, "%ld", (long int) time(NULL)); - av[1] = buf; - av[2] = sstrdup(tmp); - } else { - av[1] = sstrdup(tmp); - } - } - } else { - if (ircdcap->tsmode) { - snprintf(buf, BUFSIZE - 1, "%ld", (long int) time(NULL)); - av[1] = buf; - av[2] = sstrdup("-o"); - } else { - av[1] = sstrdup("-o"); - } - } + isop = chan_has_user_status(c, cu->user, CUS_OP); + isadmin = chan_has_user_status(c, cu->user, CUS_PROTECT); + isown = chan_has_user_status(c, cu->user, CUS_OWNER); + count = (isop ? 1 : 0) + (isadmin ? 1 : 0) + (isown ? 1 : 0); - if (ircdcap->tsmode) { - av[3] = sstrdup(cu->user->nick); - ac = 4; - } else { - av[2] = sstrdup(cu->user->nick); - ac = 3; - } + if (!isop && !isadmin && !isown) + continue; - do_cmode(s_ChanServ, ac, av); + snprintf(tmp, BUFSIZE, "-%s%s%s", (isop ? "o" : ""), (isadmin ? + ircd->adminunset+1 : ""), (isown ? ircd->ownerunset+1 : "")); if (ircdcap->tsmode) { - free(av[3]); - free(av[2]); + snprintf(buf, BUFSIZE - 1, "%ld", (long int) time(NULL)); + av[1] = buf; + av[2] = tmp; + /* We have to give as much nicks as modes.. - Viper */ + for (i = 0; i < count; i++) + av[i+3] = cu->user->nick; + ac = 3 + i; } else { - free(av[2]); - free(av[1]); + av[1] = tmp; + /* We have to give as much nicks as modes.. - Viper */ + for (i = 0; i < count; i++) + av[i+2] = cu->user->nick; + ac = 2 + i; } + + do_cmode(s_ChanServ, ac, av); } - free(av[0]); } else { + av[0] = chan; for (cu = c->users; cu; cu = next) { next = cu->next; - av[0] = sstrdup(chan); - if (!chan_has_user_status(c, cu->user, CUS_OP)) { - if (!chan_has_user_status(c, cu->user, CUS_PROTECT)) { - if (!chan_has_user_status(c, cu->user, CUS_OWNER)) { - continue; - } else { - snprintf(tmp, BUFSIZE, "%so", - ircd->ownerunset); - if (ircdcap->tsmode) { - snprintf(buf, BUFSIZE - 1, "%ld", (long int) time(NULL)); - av[1] = buf; - av[2] = sstrdup(tmp); - } else { - av[1] = sstrdup(tmp); - } - } - } else { - snprintf(tmp, BUFSIZE, "%so", ircd->adminunset); - if (ircdcap->tsmode) { - snprintf(buf, BUFSIZE - 1, "%ld", (long int) time(NULL)); - av[1] = buf; - av[2] = sstrdup(tmp); - } else { - av[1] = sstrdup(tmp); - } - } - } else { - if (ircdcap->tsmode) { - snprintf(buf, BUFSIZE - 1, "%ld", (long int) time(NULL)); - av[1] = buf; - av[2] = sstrdup("-o"); - } else { - av[1] = sstrdup("-o"); - } - } + isop = chan_has_user_status(c, cu->user, CUS_OP); + isadmin = chan_has_user_status(c, cu->user, CUS_PROTECT); + isown = chan_has_user_status(c, cu->user, CUS_OWNER); + count = (isop ? 1 : 0) + (isadmin ? 1 : 0) + (isown ? 1 : 0); - if (ircdcap->tsmode) { - av[3] = sstrdup(cu->user->nick); - ac = 4; + if (!isop && !isadmin && !isown) + continue; - anope_cmd_mode(whosends(ci), av[0], "%s :%s", av[2], - av[3]); - } else { - av[2] = sstrdup(cu->user->nick); - ac = 3; + snprintf(tmp, BUFSIZE, "-%s%s%s", (isop ? "o" : ""), (isadmin ? + ircd->adminunset+1 : ""), (isown ? ircd->ownerunset+1 : "")); + /* We need to send the IRCd a nick for every mode.. - Viper */ + snprintf(tmp2, BUFSIZE, "%s %s %s", (isop ? cu->user->nick : ""), + (isadmin ? cu->user->nick : ""), (isown ? cu->user->nick : "")); - anope_cmd_mode(whosends(ci), av[0], "%s :%s", av[1], - av[2]); - } - - do_cmode(s_ChanServ, ac, av); + if (!tmp) + continue; if (ircdcap->tsmode) { - free(av[3]); - free(av[2]); - free(av[0]); + snprintf(buf, BUFSIZE - 1, "%ld", (long int) time(NULL)); + av[1] = buf; + av[2] = tmp; + /* We have to give as much nicks as modes.. - Viper */ + for (i = 0; i < count; i++) + av[i+3] = cu->user->nick; + ac = 3 + i; + + anope_cmd_mode(whosends(ci), av[0], "%s %s", av[2], tmp2); } else { - free(av[2]); - free(av[1]); - free(av[0]); + av[1] = tmp; + /* We have to give as much nicks as modes.. - Viper */ + for (i = 0; i < count; i++) + av[i+2] = cu->user->nick; + ac = 2 + i; + + anope_cmd_mode(whosends(ci), av[0], "%s %s", av[1], tmp2); } + + do_cmode(s_ChanServ, ac, av); } } notice_lang(s_ChanServ, u, CHAN_CLEARED_OPS, chan); @@ -356,10 +305,10 @@ int do_clear(User * u) break; } else { if (ircdcap->tsmode) - anope_cmd_mode(whosends(ci), av[0], "%s :%s", av[2], + anope_cmd_mode(whosends(ci), av[0], "%s %s", av[2], av[3]); else - anope_cmd_mode(whosends(ci), av[0], "%s :%s", av[1], + anope_cmd_mode(whosends(ci), av[0], "%s %s", av[1], av[2]); } do_cmode(s_ChanServ, ac, av); @@ -410,10 +359,10 @@ int do_clear(User * u) break; } else { if (ircdcap->tsmode) { - anope_cmd_mode(whosends(ci), av[0], "%s :%s", av[2], + anope_cmd_mode(whosends(ci), av[0], "%s %s", av[2], av[3]); } else { - anope_cmd_mode(whosends(ci), av[0], "%s :%s", av[1], + anope_cmd_mode(whosends(ci), av[0], "%s %s", av[1], av[2]); } } diff --git a/version.log b/version.log index 72281ebd6..95af2a759 100644 --- a/version.log +++ b/version.log @@ -9,10 +9,14 @@ VERSION_MAJOR="1" VERSION_MINOR="7" VERSION_PATCH="21" VERSION_EXTRA="-svn" -VERSION_BUILD="1435" +VERSION_BUILD="1436" # $Log$ # +# BUILD : 1.7.21 (1436) +# BUGS : 937 +# NOTES : Rewrote CLEAR OPS to have it send correct mode changes on all ircds. +# # BUILD : 1.7.21 (1435) # BUGS : 935 # NOTES : AKICK now respects ChanServ PEACE. Checks are performed before adding a nick/mask. |