diff options
-rw-r--r-- | data/chanserv.example.conf | 12 | ||||
-rw-r--r-- | include/channels.h | 2 | ||||
-rw-r--r-- | include/regchannel.h | 4 | ||||
-rw-r--r-- | modules/commands/cs_enforce.cpp | 2 | ||||
-rw-r--r-- | modules/commands/cs_set_autoop.cpp | 80 | ||||
-rw-r--r-- | modules/commands/cs_sync.cpp | 2 | ||||
-rw-r--r-- | modules/commands/cs_updown.cpp | 4 | ||||
-rw-r--r-- | modules/extra/m_statusupdate.cpp | 2 | ||||
-rw-r--r-- | modules/protocol/bahamut.cpp | 4 | ||||
-rw-r--r-- | modules/protocol/inspircd-ts6.h | 2 | ||||
-rw-r--r-- | modules/protocol/inspircd11.cpp | 2 | ||||
-rw-r--r-- | modules/protocol/plexus.cpp | 2 | ||||
-rw-r--r-- | modules/protocol/ratbox.cpp | 2 | ||||
-rw-r--r-- | modules/protocol/unreal.cpp | 2 | ||||
-rw-r--r-- | modules/pseudoclients/nickserv.cpp | 4 | ||||
-rw-r--r-- | src/channels.cpp | 12 | ||||
-rw-r--r-- | src/config.cpp | 2 |
17 files changed, 118 insertions, 22 deletions
diff --git a/data/chanserv.example.conf b/data/chanserv.example.conf index 87d77b330..e605dc8b3 100644 --- a/data/chanserv.example.conf +++ b/data/chanserv.example.conf @@ -89,6 +89,7 @@ chanserv * level or superior to the target * - topiclock: Disallow the topic to be changed except with ChanServ's TOPIC command * - persist: Keep the channel open at all times + * - noautoop: Disables autoop on the channel * - none: No defaults * * This directive is optional, if left blank, the options will default to keeptopic, secure, securefounder, @@ -1088,6 +1089,17 @@ module { name = "cs_saset" } command { service = "ChanServ"; name = "SASET"; command = "chanserv/saset"; permission = "chanserv/saset"; } /* + * cs_set_autoop + * + * Provides the command chanserv/set/autoop. + * + * Used for controlling whether or not ChanServ automatically gives channel status to users. + */ +module { name = "cs_set_autoop" } +command { service = "ChanServ"; name = "SET AUTOOP"; command = "chanserv/set/autoop"; } +command { service = "ChanServ"; name = "SASET AUTOOP"; command = "chanserv/set/autoop"; permission = "chanserv/saset/autoop"; } + +/* * cs_set_bantype * * Provides the command chanserv/set/bantype. diff --git a/include/channels.h b/include/channels.h index dbc71129d..b64ae84f4 100644 --- a/include/channels.h +++ b/include/channels.h @@ -255,6 +255,6 @@ extern CoreExport void do_join(const Anope::string &source, const Anope::string extern CoreExport void do_kick(const Anope::string &source, const Anope::string &channel, const Anope::string &users, const Anope::string &reason); extern CoreExport void do_part(const Anope::string &source, const Anope::string &channels, const Anope::string &reason); -extern CoreExport void chan_set_correct_modes(const User *user, Channel *c, int give_modes); +extern CoreExport void chan_set_correct_modes(const User *user, Channel *c, int give_modes, bool check_noop); #endif // CHANNELS_H diff --git a/include/regchannel.h b/include/regchannel.h index 9640a6735..b22ebf677 100644 --- a/include/regchannel.h +++ b/include/regchannel.h @@ -62,6 +62,8 @@ enum ChannelInfoFlag CI_PERSIST, /* Chanstats are enabled */ CI_STATS, + /* If set users are not auto given any status on join */ + CI_NOAUTOOP, CI_END }; @@ -69,7 +71,7 @@ enum ChannelInfoFlag const Anope::string ChannelInfoFlagStrings[] = { "BEGIN", "KEEPTOPIC", "SECUREOPS", "PRIVATE", "TOPICLOCK", "RESTRICTED", "PEACE", "SECURE", "NO_EXPIRE", "MEMO_HARDMAX", "SECUREFOUNDER", - "SIGNKICK", "SIGNKICK_LEVEL", "SUSPENDED", "PERSIST", "STATS", "" + "SIGNKICK", "SIGNKICK_LEVEL", "SUSPENDED", "PERSIST", "STATS", "NOAUTOOP", "" }; /** Flags for badwords diff --git a/modules/commands/cs_enforce.cpp b/modules/commands/cs_enforce.cpp index 96031a96f..031b592c4 100644 --- a/modules/commands/cs_enforce.cpp +++ b/modules/commands/cs_enforce.cpp @@ -60,7 +60,7 @@ class CommandCSEnforce : public Command { UserContainer *uc = *it; - chan_set_correct_modes(uc->user, c, 0); + chan_set_correct_modes(uc->user, c, 0, false); } if (hadsecureops) diff --git a/modules/commands/cs_set_autoop.cpp b/modules/commands/cs_set_autoop.cpp new file mode 100644 index 000000000..ee0b0433e --- /dev/null +++ b/modules/commands/cs_set_autoop.cpp @@ -0,0 +1,80 @@ +/* ChanServ core functions + * + * (C) 2003-2012 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 CommandCSSetAutoOp : public Command +{ + public: + CommandCSSetAutoOp(Module *creator, const Anope::string &cname = "chanserv/set/autoop") : Command(creator, cname, 2, 2) + { + this->SetDesc(_("Should services automatically give status to users")); + this->SetSyntax(_("\037channel\037 {ON | OFF}")); + } + + void Execute(CommandSource &source, const std::vector<Anope::string> ¶ms) anope_override + { + ChannelInfo *ci = cs_findchan(params[0]); + if (ci == NULL) + { + source.Reply(CHAN_X_NOT_REGISTERED, params[0].c_str()); + return; + } + + if (source.permission.empty() && !source.AccessFor(ci).HasPriv("SET")) + { + source.Reply(ACCESS_DENIED); + return; + } + + if (params[1].equals_ci("ON")) + { + ci->UnsetFlag(CI_NOAUTOOP); + source.Reply(_("Services will now automatically give modes to users in \2%s\2"), ci->name.c_str()); + } + else if (params[1].equals_ci("OFF")) + { + ci->SetFlag(CI_NOAUTOOP); + source.Reply(_("Services will no longer automatically give modes to users in \2%s\2"), ci->name.c_str()); + } + else + this->OnSyntaxError(source, "AUTOOP"); + } + + bool OnHelp(CommandSource &source, const Anope::string &) anope_override + { + this->SendSyntax(source); + source.Reply(" "); + source.Reply(_("Enables or disables %s's autoop feature for a\n" + "channel. When disabled, users who join the channel will\n" + "not automatically gain any status from %s"), Config->ChanServ.c_str(), + Config->ChanServ.c_str(), this->name.c_str()); + return true; + } +}; + + +class CSSetAutoOp : public Module +{ + CommandCSSetAutoOp commandcssetautoop; + + public: + CSSetAutoOp(const Anope::string &modname, const Anope::string &creator) : Module(modname, creator, CORE), + commandcssetautoop(this) + { + this->SetAuthor("Anope"); + + } +}; + +MODULE_INIT(CSSetAutoOp) diff --git a/modules/commands/cs_sync.cpp b/modules/commands/cs_sync.cpp index 549860c01..411ba6282 100644 --- a/modules/commands/cs_sync.cpp +++ b/modules/commands/cs_sync.cpp @@ -33,7 +33,7 @@ class CommandCSSync : public Command else { for (CUserList::iterator it = ci->c->users.begin(), it_end = ci->c->users.end(); it != it_end; ++it) - chan_set_correct_modes((*it)->user, ci->c, 1); + chan_set_correct_modes((*it)->user, ci->c, 1, false); source.Reply(_("All user modes on \002%s\002 have been synced."), ci->name.c_str()); } diff --git a/modules/commands/cs_updown.cpp b/modules/commands/cs_updown.cpp index 56841f5a9..4d84ff5f5 100644 --- a/modules/commands/cs_updown.cpp +++ b/modules/commands/cs_updown.cpp @@ -32,7 +32,7 @@ class CommandCSUp : public Command for (UChannelList::iterator it = u->chans.begin(); it != u->chans.end(); ++it) { Channel *c = (*it)->chan; - chan_set_correct_modes(u, c, 1); + chan_set_correct_modes(u, c, 1, false); } else { @@ -44,7 +44,7 @@ class CommandCSUp : public Command else if (!c->ci) source.Reply(CHAN_X_NOT_REGISTERED, channel.c_str()); else - chan_set_correct_modes(u, c, 1); + chan_set_correct_modes(u, c, 1, false); } } diff --git a/modules/extra/m_statusupdate.cpp b/modules/extra/m_statusupdate.cpp index 3c6e60246..7cbd9c7be 100644 --- a/modules/extra/m_statusupdate.cpp +++ b/modules/extra/m_statusupdate.cpp @@ -43,7 +43,7 @@ class StatusUpdate : public Module for (int i = 0; !modeInfo[i].priv.empty(); ++i) if (!access->HasPriv(modeInfo[i].priv)) ci->c->RemoveMode(NULL, modeInfo[i].name, user->nick); - chan_set_correct_modes(user, ci->c, 1); + chan_set_correct_modes(user, ci->c, 1, false); } } } diff --git a/modules/protocol/bahamut.cpp b/modules/protocol/bahamut.cpp index 2e6e0eff2..73955149d 100644 --- a/modules/protocol/bahamut.cpp +++ b/modules/protocol/bahamut.cpp @@ -423,7 +423,7 @@ class BahamutIRCdMessage : public IRCdMessage c->JoinUser(u); /* Now set whatever modes this user is allowed to have on the channel */ - chan_set_correct_modes(u, c, 1); + chan_set_correct_modes(u, c, 1, true); /* Check to see if modules want the user to join, if they do * check to see if they are allowed to join (CheckKick will kick/ban them) @@ -479,7 +479,7 @@ class BahamutIRCdMessage : public IRCdMessage c->SetModeInternal(NULL, *it, buf); /* Now set whatever modes this user is allowed to have on the channel */ - chan_set_correct_modes(u, c, 1); + chan_set_correct_modes(u, c, 1, true); /* Check to see if modules want the user to join, if they do * check to see if they are allowed to join (CheckKick will kick/ban them) diff --git a/modules/protocol/inspircd-ts6.h b/modules/protocol/inspircd-ts6.h index c35b05f58..80cc4973b 100644 --- a/modules/protocol/inspircd-ts6.h +++ b/modules/protocol/inspircd-ts6.h @@ -471,7 +471,7 @@ class InspircdIRCdMessage : public IRCdMessage c->SetModeInternal(NULL, *it, buf); /* Now set whatever modes this user is allowed to have on the channel */ - chan_set_correct_modes(u, c, 1); + chan_set_correct_modes(u, c, 1, true); /* Check to see if modules want the user to join, if they do * check to see if they are allowed to join (CheckKick will kick/ban them) diff --git a/modules/protocol/inspircd11.cpp b/modules/protocol/inspircd11.cpp index 8aea24430..7470d61aa 100644 --- a/modules/protocol/inspircd11.cpp +++ b/modules/protocol/inspircd11.cpp @@ -722,7 +722,7 @@ class InspircdIRCdMessage : public IRCdMessage c->SetModeInternal(NULL, *it, buf); /* Now set whatever modes this user is allowed to have on the channel */ - chan_set_correct_modes(u, c, 1); + chan_set_correct_modes(u, c, 1, true); /* Check to see if modules want the user to join, if they do * check to see if they are allowed to join (CheckKick will kick/ban them) diff --git a/modules/protocol/plexus.cpp b/modules/protocol/plexus.cpp index 542589f50..5debfa5dc 100644 --- a/modules/protocol/plexus.cpp +++ b/modules/protocol/plexus.cpp @@ -412,7 +412,7 @@ class PlexusIRCdMessage : public IRCdMessage c->SetModeInternal(NULL, *it, buf); /* Now set whatever modes this user is allowed to have on the channel */ - chan_set_correct_modes(u, c, 1); + chan_set_correct_modes(u, c, 1, true); /* Check to see if modules want the user to join, if they do * check to see if they are allowed to join (CheckKick will kick/ban them) diff --git a/modules/protocol/ratbox.cpp b/modules/protocol/ratbox.cpp index adf9a8d0c..1054c0b8c 100644 --- a/modules/protocol/ratbox.cpp +++ b/modules/protocol/ratbox.cpp @@ -385,7 +385,7 @@ class RatboxIRCdMessage : public IRCdMessage c->SetModeInternal(NULL, *it, buf); /* Now set whatever modes this user is allowed to have on the channel */ - chan_set_correct_modes(u, c, 1); + chan_set_correct_modes(u, c, 1, true); /* Check to see if modules want the user to join, if they do * check to see if they are allowed to join (CheckKick will kick/ban them) diff --git a/modules/protocol/unreal.cpp b/modules/protocol/unreal.cpp index 9b6bf73ce..51e960fc0 100644 --- a/modules/protocol/unreal.cpp +++ b/modules/protocol/unreal.cpp @@ -935,7 +935,7 @@ class Unreal32IRCdMessage : public IRCdMessage c->SetModeInternal(NULL, *it, buf); /* Now set whatever modes this user is allowed to have on the channel */ - chan_set_correct_modes(u, c, 1); + chan_set_correct_modes(u, c, 1, true); /* Check to see if modules want the user to join, if they do * check to see if they are allowed to join (CheckKick will kick/ban them) diff --git a/modules/pseudoclients/nickserv.cpp b/modules/pseudoclients/nickserv.cpp index 6307434de..86b525950 100644 --- a/modules/pseudoclients/nickserv.cpp +++ b/modules/pseudoclients/nickserv.cpp @@ -250,7 +250,7 @@ class NickServCore : public Module ChannelContainer *cc = *it; Channel *c = cc->chan; if (c) - chan_set_correct_modes(u, c, 1); + chan_set_correct_modes(u, c, 1, true); } if (Config->NSForceEmail && u->Account()->email.empty()) @@ -286,7 +286,7 @@ class NickServCore : public Module ChannelContainer *cc = *it; Channel *c = cc->chan; if (c) - chan_set_correct_modes(u, c, 1); + chan_set_correct_modes(u, c, 1, false); } } diff --git a/src/channels.cpp b/src/channels.cpp index 385376ea2..e89b6010d 100644 --- a/src/channels.cpp +++ b/src/channels.cpp @@ -94,7 +94,7 @@ void Channel::Reset() this->CheckModes(); for (CUserList::const_iterator it = this->users.begin(), it_end = this->users.end(); it != it_end; ++it) - chan_set_correct_modes((*it)->user, this, 1); + chan_set_correct_modes((*it)->user, this, 1, false); if (this->ci) this->ci->RestoreTopic(); @@ -371,7 +371,7 @@ void Channel::SetModeInternal(User *setter, ChannelMode *cm, const Anope::string /* Enforce secureops, etc */ if (EnforceMLock) - chan_set_correct_modes(u, this, 0); + chan_set_correct_modes(u, this, 0, false); return; } @@ -454,7 +454,7 @@ void Channel::RemoveModeInternal(User *setter, ChannelMode *cm, const Anope::str this->SetMode(bi, cm, bi->nick); } - chan_set_correct_modes(u, this, 0); + chan_set_correct_modes(u, this, 0, false); } return; } @@ -1042,7 +1042,7 @@ void do_join(const Anope::string &source, const Anope::string &channels, const A /* Join the user to the channel */ chan->JoinUser(user); /* Set the propre modes on the user */ - chan_set_correct_modes(user, chan, 1); + chan_set_correct_modes(user, chan, 1, true); /* Modules may want to allow this user in the channel, check. * If not, CheckKick will kick/ban them, don't call OnJoinChannel after this as the user will have @@ -1153,7 +1153,7 @@ void do_cmode(const Anope::string &source, const Anope::string &channel, const A * @param give_modes Set to 1 to give modes, 0 to not give modes * @return void **/ -void chan_set_correct_modes(const User *user, Channel *c, int give_modes) +void chan_set_correct_modes(const User *user, Channel *c, int give_modes, bool check_noop) { ChannelMode *owner = ModeManager::FindChannelModeByName(CMODE_OWNER), *admin = ModeManager::FindChannelModeByName(CMODE_PROTECT), @@ -1173,7 +1173,7 @@ void chan_set_correct_modes(const User *user, Channel *c, int give_modes) AccessGroup u_access = ci->AccessFor(user); - if (give_modes && (!user->Account() || user->Account()->HasFlag(NI_AUTOOP))) + if (give_modes && (!user->Account() || user->Account()->HasFlag(NI_AUTOOP)) && (!check_noop || !ci->HasFlag(CI_NOAUTOOP))) { if (owner && u_access.HasPriv("AUTOOWNER")) c->SetMode(NULL, CMODE_OWNER, user->nick); diff --git a/src/config.cpp b/src/config.cpp index fb1849e6c..6896be7c8 100644 --- a/src/config.cpp +++ b/src/config.cpp @@ -116,6 +116,8 @@ ServerConfig::ServerConfig() : config_data(), NSDefFlags(NickCoreFlagStrings), C this->CSDefFlags.SetFlag(CI_PEACE); else if (option.equals_ci("persist")) this->CSDefFlags.SetFlag(CI_PERSIST); + else if (option.equals_ci("noautoop")) + this->CSDefFlags.SetFlag(CI_NOAUTOOP); } } |