diff options
author | Adam- <Adam-@5417fbe8-f217-4b02-8779-1006273d7864> | 2009-10-13 21:26:38 +0000 |
---|---|---|
committer | Adam- <Adam-@5417fbe8-f217-4b02-8779-1006273d7864> | 2009-10-13 21:26:38 +0000 |
commit | d3d64c27b199622c90075d6f59dd08e44acbb378 (patch) | |
tree | 68029e10dc754271235e2a4e3d04b3fb19ddd15c /src/core/cs_modes.c | |
parent | 1fd66851320e239b531720c27614a5ad4c604c97 (diff) |
Complete rewrite of everything associated with modes, this breaks saving and reading mlocked modes from the databases until the new databases are implemented
git-svn-id: http://anope.svn.sourceforge.net/svnroot/anope/trunk@2560 5417fbe8-f217-4b02-8779-1006273d7864
Diffstat (limited to 'src/core/cs_modes.c')
-rw-r--r-- | src/core/cs_modes.c | 138 |
1 files changed, 86 insertions, 52 deletions
diff --git a/src/core/cs_modes.c b/src/core/cs_modes.c index 13f2f0f82..4e8162c02 100644 --- a/src/core/cs_modes.c +++ b/src/core/cs_modes.c @@ -15,14 +15,24 @@ #include "module.h" -/* do_util: not a command, but does the job of other */ - -static CommandReturn do_util(User *u, CSModeUtil *util, const char *chan, const char *nick) +/** do_util: not a command, but does the job of others + * @param u The user doing the command + * @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 name The name, eg "OP" or "HALFOP" + * @param notice Flag required on a channel to send a notice + */ +static CommandReturn do_util(User *u, ChannelMode *cm, const char *chan, const char *nick, bool set, int level, int levelself, const std::string &name, int32 notice) { const char *av[2]; Channel *c = findchan(chan); ChannelInfo *ci; User *u2; + char modebuf[3]; int is_same; @@ -35,32 +45,34 @@ static CommandReturn do_util(User *u, CSModeUtil *util, const char *chan, const if (c) ci = c->ci; - if (!c) { + if (!c) notice_lang(s_ChanServ, u, CHAN_X_NOT_IN_USE, chan); - } else if (is_same ? !(u2 = u) : !(u2 = finduser(nick))) { + else if (is_same ? !(u2 = u) : !(u2 = finduser(nick))) notice_lang(s_ChanServ, u, NICK_X_NOT_IN_USE, nick); - } else if (!is_on_chan(c, u2)) { + else if (!is_on_chan(c, u2)) notice_lang(s_ChanServ, u, NICK_X_NOT_ON_CHAN, u2->nick, c->name); - } else if (is_same ? !check_access(u, ci, util->levelself) : - !check_access(u, ci, util->level)) { + else if (is_same ? !check_access(u, ci, levelself) : !check_access(u, ci, level)) notice_lang(s_ChanServ, u, ACCESS_DENIED); - } else if (*util->mode == '-' && !is_same && (ci->flags & CI_PEACE) - && (get_access(u2, ci) >= get_access(u, ci))) { + else if (!set && !is_same && (ci->flags & CI_PEACE) && (get_access(u2, ci) >= get_access(u, ci))) notice_lang(s_ChanServ, u, ACCESS_DENIED); - } else if (*util->mode == '-' && is_protected(u2) && !is_same) { + else if (!set && is_protected(u2) && !is_same) notice_lang(s_ChanServ, u, ACCESS_DENIED); - } else { - ircdproto->SendMode(whosends(ci), c->name, "%s %s", util->mode, - u2->nick); + else + { + snprintf(modebuf, sizeof(modebuf), "%c%c", (set ? '+' : '-'), cm->ModeChar); - av[0] = util->mode; + ircdproto->SendMode(whosends(ci), c->name, "%s %s", modebuf, u2->nick); + + av[0] = modebuf; av[1] = u2->nick; + chan_set_modes(s_ChanServ, c, 2, av, 3); - if (util->notice && ci->flags & util->notice) + if (notice && ci->flags & notice) ircdproto->SendMessage(whosends(ci), c->name, "%s command used for %s by %s", - util->name, u2->nick, u->nick); + name.c_str(), u2->nick, u->nick); } + return MOD_CONT; } @@ -75,7 +87,9 @@ class CommandCSOp : public Command CommandReturn Execute(User *u, std::vector<ci::string> ¶ms) { - return do_util(u, &csmodeutils[MUT_OP], (params.size() > 0 ? params[0].c_str() : NULL), (params.size() > 1 ? params[1].c_str() : NULL)); + ChannelMode *cm = ModeManager::FindChannelModeByName(CMODE_OP); + + return do_util(u, cm, (params.size() > 0 ? params[0].c_str() : NULL), (params.size() > 1 ? params[1].c_str() : NULL), true, CA_OPDEOP, CA_OPDEOPME, "OP", CI_OPNOTICE); } bool OnHelp(User *u, const ci::string &subcommand) @@ -100,7 +114,9 @@ class CommandCSDeOp : public Command CommandReturn Execute(User *u, std::vector<ci::string> ¶ms) { - return do_util(u, &csmodeutils[MUT_DEOP], (params.size() > 0 ? params[0].c_str() : NULL), (params.size() > 1 ? params[1].c_str() : NULL)); + ChannelMode *cm = ModeManager::FindChannelModeByName(CMODE_OP); + + return do_util(u, cm, (params.size() > 0 ? params[0].c_str() : NULL), (params.size() > 1 ? params[1].c_str() : NULL), false, CA_OPDEOP, CA_OPDEOPME, "DEOP", CI_OPNOTICE); } bool OnHelp(User *u, const ci::string &subcommand) @@ -125,7 +141,9 @@ class CommandCSVoice : public Command CommandReturn Execute(User *u, std::vector<ci::string> ¶ms) { - return do_util(u, &csmodeutils[MUT_VOICE], (params.size() > 0 ? params[0].c_str() : NULL), (params.size() > 1 ? params[1].c_str() : NULL)); + ChannelMode *cm = ModeManager::FindChannelModeByName(CMODE_VOICE); + + return do_util(u, cm, (params.size() > 0 ? params[0].c_str() : NULL), (params.size() > 1 ? params[1].c_str() : NULL), true, CA_VOICE, CA_VOICEME, "VOICE", 0); } bool OnHelp(User *u, const ci::string &subcommand) @@ -150,7 +168,9 @@ class CommandCSDeVoice : public Command CommandReturn Execute(User *u, std::vector<ci::string> ¶ms) { - return do_util(u, &csmodeutils[MUT_DEVOICE], (params.size() > 0 ? params[0].c_str() : NULL), (params.size() > 1 ? params[1].c_str() : NULL)); + ChannelMode *cm = ModeManager::FindChannelModeByName(CMODE_VOICE); + + return do_util(u, cm, (params.size() > 0 ? params[0].c_str() : NULL), (params.size() > 1 ? params[1].c_str() : NULL), false, CA_VOICE, CA_VOICEME, "DEVOICE", 0); } bool OnHelp(User *u, const ci::string &subcommand) @@ -175,12 +195,14 @@ class CommandCSHalfOp : public Command CommandReturn Execute(User *u, std::vector<ci::string> ¶ms) { - if (!ircd->halfop) + ChannelMode *cm = ModeManager::FindChannelModeByName(CMODE_HALFOP); + + if (!cm) { return MOD_CONT; } - return do_util(u, &csmodeutils[MUT_HALFOP], (params.size() > 0 ? params[0].c_str() : NULL), (params.size() > 1 ? params[1].c_str() : NULL)); + return do_util(u, cm, (params.size() > 0 ? params[0].c_str() : NULL), (params.size() > 1 ? params[1].c_str() : NULL), true, CA_HALFOP, CA_HALFOPME, "HALFOP", 0); } bool OnHelp(User *u, const ci::string &subcommand) @@ -205,12 +227,15 @@ class CommandCSDeHalfOp : public Command CommandReturn Execute(User *u, std::vector<ci::string> ¶ms) { - if (!ircd->halfop) + ChannelMode *cm = ModeManager::FindChannelModeByName(CMODE_HALFOP); + + if (!cm) { return MOD_CONT; + } - return do_util(u, &csmodeutils[MUT_DEHALFOP], (params.size() > 0 ? params[0].c_str() : NULL), (params.size() > 1 ? params[1].c_str() : NULL)); + return do_util(u, cm, (params.size() > 0 ? params[0].c_str() : NULL), (params.size() > 1 ? params[1].c_str() : NULL), false, CA_HALFOP, CA_HALFOPME, "DEHALFOP", 0); } bool OnHelp(User *u, const ci::string &subcommand) @@ -235,12 +260,14 @@ class CommandCSProtect : public Command CommandReturn Execute(User *u, std::vector<ci::string> ¶ms) { - if (!ircd->protect && !ircd->admin) + ChannelMode *cm = ModeManager::FindChannelModeByName(CMODE_PROTECT); + + if (!cm) { return MOD_CONT; } - return do_util(u, &csmodeutils[MUT_PROTECT], (params.size() > 0 ? params[0].c_str() : NULL), (params.size() > 1 ? params[1].c_str() : NULL)); + return do_util(u, cm, (params.size() > 0 ? params[0].c_str() : NULL), (params.size() > 1 ? params[1].c_str() : NULL), true, CA_PROTECT, CA_PROTECTME, "PROTECT", 0); } bool OnHelp(User *u, const ci::string &subcommand) @@ -255,8 +282,6 @@ class CommandCSProtect : public Command } }; -/*************************************************************************/ - class CommandCSDeProtect : public Command { public: @@ -266,12 +291,14 @@ class CommandCSDeProtect : public Command CommandReturn Execute(User *u, std::vector<ci::string> ¶ms) { - if (!ircd->protect && !ircd->admin) + ChannelMode *cm = ModeManager::FindChannelModeByName(CMODE_PROTECT); + + if (!cm) { return MOD_CONT; } - return do_util(u, &csmodeutils[MUT_DEPROTECT], (params.size() > 0 ? params[0].c_str() : NULL), (params.size() > 1 ? params[1].c_str() : NULL)); + return do_util(u, cm, (params.size() > 0 ? params[0].c_str() : NULL), (params.size() > 1 ? params[1].c_str() : NULL), false, CA_PROTECT, CA_PROTECTME, "DEPROTECT", 0); } bool OnHelp(User *u, const ci::string &subcommand) @@ -286,8 +313,6 @@ class CommandCSDeProtect : public Command } }; -/*************************************************************************/ - class CommandCSOwner : public Command { public: @@ -297,7 +322,14 @@ class CommandCSOwner : public Command CommandReturn Execute(User *u, std::vector<ci::string> ¶ms) { - return do_util(u, &csmodeutils[MUT_OWNER], (params.size() > 0 ? params[0].c_str() : NULL), NULL); + ChannelMode *cm = ModeManager::FindChannelModeByName(CMODE_OWNER); + + if (!cm) + { + return MOD_CONT; + } + + return do_util(u, cm, (params.size() > 0 ? params[0].c_str() : NULL), NULL, true, ACCESS_FOUNDER, ACCESS_FOUNDER, "OWNER", 0); } bool OnHelp(User *u, const ci::string &subcommand) @@ -312,8 +344,6 @@ class CommandCSOwner : public Command } }; -/*************************************************************************/ - class CommandCSDeOwner : public Command { public: @@ -323,7 +353,14 @@ class CommandCSDeOwner : public Command CommandReturn Execute(User *u, std::vector<ci::string> ¶ms) { - return do_util(u, &csmodeutils[MUT_DEOWNER], (params.size() > 0 ? params[0].c_str() : NULL), NULL); + ChannelMode *cm = ModeManager::FindChannelModeByName(CMODE_OWNER); + + if (!cm) + { + return MOD_CONT; + } + + return do_util(u, cm, (params.size() > 0 ? params[0].c_str() : NULL), NULL, false, ACCESS_FOUNDER, ACCESS_FOUNDER, "OWNER", 0); } bool OnHelp(User *u, const ci::string &subcommand) @@ -353,25 +390,19 @@ class CSModes : public Module this->AddCommand(CHANSERV, new CommandCSVoice()); this->AddCommand(CHANSERV, new CommandCSDeVoice()); - if (ircd->halfop) + if (ModeManager::FindChannelModeByName(CMODE_HALFOP)) { this->AddCommand(CHANSERV, new CommandCSHalfOp()); this->AddCommand(CHANSERV, new CommandCSDeHalfOp()); } - if (ircd->protect) - { - this->AddCommand(CHANSERV, new CommandCSProtect()); - this->AddCommand(CHANSERV, new CommandCSDeProtect()); - } - - if (ircd->admin) + if (ModeManager::FindChannelModeByName(CMODE_PROTECT)) { this->AddCommand(CHANSERV, new CommandCSProtect()); this->AddCommand(CHANSERV, new CommandCSDeProtect()); } - if (ircd->owner) + if (ModeManager::FindChannelModeByName(CMODE_OWNER)) { this->AddCommand(CHANSERV, new CommandCSOwner()); this->AddCommand(CHANSERV, new CommandCSDeOwner()); @@ -379,24 +410,27 @@ class CSModes : public Module } void ChanServHelp(User *u) { - if (ircd->owner) { + if (ModeManager::FindChannelModeByName(CMODE_OWNER)) + { notice_lang(s_ChanServ, u, CHAN_HELP_CMD_OWNER); notice_lang(s_ChanServ, u, CHAN_HELP_CMD_DEOWNER); } - if (ircd->protect) { + + if (ModeManager::FindChannelModeByName(CMODE_PROTECT)) + { notice_lang(s_ChanServ, u, CHAN_HELP_CMD_PROTECT); notice_lang(s_ChanServ, u, CHAN_HELP_CMD_DEPROTECT); - } else if (ircd->admin) { - notice_lang(s_ChanServ, u, CHAN_HELP_CMD_ADMIN); - notice_lang(s_ChanServ, u, CHAN_HELP_CMD_DEADMIN); } notice_lang(s_ChanServ, u, CHAN_HELP_CMD_OP); notice_lang(s_ChanServ, u, CHAN_HELP_CMD_DEOP); - if (ircd->halfop) { + + if (ModeManager::FindChannelModeByName(CMODE_HALFOP)) + { notice_lang(s_ChanServ, u, CHAN_HELP_CMD_HALFOP); notice_lang(s_ChanServ, u, CHAN_HELP_CMD_DEHALFOP); } + notice_lang(s_ChanServ, u, CHAN_HELP_CMD_VOICE); notice_lang(s_ChanServ, u, CHAN_HELP_CMD_DEVOICE); } |