]> git.netwichtig.de Git - user/henk/code/inspircd.git/blobdiff - src/modules/m_override.cpp
m_spanningtree Remove remains of the KeepNickTS workaround
[user/henk/code/inspircd.git] / src / modules / m_override.cpp
index e342e7dab2dffd92ded0ca0eafddf7114260e726..346d38b9f32b68518898689746f223e67a148a55 100644 (file)
@@ -35,6 +35,20 @@ class ModuleOverride : public Module
        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")
@@ -46,14 +60,12 @@ class ModuleOverride : public Module
 
        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");
@@ -105,14 +117,17 @@ class ModuleOverride : public Module
 
        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++)