ChanModeReference key;
ChanModeReference limit;
+ static bool IsOverride(unsigned int userlevel, const std::string& modeline)
+ {
+ for (std::string::const_iterator i = modeline.begin(); i != modeline.end(); ++i)
+ {
+ ModeHandler* mh = ServerInstance->Modes->FindMode(*i, MODETYPE_CHANNEL);
+ if (!mh)
+ continue;
+
+ if (mh->GetLevelRequired() > userlevel)
+ return true;
+ }
+ return false;
+ }
+
public:
ModuleOverride()
: topiclock(this, "topiclock")
void init() CXX11_OVERRIDE
{
- // read our config options (main config file)
- OnRehash(NULL);
ServerInstance->SNO->EnableSnomask('v', "OVERRIDE");
}
- void OnRehash(User* user) CXX11_OVERRIDE
+ void ReadConfig(ConfigStatus& status) CXX11_OVERRIDE
{
- // re-read our config options on a rehash
+ // re-read our config options
ConfigTag* tag = ServerInstance->Config->ConfValue("override");
NoisyOverride = tag->getBool("noisy");
RequireKey = tag->getBool("requirekey");
ModResult OnPreMode(User* source,User* dest,Channel* channel, const std::vector<std::string>& parameters) CXX11_OVERRIDE
{
- if (!source || !channel)
+ if (!channel)
return MOD_RES_PASSTHRU;
if (!source->IsOper() || !IS_LOCAL(source))
return MOD_RES_PASSTHRU;
unsigned int mode = channel->GetPrefixValue(source);
- if (mode < HALFOP_VALUE && CanOverride(source, "MODE"))
+ if (!IsOverride(mode, parameters[1]))
+ return MOD_RES_PASSTHRU;
+
+ if (CanOverride(source, "MODE"))
{
std::string msg = source->nick+" overriding modes:";
for(unsigned int i=0; i < parameters.size(); i++)