diff options
Diffstat (limited to 'modules/commands/os_noop.cpp')
-rw-r--r-- | modules/commands/os_noop.cpp | 94 |
1 files changed, 94 insertions, 0 deletions
diff --git a/modules/commands/os_noop.cpp b/modules/commands/os_noop.cpp new file mode 100644 index 000000000..2eec522a3 --- /dev/null +++ b/modules/commands/os_noop.cpp @@ -0,0 +1,94 @@ +/* OperServ core functions + * + * (C) 2003-2011 Anope Team + * Contact us at team@anope.org + * + * Please read COPYING and README for further details. + * + * Based on the original code of Epona by Lara. + * Based on the original code of Services by Andy Church. + */ + +/*************************************************************************/ + +#include "module.h" + +class CommandOSNOOP : public Command +{ + public: + CommandOSNOOP(Module *creator) : Command(creator, "operserv/noop", 2, 2) + { + this->SetDesc(_("Temporarily remove all O:lines of a server remotely")); + this->SetSyntax(_("SET \037server\037")); + this->SetSyntax(_("REVOKE \037server\037")); + } + + void Execute(CommandSource &source, const std::vector<Anope::string> ¶ms) + { + User *u = source.u; + const Anope::string &cmd = params[0]; + const Anope::string &server = params[1]; + + Server *s = Server::Find(server); + if (s == NULL) + source.Reply(_("Server %s does not exist."), server.c_str()); + else if (cmd.equals_ci("SET")) + { + /* Remove the O:lines */ + ircdproto->SendSVSNOOP(s, true); + + Log(LOG_ADMIN, u, this) << "SET on " << s->GetName(); + source.Reply(_("All O:lines of \002%s\002 have been removed."), s->GetName().c_str()); + + Anope::string reason = "NOOP command used by " + u->nick; + /* Kill all the IRCops of the server */ + for (Anope::insensitive_map<User *>::iterator it = UserListByNick.begin(); it != UserListByNick.end();) + { + User *u2 = it->second; + ++it; + + if (u2 && u2->HasMode(UMODE_OPER) && u2->server == s) + u2->Kill(Config->OperServ, reason); + } + } + else if (cmd.equals_ci("REVOKE")) + { + Log(LOG_ADMIN, u, this) << "REVOKE on " << s->GetName(); + ircdproto->SendSVSNOOP(s, false); + source.Reply(_("All O:lines of \002%s\002 have been reset."), s->GetName().c_str()); + } + else + this->OnSyntaxError(source, ""); + + return; + } + + bool OnHelp(CommandSource &source, const Anope::string &subcommand) + { + this->SendSyntax(source); + source.Reply(" "); + source.Reply(_("\002NOOP SET\002 remove all O:lines of the given\n" + "\002server\002 and kill all IRCops currently on it to\n" + "prevent them from rehashing the server (because this\n" + "would just cancel the effect).\n" + "\002NOOP REVOKE\002 makes all removed O:lines available again\n" + "on the given \002server\002.\n")); + return true; + } +}; + +class OSNOOP : public Module +{ + CommandOSNOOP commandosnoop; + + public: + OSNOOP(const Anope::string &modname, const Anope::string &creator) : Module(modname, creator, CORE), + commandosnoop(this) + { + this->SetAuthor("Anope"); + + ModuleManager::RegisterService(&commandosnoop); + } +}; + +MODULE_INIT(OSNOOP) |