summaryrefslogtreecommitdiff
path: root/modules/commands/cs_kick.cpp
diff options
context:
space:
mode:
authorAdam <Adam@anope.org>2011-11-18 16:20:17 -0500
committerAdam <Adam@anope.org>2011-11-18 16:20:17 -0500
commit6f8f7491db7bab181249d8acad9c8443605bb05f (patch)
tree0e7bfe26384bfc27b49856be1058d7a2b33b0b1b /modules/commands/cs_kick.cpp
parentc43cdf438fb388c6989cca78d44be0c650c6c013 (diff)
Allow kicking and banning by mask
Diffstat (limited to 'modules/commands/cs_kick.cpp')
-rw-r--r--modules/commands/cs_kick.cpp73
1 files changed, 54 insertions, 19 deletions
diff --git a/modules/commands/cs_kick.cpp b/modules/commands/cs_kick.cpp
index c00025671..84c064a48 100644
--- a/modules/commands/cs_kick.cpp
+++ b/modules/commands/cs_kick.cpp
@@ -31,36 +31,70 @@ class CommandCSKick : public Command
User *u = source.u;
ChannelInfo *ci = cs_findchan(params[0]);
Channel *c = findchan(params[0]);
- bool is_same = target.equals_ci(u->nick);
- User *u2 = is_same ? u : finduser(target);
+ User *u2 = finduser(target);
- AccessGroup u_access = ci->AccessFor(u), u2_access = ci->AccessFor(u2);
+ AccessGroup u_access = ci->AccessFor(u);
if (!c)
source.Reply(CHAN_X_NOT_IN_USE, chan.c_str());
else if (!ci)
source.Reply(CHAN_X_NOT_REGISTERED, chan.c_str());
- else if (!u2)
- source.Reply(NICK_X_NOT_IN_USE, target.c_str());
else if (!ci->AccessFor(u).HasPriv("KICK"))
source.Reply(ACCESS_DENIED);
- else if (!is_same && (ci->HasFlag(CI_PEACE)) && u2_access >= u_access)
- source.Reply(ACCESS_DENIED);
- else if (u2->IsProtected())
- source.Reply(ACCESS_DENIED);
- else if (!c->FindUser(u2))
- source.Reply(NICK_X_NOT_ON_CHAN, u2->nick.c_str(), c->name.c_str());
- else
+ else if (u2)
+ {
+ AccessGroup u2_access = ci->AccessFor(u2);
+ if (u != u2 && ci->HasFlag(CI_PEACE) && u2_access >= u_access)
+ source.Reply(ACCESS_DENIED);
+ else if (u2->IsProtected())
+ source.Reply(ACCESS_DENIED);
+ else if (!c->FindUser(u2))
+ source.Reply(NICK_X_NOT_ON_CHAN, u2->nick.c_str(), c->name.c_str());
+ else
+ {
+ // XXX
+ Log(LOG_COMMAND, u, this, ci) << "for " << u2->nick;
+
+ if (ci->HasFlag(CI_SIGNKICK) || (ci->HasFlag(CI_SIGNKICK_LEVEL) && !u_access.HasPriv("SIGNKICK")))
+ c->Kick(ci->WhoSends(), u2, "%s (%s)", reason.c_str(), u->nick.c_str());
+ else
+ c->Kick(ci->WhoSends(), u2, "%s", reason.c_str());
+ }
+ }
+ else if (u_access.HasPriv("FOUNDER"))
{
- // XXX
- Log(LOG_COMMAND, u, this, ci) << "for " << u2->nick;
+ Log(LOG_COMMAND, u, this, ci) << "for " << target;
+
+ int matched = 0, kicked = 0;
+ for (CUserList::iterator it = c->users.begin(), it_end = c->users.end(); it != it_end;)
+ {
+ UserContainer *uc = *it++;
+
+ if (Anope::Match(uc->user->nick, target) || Anope::Match(uc->user->GetDisplayedMask(), target))
+ {
+ ++matched;
+
+ AccessGroup u2_access = ci->AccessFor(uc->user);
+ if (u != uc->user && ci->HasFlag(CI_PEACE) && u2_access >= u_access)
+ continue;
+ else if (uc->user->IsProtected())
+ continue;
- if (ci->HasFlag(CI_SIGNKICK) || (ci->HasFlag(CI_SIGNKICK_LEVEL) && !ci->AccessFor(u).HasPriv("SIGNKICK")))
- ci->c->Kick(ci->WhoSends(), u2, "%s (%s)", reason.c_str(), u->nick.c_str());
+ ++kicked;
+ if (ci->HasFlag(CI_SIGNKICK) || (ci->HasFlag(CI_SIGNKICK_LEVEL) && !u_access.HasPriv("SIGNKICK")))
+ c->Kick(ci->WhoSends(), uc->user, "%s (Matches %s) (%s)", reason.c_str(), target.c_str(), u->nick.c_str());
+ else
+ c->Kick(ci->WhoSends(), uc->user, "%s (Matches %s)", reason.c_str(), target.c_str());
+ }
+ }
+
+ if (matched)
+ source.Reply(_("Kicked %d/%d users matching %s from %s."), kicked, matched, target.c_str(), c->name.c_str());
else
- ci->c->Kick(ci->WhoSends(), u2, "%s", reason.c_str());
+ source.Reply(_("No users on %s match %s."), c->name.c_str(), target.c_str());
}
- return;
+ else
+ source.Reply(NICK_X_NOT_IN_USE, target.c_str());
}
bool OnHelp(CommandSource &source, const Anope::string &subcommand)
@@ -70,7 +104,8 @@ class CommandCSKick : public Command
source.Reply(_("Kicks a selected nick on a channel.\n"
" \n"
"By default, limited to AOPs or those with level 5 access \n"
- "and above on the channel."));
+ "and above on the channel. Channel founders may include wildcards\n"
+ "in \037nick\037."));
return true;
}
};