]> git.netwichtig.de Git - user/henk/code/inspircd.git/blobdiff - src/modules/m_customprefix.cpp
Fix the cloaking module on C++98 compilers.
[user/henk/code/inspircd.git] / src / modules / m_customprefix.cpp
index c8ebde5ccae9de2de5ed22836a6f0a43d88eeddc..53b0376b241a353eeb8f5eaeb72df41ef18064a4 100644 (file)
@@ -1,6 +1,9 @@
 /*
  * InspIRCd -- Internet Relay Chat Daemon
  *
+ *   Copyright (C) 2013-2014 Attila Molnar <attilamolnar@hush.com>
+ *   Copyright (C) 2013, 2017-2018 Sadie Powell <sadie@witchery.services>
+ *   Copyright (C) 2012, 2019 Robby <robby@chatbelgie.be>
  *   Copyright (C) 2010 Daniel De Graaf <danieldg@inspircd.org>
  *
  * This file is part of InspIRCd.  InspIRCd is free software: you can
@@ -28,10 +31,14 @@ class CustomPrefixMode : public PrefixMode
                : PrefixMode(parent, Name, Letter, 0, Prefix)
                , tag(Tag)
        {
-               prefixrank = tag->getInt("rank", 0, 0, UINT_MAX);
-               ranktoset = tag->getInt("ranktoset", prefixrank, prefixrank, UINT_MAX);
-               ranktounset = tag->getInt("ranktounset", ranktoset, ranktoset, UINT_MAX);
-               selfremove = tag->getBool("depriv", true);
+               unsigned long rank = tag->getUInt("rank", 0, 0, UINT_MAX);
+               unsigned long setrank = tag->getUInt("ranktoset", prefixrank, rank, UINT_MAX);
+               unsigned long unsetrank = tag->getUInt("ranktounset", setrank, setrank, UINT_MAX);
+               bool depriv = tag->getBool("depriv", true);
+               this->Update(rank, setrank, unsetrank, depriv);
+
+               ServerInstance->Logs->Log(MODNAME, LOG_DEBUG, "Created the %s prefix: letter=%c prefix=%c rank=%u ranktoset=%u ranktounset=%i depriv=%d",
+                       name.c_str(), GetModeChar(), GetPrefix(), GetPrefixRank(), GetLevelRequired(true), GetLevelRequired(false), CanSelfRemove());
        }
 };
 
@@ -50,6 +57,27 @@ class ModuleCustomPrefix : public Module
                        if (name.empty())
                                throw ModuleException("<customprefix:name> must be specified at " + tag->getTagLocation());
 
+                       if (tag->getBool("change"))
+                       {
+                               ModeHandler* mh = ServerInstance->Modes->FindMode(name, MODETYPE_CHANNEL);
+                               if (!mh)
+                                       throw ModuleException("<customprefix:change> specified for a nonexistent mode at " + tag->getTagLocation());
+
+                               PrefixMode* pm = mh->IsPrefixMode();
+                               if (!pm)
+                                       throw ModuleException("<customprefix:change> specified for a non-prefix mode at " + tag->getTagLocation());
+
+                               unsigned long rank = tag->getUInt("rank", pm->GetPrefixRank(), 0, UINT_MAX);
+                               unsigned long setrank = tag->getUInt("ranktoset", pm->GetLevelRequired(true), rank, UINT_MAX);
+                               unsigned long unsetrank = tag->getUInt("ranktounset", pm->GetLevelRequired(false), setrank, UINT_MAX);
+                               bool depriv = tag->getBool("depriv", pm->CanSelfRemove());
+                               pm->Update(rank, setrank, unsetrank, depriv);
+
+                               ServerInstance->Logs->Log(MODNAME, LOG_DEBUG, "Changed the %s prefix: depriv=%u rank=%u ranktoset=%u ranktounset=%u",
+                                       pm->name.c_str(), pm->CanSelfRemove(), pm->GetPrefixRank(), pm->GetLevelRequired(true), pm->GetLevelRequired(false));
+                               continue;
+                       }
+
                        const std::string letter = tag->getString("letter");
                        if (letter.length() != 1)
                                throw ModuleException("<customprefix:letter> must be set to a mode character at " + tag->getTagLocation());
@@ -61,6 +89,7 @@ class ModuleCustomPrefix : public Module
                        try
                        {
                                CustomPrefixMode* mh = new CustomPrefixMode(this, name, letter[0], prefix[0], tag);
+                               modes.push_back(mh);
                                ServerInstance->Modules->AddService(*mh);
                        }
                        catch (ModuleException& e)
@@ -77,7 +106,7 @@ class ModuleCustomPrefix : public Module
 
        Version GetVersion() CXX11_OVERRIDE
        {
-               return Version("Provides custom prefix channel modes", VF_VENDOR);
+               return Version("Allows the server administrator to configure custom channel prefix modes.", VF_VENDOR);
        }
 };