X-Git-Url: https://git.netwichtig.de/gitweb/?a=blobdiff_plain;f=src%2Fmodules%2Fm_repeat.cpp;h=d91fe7e8a5f1a868b5f84614292071762124d11a;hb=5ac1ffce1168c4e3409e6667ff30285bfbc82bde;hp=86f26016d9cdb6adc488478e06a67b6685356628;hpb=3624c137a6db85eaab0372550c9dca79d6d21e55;p=user%2Fhenk%2Fcode%2Finspircd.git diff --git a/src/modules/m_repeat.cpp b/src/modules/m_repeat.cpp index 86f26016d..d91fe7e8a 100644 --- a/src/modules/m_repeat.cpp +++ b/src/modules/m_repeat.cpp @@ -19,11 +19,6 @@ #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 > mx; + std::vector 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: @@ -131,7 +132,6 @@ class RepeatMode : public ModeHandler MemberInfoExt.unset(i->second); ChanSet.unset(channel); - channel->SetModeParam(this, ""); return MODEACTION_ALLOW; } @@ -156,7 +156,6 @@ class RepeatMode : public ModeHandler return MODEACTION_DENY; ChanSet.set(channel, settings); - channel->SetModeParam(this, parameter); return MODEACTION_ALLOW; } @@ -165,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) @@ -222,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(mx[i]).swap(mx[i]); - } - std::vector >(mx).swap(mx); - } + ms.MaxMessageSize = size; + mx[0].resize(newsize); + mx[1].resize(newsize); } void ReadConfig() @@ -356,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(); }