]> git.netwichtig.de Git - user/henk/code/inspircd.git/blobdiff - src/modules/m_override.cpp
Update the cloaks of connected users when their IP address changes.
[user/henk/code/inspircd.git] / src / modules / m_override.cpp
index fd09dd6ec96178fb283b56c63ac9316f6e1d3347..7155e7e76f797dfbe220a7473276e96fbd78051f 100644 (file)
 #include "inspircd.h"
 #include "modules/invite.h"
 
+class Override : public SimpleUserModeHandler
+{
+ public:
+       Override(Module* Creator) : SimpleUserModeHandler(Creator, "override", 'O')
+       {
+               oper = true;
+               if (!ServerInstance->Config->ConfValue("override")->getBool("enableumode"))
+                       DisableAutoRegister();
+       }
+};
+
 class ModuleOverride : public Module
 {
        bool RequireKey;
        bool NoisyOverride;
+       bool UmodeEnabled;
+       Override ou;
        ChanModeReference topiclock;
        ChanModeReference inviteonly;
        ChanModeReference key;
@@ -42,7 +55,7 @@ class ModuleOverride : public Module
                for (Modes::ChangeList::List::const_iterator i = list.begin(); i != list.end(); ++i)
                {
                        ModeHandler* mh = i->mh;
-                       if (mh->GetLevelRequired() > userlevel)
+                       if (mh->GetLevelRequired(i->adding) > userlevel)
                                return true;
                }
                return false;
@@ -65,7 +78,9 @@ class ModuleOverride : public Module
 
  public:
        ModuleOverride()
-               : topiclock(this, "topiclock")
+               : UmodeEnabled(false)
+               , ou(this)
+               , topiclock(this, "topiclock")
                , inviteonly(this, "inviteonly")
                , key(this, "key")
                , limit(this, "limit")
@@ -76,6 +91,7 @@ class ModuleOverride : public Module
        void init() CXX11_OVERRIDE
        {
                ServerInstance->SNO->EnableSnomask('v', "OVERRIDE");
+               UmodeEnabled = ServerInstance->Config->ConfValue("override")->getBool("enableumode");
        }
 
        void ReadConfig(ConfigStatus& status) CXX11_OVERRIDE
@@ -93,8 +109,11 @@ class ModuleOverride : public Module
 
        bool CanOverride(User* source, const char* token)
        {
-               std::string tokenlist = source->oper->getConfig("override");
+               // If we require oper override umode (+O) but it is not set
+               if (UmodeEnabled && !source->IsModeSet(ou))
+                       return false;
 
+               std::string tokenlist = source->oper->getConfig("override");
                // its defined or * is set, return its value as a boolean for if the token is set
                return ((tokenlist.find(token, 0) != std::string::npos) || (tokenlist.find("*", 0) != std::string::npos));
        }
@@ -189,7 +208,7 @@ class ModuleOverride : public Module
                                if (chan->IsModeSet(key) && (CanOverride(user,"KEY")) && keygiven != chan->GetModeParameter(key))
                                        return HandleJoinOverride(user, chan, keygiven, "the channel key", "+k");
 
-                               if (chan->IsModeSet(limit) && (chan->GetUserCounter() >= ConvToInt(chan->GetModeParameter(limit))) && (CanOverride(user,"LIMIT")))
+                               if (chan->IsModeSet(limit) && (chan->GetUserCounter() >= ConvToNum<size_t>(chan->GetModeParameter(limit))) && (CanOverride(user,"LIMIT")))
                                        return HandleJoinOverride(user, chan, keygiven, "the channel limit", "+l");
 
                                if (chan->IsBanned(user) && CanOverride(user,"BANWALK"))