|
@@ -1070,21 +1070,25 @@ gotmode(char *from, char *msg)
|
|
|
if (me_op(chan)) {
|
|
if (me_op(chan)) {
|
|
|
char tmp[1024] = "";
|
|
char tmp[1024] = "";
|
|
|
|
|
|
|
|
- if (role && u && !u->bot) {
|
|
|
|
|
- if (m && !chan_sentkick(m) && deops >= 3 && chan->mdop) {
|
|
|
|
|
- if (role < 5) {
|
|
|
|
|
- m->flags |= SENTKICK;
|
|
|
|
|
- const size_t len = simple_snprintf(tmp, sizeof(tmp), "KICK %s %s :%s%s\r\n", chan->name, m->nick, kickprefix, response(RES_MASSDEOP));
|
|
|
|
|
- if (role <= 2)
|
|
|
|
|
- tputs(serv, tmp, len);
|
|
|
|
|
- else
|
|
|
|
|
- dprintf(DP_MODE, "%s", tmp);
|
|
|
|
|
- } else {
|
|
|
|
|
- if (u) {
|
|
|
|
|
- simple_snprintf(tmp, sizeof(tmp), "Mass deop on %s by %s", chan->dname, m->nick);
|
|
|
|
|
- deflag_user(u, DEFLAG_MDOP, tmp, chan);
|
|
|
|
|
|
|
+ if (!isserver[0] && role && (!u || (u && !u->bot))) {
|
|
|
|
|
+ if (m && deops >= 3) {
|
|
|
|
|
+ if (chan->mdop) {
|
|
|
|
|
+ if (role < 5 && !chan_sentkick(m)) {
|
|
|
|
|
+ m->flags |= SENTKICK;
|
|
|
|
|
+ const size_t len = simple_snprintf(tmp, sizeof(tmp), "KICK %s %s :%s%s\r\n", chan->name, m->nick, kickprefix, response(RES_MASSDEOP));
|
|
|
|
|
+ if (role <= 2)
|
|
|
|
|
+ tputs(serv, tmp, len);
|
|
|
|
|
+ else
|
|
|
|
|
+ dprintf(DP_MODE, "%s", tmp);
|
|
|
|
|
+ } else {
|
|
|
|
|
+ if (u) {
|
|
|
|
|
+ simple_snprintf(tmp, sizeof(tmp), "Mass deop on %s by %s", chan->dname, m->nick);
|
|
|
|
|
+ deflag_user(u, DEFLAG_MDOP, tmp, chan);
|
|
|
|
|
+ }
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|
|
|
|
|
+ if (channel_protect(chan))
|
|
|
|
|
+ do_protect(chan, "Mass Deop");
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
/* check for mop */
|
|
/* check for mop */
|
|
@@ -1105,8 +1109,12 @@ gotmode(char *from, char *msg)
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|
|
|
- enforce_bitch(chan); /* deop quick! */
|
|
|
|
|
|
|
+ // Don't mass deop if protect is set, it'll happen anyway below
|
|
|
|
|
+ if (!channel_protect(chan))
|
|
|
|
|
+ enforce_bitch(chan); /* deop quick! */
|
|
|
}
|
|
}
|
|
|
|
|
+ if (channel_protect(chan))
|
|
|
|
|
+ do_protect(chan, "Mass OP");
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|
|
|
if (ops) {
|
|
if (ops) {
|
|
@@ -1380,7 +1388,8 @@ gotmode(char *from, char *msg)
|
|
|
}
|
|
}
|
|
|
break;
|
|
break;
|
|
|
case 'o':
|
|
case 'o':
|
|
|
- chan->channel.fighting++;
|
|
|
|
|
|
|
+ if (!u || (u && !u->bot))
|
|
|
|
|
+ chan->channel.fighting++;
|
|
|
mv = assert_ismember(chan, mparam);
|
|
mv = assert_ismember(chan, mparam);
|
|
|
if (mv) {
|
|
if (mv) {
|
|
|
if (msign == '+')
|
|
if (msign == '+')
|
|
@@ -1442,21 +1451,24 @@ gotmode(char *from, char *msg)
|
|
|
}
|
|
}
|
|
|
break;
|
|
break;
|
|
|
case 'b':
|
|
case 'b':
|
|
|
- chan->channel.fighting++;
|
|
|
|
|
|
|
+ if (!u || (u && !u->bot))
|
|
|
|
|
+ chan->channel.fighting++;
|
|
|
if (msign == '+')
|
|
if (msign == '+')
|
|
|
got_ban(chan, m, mparam, isserver);
|
|
got_ban(chan, m, mparam, isserver);
|
|
|
else
|
|
else
|
|
|
got_unban(chan, m, mparam);
|
|
got_unban(chan, m, mparam);
|
|
|
break;
|
|
break;
|
|
|
case 'e':
|
|
case 'e':
|
|
|
- chan->channel.fighting++;
|
|
|
|
|
|
|
+ if (!u || (u && !u->bot))
|
|
|
|
|
+ chan->channel.fighting++;
|
|
|
if (msign == '+')
|
|
if (msign == '+')
|
|
|
got_exempt(chan, m, mparam, isserver);
|
|
got_exempt(chan, m, mparam, isserver);
|
|
|
else
|
|
else
|
|
|
got_unexempt(chan, m, mparam);
|
|
got_unexempt(chan, m, mparam);
|
|
|
break;
|
|
break;
|
|
|
case 'I':
|
|
case 'I':
|
|
|
- chan->channel.fighting++;
|
|
|
|
|
|
|
+ if (!u || (u && !u->bot))
|
|
|
|
|
+ chan->channel.fighting++;
|
|
|
if (msign == '+')
|
|
if (msign == '+')
|
|
|
got_invite(chan, m, mparam, isserver);
|
|
got_invite(chan, m, mparam, isserver);
|
|
|
else
|
|
else
|
|
@@ -1480,6 +1492,9 @@ gotmode(char *from, char *msg)
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|
|
|
|
|
+ // If reversing, dump the modes out
|
|
|
|
|
+ if (reversing)
|
|
|
|
|
+ flush_mode(chan, QUICK);
|
|
|
for (i = 0; i < modecnt; i++)
|
|
for (i = 0; i < modecnt; i++)
|
|
|
if (modes[i])
|
|
if (modes[i])
|
|
|
free(modes[i]);
|
|
free(modes[i]);
|