]> git.netwichtig.de Git - user/henk/code/inspircd.git/blobdiff - src/modules/m_mlock.cpp
Sync helpop chmodes s and p with docs
[user/henk/code/inspircd.git] / src / modules / m_mlock.cpp
index b5f34c93614fa644a17b1dd799ddfeeab77f70cc..5c302961d19b2def73d73896885a7df815503f6c 100644 (file)
@@ -1,7 +1,10 @@
 /*
  * InspIRCd -- Internet Relay Chat Daemon
  *
- *   Copyright (C) 2012 William Pitcock <nenolod@dereferenced.org>
+ *   Copyright (C) 2013, 2017 Sadie Powell <sadie@witchery.services>
+ *   Copyright (C) 2012, 2019 Robby <robby@chatbelgie.be>
+ *   Copyright (C) 2012, 2014-2015 Attila Molnar <attilamolnar@hush.com>
+ *   Copyright (C) 2012 Ariadne Conill <ariadne@dereferenced.org>
  *
  * This file is part of InspIRCd.  InspIRCd is free software: you can
  * redistribute it and/or modify it under the terms of the GNU General Public
  * along with this program.  If not, see <http://www.gnu.org/licenses/>.
  */
 
+
 #include "inspircd.h"
 
+enum
+{
+       // From Charybdis.
+       ERR_MLOCKRESTRICTED = 742
+};
+
 class ModuleMLock : public Module
 {
-private:
        StringExtItem mlock;
 
-public:
-       ModuleMLock() : mlock("mlock", this) {};
-
-       void init()
+ public:
+       ModuleMLock()
+               : mlock("mlock", ExtensionItem::EXT_CHANNEL, this)
        {
-               ServerInstance->Modules->Attach(I_OnPreMode, this);
-               ServerInstance->Extensions.Register(&this->mlock);
        }
 
-       Version GetVersion()
+       Version GetVersion() CXX11_OVERRIDE
        {
-               return Version("Implements the ability to have server-side MLOCK enforcement.", VF_VENDOR);
+               return Version("Allows services to lock channel modes so that they can not be changed.", VF_VENDOR);
        }
 
-       void Prioritize()
-       {
-               ServerInstance->Modules->SetPriority(this, I_OnPreMode, PRIORITY_FIRST);
-       }
-
-       ModResult OnPreMode(User* source, User* dest, Channel* channel, const std::vector<std::string>& parameters)
+       ModResult OnRawMode(User* source, Channel* channel, ModeHandler* mh, const std::string& parameter, bool adding) CXX11_OVERRIDE
        {
                if (!channel)
                        return MOD_RES_PASSTHRU;
@@ -51,22 +52,19 @@ public:
                        return MOD_RES_PASSTHRU;
 
                std::string *mlock_str = mlock.get(channel);
-               if (!mlock_str || mlock_str->empty())
+               if (!mlock_str)
                        return MOD_RES_PASSTHRU;
 
-               for (const char *modes = parameters[1].c_str(); *modes; modes++)
+               const char mode = mh->GetModeChar();
+               std::string::size_type p = mlock_str->find(mode);
+               if (p != std::string::npos)
                {
-                       if (mlock_str->find(*modes) != std::string::npos)
-                       {
-                               source->WriteNumeric(742, "%s %c %s :MODE cannot be set due to channel having an active MLOCK restriction policy",
-                                                    channel->name.c_str(), *modes, mlock_str->c_str());
-                               return MOD_RES_DENY;
-                       }
+                       source->WriteNumeric(ERR_MLOCKRESTRICTED, channel->name, mode, *mlock_str, "MODE cannot be set due to the channel having an active MLOCK restriction policy");
+                       return MOD_RES_DENY;
                }
 
                return MOD_RES_PASSTHRU;
        }
-
 };
 
 MODULE_INIT(ModuleMLock)