diff options
Diffstat (limited to 'src/modules')
-rw-r--r-- | src/modules/m_quitban.cpp | 95 |
1 files changed, 95 insertions, 0 deletions
diff --git a/src/modules/m_quitban.cpp b/src/modules/m_quitban.cpp new file mode 100644 index 000000000..00a47beeb --- /dev/null +++ b/src/modules/m_quitban.cpp @@ -0,0 +1,95 @@ +/* +------------------------------------+ + * | Inspire Internet Relay Chat Daemon | + * +------------------------------------+ + * + * InspIRCd: (C) 2002-2007 InspIRCd Development Team + * See: http://www.inspircd.org/wiki/index.php/Credits + * + * This program is free but copyrighted software; see + * the file COPYING for details. + * + * --------------------------------------------------- + */ + +#include "inspircd.h" +#include "xline.h" + +/* $ModDesc: Creates a snomask with notices whenever a new channel is created */ + +class ModuleChanCreate : public Module +{ + private: + clonemap quits; + unsigned int threshold; + unsigned int banduration; + public: + ModuleChanCreate(InspIRCd* Me) : Module(Me) + { + Implementation eventlist[] = { I_OnUserDisconnect, I_OnGarbageCollect, I_OnRehash }; + ServerInstance->Modules->Attach(eventlist, this, 3); + OnRehash(NULL, ""); + } + + virtual ~ModuleChanCreate() + { + } + + virtual Version GetVersion() + { + return Version(1,1,0,0,VF_VENDOR,API_VERSION); + } + + virtual void OnRehash(User* user, const std::string ¶meter) + { + ConfigReader Conf(ServerInstance); + std::string duration; + + threshold = Conf.ReadInteger("quitban", "threshold", 0, true); + + if (threshold == 0) + threshold = 10; + + duration = Conf.ReadValue("quitban", "duration", 0, true); + + if (duration.empty()) + duration = "10m"; + + banduration = ServerInstance->Duration(duration); + } + + virtual void OnUserDisconnect(User *u) + { + clonemap::iterator i = quits.find(u->GetIPString()); + + if (i != quits.end()) + { + i->second++; + ServerInstance->Log(DEBUG, "quitban: Count for IP is now %d", i->second); + + if (i->second >= threshold) + { + // Create zline for set duration. + ZLine* zl = new ZLine(ServerInstance, ServerInstance->Time(), banduration, ServerInstance->Config->ServerName, "Quit flooding", u->GetIPString()); + if (ServerInstance->XLines->AddLine(zl,NULL)) + ServerInstance->XLines->ApplyLines(); + else + delete zl; + + ServerInstance->SNO->WriteToSnoMask('x', "Quit flooding from IP %s (%d)", u->GetIPString(), threshold); + } + } + else + { + quits[u->GetIPString()] = 1; + ServerInstance->Log(DEBUG, "quitban: Added new record"); + } + } + + virtual void OnGarbageCollect() + { + ServerInstance->Log(DEBUG, "quitban: Clearing map."); + quits.clear(); + } +}; + +MODULE_INIT(ModuleChanCreate) |