X-Git-Url: https://git.netwichtig.de/gitweb/?a=blobdiff_plain;f=src%2Fmodules%2Fm_messageflood.cpp;h=52174792f53f45cc0ffb29e7f0e2a7c4a55780ee;hb=3a7dd5b129450b94e0a87b8ad5009da70905b8e5;hp=145bc51a285e0db28308fb1408431a916c8f0afb;hpb=d0b4bb3811458aa335857514e4cbb95d5c84f433;p=user%2Fhenk%2Fcode%2Finspircd.git diff --git a/src/modules/m_messageflood.cpp b/src/modules/m_messageflood.cpp index 145bc51a2..52174792f 100644 --- a/src/modules/m_messageflood.cpp +++ b/src/modules/m_messageflood.cpp @@ -21,13 +21,12 @@ using namespace std; #include "users.h" #include "channels.h" #include "modules.h" -#include "helperfuncs.h" #include "inspircd.h" /* $ModDesc: Provides channel mode +f (message flood protection) */ -extern InspIRCd* ServerInstance; - +/** Holds flood settings and state for mode +f + */ class floodsettings : public classbase { public: @@ -41,7 +40,6 @@ class floodsettings : public classbase floodsettings(bool a, int b, int c) : ban(a), secs(b), lines(c) { reset = time(NULL) + secs; - log(DEBUG,"Create new floodsettings: %lu %lu",time(NULL),reset); }; void addmessage(userrec* who) @@ -50,16 +48,13 @@ class floodsettings : public classbase if (iter != counters.end()) { iter->second++; - log(DEBUG,"Count for %s is now %d",who->nick,iter->second); } else { counters[who] = 1; - log(DEBUG,"Count for %s is now *1*",who->nick); } if (time(NULL) > reset) { - log(DEBUG,"floodsettings timer Resetting."); counters.clear(); reset = time(NULL) + secs; } @@ -70,7 +65,6 @@ class floodsettings : public classbase std::map::iterator iter = counters.find(who); if (iter != counters.end()) { - log(DEBUG,"should kick? %d, %d",iter->second,this->lines); return (iter->second >= this->lines); } else return false; @@ -86,6 +80,8 @@ class floodsettings : public classbase } }; +/** Handles channel mode +f + */ class MsgFlood : public ModeHandler { public: @@ -160,6 +156,19 @@ class MsgFlood : public ModeHandler channel->SetModeParam('f', parameter.c_str(), true); return MODEACTION_ALLOW; } + else + { + if (((nlines != f->lines) || (nsecs != f->secs)) && ((nsecs > 0) && (nlines > 0))) + { + delete f; + floodsettings *f = new floodsettings(ban,nsecs,nlines); + parameter = ConvToStr(nlines) + ":" +ConvToStr(nsecs); + channel->Shrink("flood"); + channel->Extend("flood",f); + channel->SetModeParam('f', parameter.c_str(), true); + return MODEACTION_ALLOW; + } + } } } else @@ -229,7 +238,7 @@ class ModuleMsgFlood : public Module n.push_back("+b"); n.push_back(user->MakeWildHost()); Event rmode((char *)&n, NULL, "send_mode"); - rmode.Send(); + rmode.Send(ServerInstance); } dest->ServerKickUser(user, "Channel flood triggered (mode +f)", true); } @@ -265,22 +274,18 @@ class ModuleMsgFlood : public Module void Implements(char* List) { - List[I_On005Numeric] = List[I_OnChannelDelete] = List[I_OnUserNotice] = List[I_OnUserMessage] = 1; - } - - virtual void On005Numeric(std::string &output) - { - ServerInstance->ModeGrok->InsertMode(output, "f", 3); + List[I_OnChannelDelete] = List[I_OnUserNotice] = List[I_OnUserMessage] = 1; } virtual ~ModuleMsgFlood() { + ServerInstance->Modes->DelMode(mf); DELETE(mf); } virtual Version GetVersion() { - return Version(1,0,0,0,VF_STATIC|VF_VENDOR); + return Version(1, 0, 0, 0, VF_COMMON | VF_VENDOR); } };