]> git.netwichtig.de Git - user/henk/code/inspircd.git/commitdiff
Merge pull request #1271 from SaberUK/master+exemption
authorPeter Powell <petpow@saberuk.com>
Thu, 27 Jul 2017 12:13:16 +0000 (13:13 +0100)
committerGitHub <noreply@github.com>
Thu, 27 Jul 2017 12:13:16 +0000 (13:13 +0100)
Move the OnCheckExemption hook out of the core.

1  2 
src/coremods/core_channel/core_channel.cpp
src/modules/m_messageflood.cpp

index 6fe6199dbd7ff321225797a2989a0ff036f128af,b77aac7e27604c940d2f00c5577ea99c80d5049c..3af809645e8fbb4fa8110d4b4aa218ae18a0c27b
@@@ -20,9 -20,8 +20,9 @@@
  #include "inspircd.h"
  #include "core_channel.h"
  #include "invite.h"
 +#include "listmode.h"
  
- class CoreModChannel : public Module
+ class CoreModChannel : public Module, public CheckExemption::EventListener
  {
        Invite::APIImpl invapi;
        CommandInvite cmdinvite;
                        for (unsigned int i = 0; i < sizeof(events)/sizeof(Implementation); i++)
                                ServerInstance->Modules.Detach(events[i], this);
                }
+               std::string current;
+               irc::spacesepstream defaultstream(optionstag->getString("exemptchanops"));
+               insp::flat_map<std::string, char> exempts;
+               while (defaultstream.GetToken(current))
+               {
+                       std::string::size_type pos = current.find(':');
+                       if (pos == std::string::npos || (pos + 2) > current.size())
+                               throw ModuleException("Invalid exemptchanops value '" + current + "' at " + optionstag->getTagLocation());
+                       const std::string restriction = current.substr(0, pos);
+                       const char prefix = current[pos + 1];
+                       ServerInstance->Logs->Log(MODNAME, LOG_DEBUG, "Exempting prefix %c from %s", prefix, restriction.c_str());
+                       exempts[restriction] = prefix;
+               }
+               exemptions.swap(exempts);
        }
  
 +      void On005Numeric(std::map<std::string, std::string>& tokens) CXX11_OVERRIDE
 +      {
 +              // Build a map of limits to their mode character.
 +              insp::flat_map<int, std::string> limits;
 +              const ModeParser::ListModeList& listmodes = ServerInstance->Modes->GetListModes();
 +              for (ModeParser::ListModeList::const_iterator iter = listmodes.begin(); iter != listmodes.end(); ++iter)
 +              {
 +                      const unsigned int limit = (*iter)->GetLowerLimit();
 +                      limits[limit].push_back((*iter)->GetModeChar());
 +              }
 +
 +              // Generate the MAXLIST token from the limits map.
 +              std::string& buffer = tokens["MAXLIST"];
 +              for (insp::flat_map<int, std::string>::const_iterator iter = limits.begin(); iter != limits.end(); ++iter)
 +              {
 +                      if (!buffer.empty())
 +                              buffer.push_back(',');
 +
 +                      buffer.append(iter->second);
 +                      buffer.push_back(':');
 +                      buffer.append(ConvToStr(iter->first));
 +              }
 +      }
 +
        void OnPostJoin(Membership* memb) CXX11_OVERRIDE
        {
                Channel* const chan = memb->chan;
Simple merge