summaryrefslogtreecommitdiff
path: root/src/core/cs_clear.c
diff options
context:
space:
mode:
authorviper 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
committerviper 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
commit42f6fa51dba1fc5fafe1db7adb99f6f15498d914 (patch)
tree58991d76b1c9d90cc10b23c6d59e65fdd86c320c /src/core/cs_clear.c
parentfeaa01b2722b1acc9b741ac632d0e069548411fe (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
Diffstat (limited to 'src/core/cs_clear.c')
-rw-r--r--src/core/cs_clear.c175
1 files changed, 62 insertions, 113 deletions
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]);
}
}