summaryrefslogtreecommitdiff
path: root/modules/commands/cs_modes.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'modules/commands/cs_modes.cpp')
-rw-r--r--modules/commands/cs_modes.cpp431
1 files changed, 431 insertions, 0 deletions
diff --git a/modules/commands/cs_modes.cpp b/modules/commands/cs_modes.cpp
new file mode 100644
index 000000000..cee2f9460
--- /dev/null
+++ b/modules/commands/cs_modes.cpp
@@ -0,0 +1,431 @@
+/* ChanServ 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 CommandModeBase : public Command
+{
+ void do_mode(CommandSource &source, Command *com, ChannelMode *cm, const Anope::string &chan, const Anope::string &nick, bool set, ChannelAccess level, ChannelAccess levelself, ChannelInfoFlag notice)
+ {
+ User *u = source.u;
+ User *u2 = finduser(nick);
+ Channel *c = findchan(chan);
+ ChannelInfo *ci = c ? c->ci : NULL;
+
+ bool is_same = u == u2;
+
+ AccessGroup u_access = ci ? ci->AccessFor(u) : AccessGroup(), u2_access = ci && u2 ? ci->AccessFor(u2) : AccessGroup();
+
+ 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, nick.c_str());
+ else if (is_same ? !ci->HasPriv(u, levelself) : !ci->HasPriv(u, level))
+ source.Reply(ACCESS_DENIED);
+ else if (!set && !is_same && ci->HasFlag(CI_PEACE) && u2_access >= u_access)
+ source.Reply(ACCESS_DENIED);
+ else if (!set && u2->IsProtected() && !is_same)
+ 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
+ {
+ if (set)
+ c->SetMode(NULL, cm, u2->nick);
+ else
+ c->RemoveMode(NULL, cm, u2->nick);
+
+ Log(LOG_COMMAND, u, com, ci) << "for " << u2->nick;
+ if (notice && ci->HasFlag(notice))
+ ircdproto->SendMessage(ci->WhoSends(), c->name, "%s command used for %s by %s", com->name.c_str(), u2->nick.c_str(), u->nick.c_str());
+ }
+ }
+
+ protected:
+ /** do_util: not a command, but does the job of others
+ * @param source The source of the command
+ * @param com The command calling this function
+ * @param cm A channel mode class
+ * @param chan The channel its being set on
+ * @param nick The nick the modes being set on
+ * @param set Is the mode being set or removed
+ * @param level The acecss level required to set this mode on someone else
+ * @param levelself The access level required to set this mode on yourself
+ * @param notice Flag required on a channel to send a notice
+ */
+ void do_util(CommandSource &source, Command *com, ChannelMode *cm, const Anope::string &chan, const Anope::string &nick, bool set, ChannelAccess level, ChannelAccess levelself, ChannelInfoFlag notice)
+ {
+ User *u = source.u;
+
+ if (chan.empty())
+ for (UChannelList::iterator it = u->chans.begin(); it != u->chans.end(); ++it)
+ do_mode(source, com, cm, (*it)->chan->name, u->nick, set, level, levelself, notice);
+ else
+ do_mode(source, com, cm, chan, !nick.empty() ? nick : u->nick, set, level, levelself, notice);
+
+ return;
+ }
+
+ public:
+ CommandModeBase(Module *creator, const Anope::string &cname) : Command(creator, cname, 0, 2)
+ {
+ this->SetSyntax(_("[\037#channel\037] [\037nick\037]"));
+ }
+};
+
+class CommandCSOp : public CommandModeBase
+{
+ public:
+ CommandCSOp(Module *creator) : CommandModeBase(creator, "chanserv/op")
+ {
+ this->SetDesc(_("Gives Op status to a selected nick on a channel"));
+ }
+
+ void Execute(CommandSource &source, const std::vector<Anope::string> &params)
+ {
+ ChannelMode *cm = ModeManager::FindChannelModeByName(CMODE_OP);
+
+ return do_util(source, this, cm, !params.empty() ? params[0] : "", params.size() > 1 ? params[1] : "", true, CA_OPDEOP, CA_OPDEOPME, CI_OPNOTICE);
+ }
+
+ bool OnHelp(CommandSource &source, const Anope::string &subcommand)
+ {
+ this->SendSyntax(source);
+ source.Reply(" ");
+ source.Reply(_("Ops a selected nick on a channel. If nick is not given,\n"
+ "it will op you. If channel is not given, it will op you\n"
+ "on every channel.\n"
+ " \n"
+ "By default, limited to AOPs or those with level 5 access \n"
+ "and above on the channel."));
+ return true;
+ }
+};
+
+class CommandCSDeOp : public CommandModeBase
+{
+ public:
+ CommandCSDeOp(Module *creator) : CommandModeBase(creator, "chanserv/deop")
+ {
+ this->SetDesc(_("Deops a selected nick on a channel"));
+ }
+
+ void Execute(CommandSource &source, const std::vector<Anope::string> &params)
+ {
+ ChannelMode *cm = ModeManager::FindChannelModeByName(CMODE_OP);
+
+ return do_util(source, this, cm, !params.empty() ? params[0] : "", params.size() > 1 ? params[1] : "", false, CA_OPDEOP, CA_OPDEOPME, CI_OPNOTICE);
+ }
+
+ bool OnHelp(CommandSource &source, const Anope::string &subcommand)
+ {
+ this->SendSyntax(source);
+ source.Reply(" ");
+ source.Reply("Deops a selected nick on a channel. If nick is not given,\n"
+ "it will deop you. If channel is not given, it will deop\n"
+ "you on every channel.\n"
+ " \n"
+ "By default, limited to AOPs or those with level 5 access \n"
+ "and above on the channel.");
+ return true;
+ }
+};
+
+class CommandCSVoice : public CommandModeBase
+{
+ public:
+ CommandCSVoice(Module *creator) : CommandModeBase(creator, "chanserv/voice")
+ {
+ this->SetDesc(_("Voices a selected nick on a channel"));
+ }
+
+ void Execute(CommandSource &source, const std::vector<Anope::string> &params)
+ {
+ ChannelMode *cm = ModeManager::FindChannelModeByName(CMODE_VOICE);
+
+ return do_util(source, this, cm, !params.empty() ? params[0] : "", params.size() > 1 ? params[1] : "", true, CA_VOICE, CA_VOICEME, CI_BEGIN);
+ }
+
+ bool OnHelp(CommandSource &source, const Anope::string &subcommand)
+ {
+ this->SendSyntax(source);
+ source.Reply(" ");
+ source.Reply(_("Voices a selected nick on a channel. If nick is not given,\n"
+ "it will voice you. If channel is not given, it will voice you\n"
+ "on every channel.\n"
+ " \n"
+ "By default, limited to AOPs or those with level 5 access \n"
+ "and above on the channel, or to VOPs or those with level 3 \n"
+ "and above for self voicing."));
+ return true;
+ }
+};
+
+class CommandCSDeVoice : public CommandModeBase
+{
+ public:
+ CommandCSDeVoice(Module *creator) : CommandModeBase(creator, "chanserv/devoice")
+ {
+ this->SetDesc(_("Devoices a selected nick on a channel"));
+ }
+
+ void Execute(CommandSource &source, const std::vector<Anope::string> &params)
+ {
+ ChannelMode *cm = ModeManager::FindChannelModeByName(CMODE_VOICE);
+
+ return do_util(source, this, cm, !params.empty() ? params[0] : "", params.size() > 1 ? params[1] : "", false, CA_VOICE, CA_VOICEME, CI_BEGIN);
+ }
+
+ bool OnHelp(CommandSource &source, const Anope::string &subcommand)
+ {
+ this->SendSyntax(source);
+ source.Reply(" ");
+ source.Reply(_("Devoices a selected nick on a channel. If nick is not given,\n"
+ "it will devoice you. If channel is not given, it will devoice\n"
+ "you on every channel.\n"
+ " \n"
+ "By default, limited to AOPs or those with level 5 access \n"
+ "and above on the channel, or to VOPs or those with level 3 \n"
+ "and above for self devoicing."));
+ return true;
+ }
+};
+
+class CommandCSHalfOp : public CommandModeBase
+{
+ public:
+ CommandCSHalfOp(Module *creator) : CommandModeBase(creator, "chanserv/halfop")
+ {
+ this->SetDesc(_("Halfops a selected nick on a channel"));
+ }
+
+ void Execute(CommandSource &source, const std::vector<Anope::string> &params)
+ {
+ ChannelMode *cm = ModeManager::FindChannelModeByName(CMODE_HALFOP);
+
+ if (!cm)
+ return;
+
+ return do_util(source, this, cm, !params.empty() ? params[0] : "", params.size() > 1 ? params[1] : "", true, CA_HALFOP, CA_HALFOPME, CI_BEGIN);
+ }
+
+ bool OnHelp(CommandSource &source, const Anope::string &subcommand)
+ {
+ this->SendSyntax(source);
+ source.Reply(" ");
+ source.Reply(_("Halfops a selected nick on a channel. If nick is not given,\n"
+ "it will halfop you. If channel is not given, it will halfop\n"
+ "you on every channel.\n"
+ " \n"
+ "By default, limited to AOPs and those with level 5 access \n"
+ "and above on the channel, or to HOPs or those with level 4 \n"));
+ return true;
+ }
+};
+
+class CommandCSDeHalfOp : public CommandModeBase
+{
+ public:
+ CommandCSDeHalfOp(Module *creator) : CommandModeBase(creator, "chanserv/dehalfop")
+ {
+ this->SetDesc(_("Dehalfops a selected nick on a channel"));
+ }
+
+ void Execute(CommandSource &source, const std::vector<Anope::string> &params)
+ {
+ ChannelMode *cm = ModeManager::FindChannelModeByName(CMODE_HALFOP);
+
+ if (!cm)
+ return;
+
+ return do_util(source, this, cm, !params.empty() ? params[0] : "", params.size() > 1 ? params[1] : "", false, CA_HALFOP, CA_HALFOPME, CI_BEGIN);
+ }
+
+ bool OnHelp(CommandSource &source, const Anope::string &subcommand)
+ {
+ this->SendSyntax(source);
+ source.Reply(" ");
+ source.Reply(_("Dehalfops a selected nick on a channel. If nick is not given,\n"
+ "it will dehalfop you. If channel is not given, it will dehalfop\n"
+ "you on every channel.\n"
+ " \n"
+ "By default, limited to AOPs and those with level 5 access \n"
+ "and above on the channel, or to HOPs or those with level 4 \n"
+ "and above for self dehalfopping."));
+ return true;
+ }
+};
+
+class CommandCSProtect : public CommandModeBase
+{
+ public:
+ CommandCSProtect(Module *creator) : CommandModeBase(creator, "chanserv/protect")
+ {
+ this->SetDesc(_("Protects a selected nick on a channel"));
+ }
+
+ void Execute(CommandSource &source, const std::vector<Anope::string> &params)
+ {
+ ChannelMode *cm = ModeManager::FindChannelModeByName(CMODE_PROTECT);
+
+ if (!cm)
+ return;
+
+ return do_util(source, this, cm, !params.empty() ? params[0] : "", params.size() > 1 ? params[1] : "", true, CA_PROTECT, CA_PROTECTME, CI_BEGIN);
+ }
+
+ bool OnHelp(CommandSource &source, const Anope::string &subcommand)
+ {
+ this->SendSyntax(source);
+ source.Reply(" ");
+ source.Reply(_("Protects a selected nick on a channel. If nick is not given,\n"
+ "it will protect you. If channel is not given, it will protect\n"
+ "you on every channel.\n"
+ " \n"
+ "By default, limited to the founder, or to SOPs or those with \n"
+ "level 10 and above on the channel for self protecting."));
+ return true;
+ }
+};
+
+class CommandCSDeProtect : public CommandModeBase
+{
+ public:
+ CommandCSDeProtect(Module *creator) : CommandModeBase(creator, "chanserv/deprotect")
+ {
+ this->SetDesc(_("Deprotects a selected nick on a channel"));
+ }
+
+ void Execute(CommandSource &source, const std::vector<Anope::string> &params)
+ {
+ ChannelMode *cm = ModeManager::FindChannelModeByName(CMODE_PROTECT);
+
+ if (!cm)
+ return;
+
+ return do_util(source, this, cm, !params.empty() ? params[0] : "", params.size() > 1 ? params[1] : "", false, CA_PROTECT, CA_PROTECTME, CI_BEGIN);
+ }
+
+ bool OnHelp(CommandSource &source, const Anope::string &subcommand)
+ {
+ this->SendSyntax(source);
+ source.Reply(" ");
+ source.Reply(_("Deprotects a selected nick on a channel. If nick is not given,\n"
+ "it will deprotect you. If channel is not given, it will deprotect\n"
+ "you on every channel.\n"
+ " \n"
+ "By default, limited to the founder, or to SOPs or those with \n"));
+ return true;
+ }
+};
+
+class CommandCSOwner : public CommandModeBase
+{
+ public:
+ CommandCSOwner(Module *creator) : CommandModeBase(module, "chanserv/owner")
+ {
+ this->SetDesc(_("Gives you owner status on channel"));
+ }
+
+ void Execute(CommandSource &source, const std::vector<Anope::string> &params)
+ {
+ ChannelMode *cm = ModeManager::FindChannelModeByName(CMODE_OWNER);
+
+ if (!cm)
+ return;
+
+ return do_util(source, this, cm, !params.empty() ? params[0] : "", params.size() > 1 ? params[1] : "", true, CA_OWNER, CA_OWNERME, CI_BEGIN);
+ }
+
+ bool OnHelp(CommandSource &source, const Anope::string &subcommand)
+ {
+ this->SendSyntax(source);
+ source.Reply(" ");
+ source.Reply(_("Gives the selected nick owner status on \002channel\002. If nick is not\n"
+ "given, it will give you owner. If channel is not given, it will\n"
+ "give you owner on every channel.\n"
+ " \n"
+ "Limited to those with founder access on the channel."));
+ return true;
+ }
+};
+
+class CommandCSDeOwner : public CommandModeBase
+{
+ public:
+ CommandCSDeOwner(Module *creator) : CommandModeBase(creator, "chanserv/deowner")
+ {
+ this->SetDesc(_("Removes your owner status on a channel"));
+ }
+
+ void Execute(CommandSource &source, const std::vector<Anope::string> &params)
+ {
+ ChannelMode *cm = ModeManager::FindChannelModeByName(CMODE_OWNER);
+
+ if (!cm)
+ return;
+
+ return do_util(source, this, cm, !params.empty() ? params[0] : "", params.size() > 1 ? params[1] : "", false, CA_OWNER, CA_OWNERME, CI_BEGIN);
+ }
+
+ bool OnHelp(CommandSource &source, const Anope::string &subcommand)
+ {
+ this->SendSyntax(source);
+ source.Reply(" ");
+ source.Reply(_("Removes owner status from the selected nick on \002channel\002. If nick\n"
+ "is not given, it will deowner you. If channel is not given, it will\n"
+ "deowner you on every channel.\n"
+ " \n"
+ "Limited to those with founder access on the channel."));
+ return true;
+ }
+};
+
+class CSModes : public Module
+{
+ CommandCSOwner commandcsowner;
+ CommandCSDeOwner commandcsdeowner;
+ CommandCSProtect commandcsprotect;
+ CommandCSDeProtect commandcsdeprotect;
+ CommandCSOp commandcsop;
+ CommandCSDeOp commandcsdeop;
+ CommandCSHalfOp commandcshalfop;
+ CommandCSDeHalfOp commandcsdehalfop;
+ CommandCSVoice commandcsvoice;
+ CommandCSDeVoice commandcsdevoice;
+
+ public:
+ CSModes(const Anope::string &modname, const Anope::string &creator) : Module(modname, creator, CORE),
+ commandcsowner(this), commandcsdeowner(this), commandcsprotect(this), commandcsdeprotect(this),
+ commandcsop(this), commandcsdeop(this), commandcshalfop(this), commandcsdehalfop(this),
+ commandcsvoice(this), commandcsdevoice(this)
+ {
+ this->SetAuthor("Anope");
+
+ ModuleManager::RegisterService(&commandcsop);
+ ModuleManager::RegisterService(&commandcsdeop);
+ ModuleManager::RegisterService(&commandcsvoice);
+ ModuleManager::RegisterService(&commandcsdevoice);
+
+ ModuleManager::RegisterService(&commandcsowner);
+ ModuleManager::RegisterService(&commandcsdeowner);
+ ModuleManager::RegisterService(&commandcsprotect);
+ ModuleManager::RegisterService(&commandcsdeprotect);
+ ModuleManager::RegisterService(&commandcshalfop);
+ ModuleManager::RegisterService(&commandcsdehalfop);
+ }
+};
+
+MODULE_INIT(CSModes)