]> git.netwichtig.de Git - user/henk/code/inspircd.git/blobdiff - src/modules/m_repeat.cpp
Globally #undef min and max on Windows
[user/henk/code/inspircd.git] / src / modules / m_repeat.cpp
index 342ee9783d2b27720708fdf7db5bc8f2674713e0..d91fe7e8a5f1a868b5f84614292071762124d11a 100644 (file)
 
 #include "inspircd.h"
 
-#ifdef _WIN32
-// windows.h defines this
-#undef min
-#endif
-
 class RepeatMode : public ModeHandler
 {
  private:
@@ -49,18 +44,21 @@ class RepeatMode : public ModeHandler
                unsigned int MaxSecs;
                unsigned int MaxBacklog;
                unsigned int MaxDiff;
+               unsigned int MaxMessageSize;
                ModuleSettings() : MaxLines(0), MaxSecs(0), MaxBacklog(0), MaxDiff() { }
        };
 
-       std::vector<std::vector<unsigned int> > mx;
+       std::vector<unsigned int> mx[2];
        ModuleSettings ms;
 
        bool CompareLines(const std::string& message, const std::string& historyline, unsigned int trigger)
        {
-               if (trigger)
+               if (message == historyline)
+                       return true;
+               else if (trigger)
                        return (Levenshtein(message, historyline) <= trigger);
-               else
-                       return (message == historyline);
+
+               return false;
        }
 
        unsigned int Levenshtein(const std::string& s1, const std::string& s2)
@@ -68,14 +66,17 @@ class RepeatMode : public ModeHandler
                unsigned int l1 = s1.size();
                unsigned int l2 = s2.size();
 
-               for (unsigned int i = 0; i <= l1; i++)
-                       mx[i][0] = i;
-               for (unsigned int i = 0; i <= l2; i++)
+               for (unsigned int i = 0; i < l2; i++)
                        mx[0][i] = i;
-               for (unsigned int i = 1; i <= l1; i++)
-                       for (unsigned int j = 1; j <= l2; j++)
-                               mx[i][j] = std::min(std::min(mx[i - 1][j] + 1, mx[i][j - 1] + 1), mx[i - 1][j - 1] + (s1[i - 1] == s2[j - 1] ? 0 : 1));
-               return (mx[l1][l2]);
+               for (unsigned int i = 0; i < l1; i++)
+               {
+                       mx[1][0] = i + 1;
+                       for (unsigned int j = 0; j < l2; j++)
+                   mx[1][j + 1] = std::min(std::min(mx[1][j] + 1, mx[0][j + 1] + 1), mx[0][j] + ((s1[i] == s2[j]) ? 0 : 1));
+
+                       mx[0].swap(mx[1]);
+               }
+               return mx[0][l2];
        }
 
  public:
@@ -163,8 +164,8 @@ class RepeatMode : public ModeHandler
        {
                // If the message is larger than whatever size it's set to,
                // let's pretend it isn't. If the first 512 (def. setting) match, it's probably spam.
-               if (message.size() > mx.size())
-                       message.erase(mx.size());
+               if (message.size() > ms.MaxMessageSize)
+                       message.erase(ms.MaxMessageSize);
 
                MemberInfo* rp = MemberInfoExt.get(memb);
                if (!rp)
@@ -220,25 +221,12 @@ class RepeatMode : public ModeHandler
 
        void Resize(size_t size)
        {
-               if (size == mx.size())
+               size_t newsize = size+1;
+               if (newsize <= mx[0].size())
                        return;
-               mx.resize(size);
-
-               if (mx.size() > size)
-               {
-                       mx.resize(size);
-                       for (unsigned int i = 0; i < mx.size(); i++)
-                               mx[i].resize(size);
-               }
-               else
-               {
-                       for (unsigned int i = 0; i < mx.size(); i++)
-                       {
-                               mx[i].resize(size);
-                               std::vector<unsigned int>(mx[i]).swap(mx[i]);
-                       }
-                       std::vector<std::vector<unsigned int> >(mx).swap(mx);
-               }
+               ms.MaxMessageSize = size;
+               mx[0].resize(newsize);
+               mx[1].resize(newsize);
        }
 
        void ReadConfig()
@@ -354,17 +342,7 @@ class RepeatModule : public Module
  public:
        RepeatModule() : rm(this) {}
 
-       void init() CXX11_OVERRIDE
-       {
-               ServerInstance->Modules->AddService(rm);
-               ServerInstance->Modules->AddService(rm.ChanSet);
-               ServerInstance->Modules->AddService(rm.MemberInfoExt);
-               Implementation eventlist[] = { I_OnUserPreMessage, I_OnRehash };
-               ServerInstance->Modules->Attach(eventlist, this, sizeof(eventlist)/sizeof(Implementation));
-               rm.ReadConfig();
-       }
-
-       void OnRehash(User* user) CXX11_OVERRIDE
+       void ReadConfig(ConfigStatus& status) CXX11_OVERRIDE
        {
                rm.ReadConfig();
        }