diff options
author | Adam <Adam@anope.org> | 2011-11-18 16:20:17 -0500 |
---|---|---|
committer | Adam <Adam@anope.org> | 2011-11-18 16:20:17 -0500 |
commit | 6f8f7491db7bab181249d8acad9c8443605bb05f (patch) | |
tree | 0e7bfe26384bfc27b49856be1058d7a2b33b0b1b /modules/commands/cs_kick.cpp | |
parent | c43cdf438fb388c6989cca78d44be0c650c6c013 (diff) |
Allow kicking and banning by mask
Diffstat (limited to 'modules/commands/cs_kick.cpp')
-rw-r--r-- | modules/commands/cs_kick.cpp | 73 |
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; } }; |