X-Git-Url: https://git.netwichtig.de/gitweb/?a=blobdiff_plain;f=src%2Fmodules%2Fm_messageflood.cpp;h=52174792f53f45cc0ffb29e7f0e2a7c4a55780ee;hb=3a7dd5b129450b94e0a87b8ad5009da70905b8e5;hp=53c9500db44901f6682298faa0fd058cbb2b95c8;hpb=09afa5085614e0224a296abd082fce205003c3fe;p=user%2Fhenk%2Fcode%2Finspircd.git diff --git a/src/modules/m_messageflood.cpp b/src/modules/m_messageflood.cpp index 53c9500db..52174792f 100644 --- a/src/modules/m_messageflood.cpp +++ b/src/modules/m_messageflood.cpp @@ -21,11 +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) */ +/** Holds flood settings and state for mode +f + */ class floodsettings : public classbase { public: @@ -39,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) @@ -48,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; } @@ -68,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; @@ -84,10 +80,12 @@ class floodsettings : public classbase } }; +/** Handles channel mode +f + */ class MsgFlood : public ModeHandler { public: - MsgFlood() : ModeHandler('f', 1, 0, false, MODETYPE_CHANNEL, false) { } + MsgFlood(InspIRCd* Instance) : ModeHandler(Instance, 'f', 1, 0, false, MODETYPE_CHANNEL, false) { } ModePair ModeSet(userrec* source, userrec* dest, chanrec* channel, const std::string ¶meter) { @@ -158,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 @@ -184,17 +195,17 @@ class MsgFlood : public ModeHandler class ModuleMsgFlood : public Module { - Server *Srv; + MsgFlood* mf; public: - ModuleMsgFlood(Server* Me) + ModuleMsgFlood(InspIRCd* Me) : Module::Module(Me) { - Srv = Me; - mf = new MsgFlood(); - Srv->AddMode(mf, 'f'); + + mf = new MsgFlood(ServerInstance); + ServerInstance->AddMode(mf, 'f'); } void ProcessMessages(userrec* user,chanrec* dest, const std::string &text) @@ -215,7 +226,7 @@ class ModuleMsgFlood : public Module parameters[0] = dest->name; parameters[1] = "+b"; parameters[2] = user->MakeWildHost(); - Srv->SendMode(parameters,3,user); + ServerInstance->SendMode(parameters,3,user); std::deque n; /* Propogate the ban to other servers. * We dont know what protocol we may be using, @@ -227,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); } @@ -263,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) - { - 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); } }; @@ -294,7 +301,7 @@ class ModuleMsgFloodFactory : public ModuleFactory { } - virtual Module * CreateModule(Server* Me) + virtual Module * CreateModule(InspIRCd* Me) { return new ModuleMsgFlood(Me); }