]> git.netwichtig.de Git - user/henk/code/inspircd.git/blobdiff - src/modules/m_joinflood.cpp
Sync helpop chmodes s and p with docs
[user/henk/code/inspircd.git] / src / modules / m_joinflood.cpp
index cc62eb13bf7936008aa10fd52f6d07e424632781..3241020bfb32aa358b1580c4c749176918c09769 100644 (file)
@@ -1,11 +1,13 @@
 /*
  * InspIRCd -- Internet Relay Chat Daemon
  *
+ *   Copyright (C) 2013, 2016-2020 Sadie Powell <sadie@witchery.services>
+ *   Copyright (C) 2012-2014 Attila Molnar <attilamolnar@hush.com>
+ *   Copyright (C) 2012, 2019 Robby <robby@chatbelgie.be>
  *   Copyright (C) 2009 Daniel De Graaf <danieldg@inspircd.org>
+ *   Copyright (C) 2008 Robin Burchell <robin+git@viroteck.net>
  *   Copyright (C) 2007 Dennis Friis <peavey@inspircd.org>
- *   Copyright (C) 2007 Robin Burchell <robin+git@viroteck.net>
- *   Copyright (C) 2006-2007 Craig Edwards <craigedwards@brainbox.cc>
- *   Copyright (C) 2006 Oliver Lupton <oliverlupton@gmail.com>
+ *   Copyright (C) 2006-2007, 2010 Craig Edwards <brain@inspircd.org>
  *
  * This file is part of InspIRCd.  InspIRCd is free software: you can
  * redistribute it and/or modify it under the terms of the GNU General Public
@@ -22,6 +24,7 @@
 
 
 #include "inspircd.h"
+#include "modules/server.h"
 
 enum
 {
@@ -97,6 +100,7 @@ class JoinFlood : public ParamMode<JoinFlood, SimpleExtItem<joinfloodsettings> >
        JoinFlood(Module* Creator)
                : ParamMode<JoinFlood, SimpleExtItem<joinfloodsettings> >(Creator, "joinflood", 'j')
        {
+               syntax = "<joins>:<seconds>";
        }
 
        ModeAction OnSet(User* source, Channel* channel, std::string& parameter) CXX11_OVERRIDE
@@ -128,13 +132,24 @@ class JoinFlood : public ParamMode<JoinFlood, SimpleExtItem<joinfloodsettings> >
        }
 };
 
-class ModuleJoinFlood : public Module
+class ModuleJoinFlood
+       : public Module
+       , public ServerProtocol::LinkEventListener
 {
+ private:
        JoinFlood jf;
+       time_t ignoreuntil;
+       unsigned long bootwait;
+       unsigned long splitwait;
 
  public:
+       // Stop GCC warnings about the deprecated OnServerSplit event.
+       using ServerProtocol::LinkEventListener::OnServerSplit;
+
        ModuleJoinFlood()
-               : jf(this)
+               : ServerProtocol::LinkEventListener(this)
+               , jf(this)
+               , ignoreuntil(0)
        {
        }
 
@@ -142,6 +157,16 @@ class ModuleJoinFlood : public Module
        {
                ConfigTag* tag = ServerInstance->Config->ConfValue("joinflood");
                duration = tag->getDuration("duration", 60, 10, 600);
+               bootwait = tag->getDuration("bootwait", 30);
+               splitwait = tag->getDuration("splitwait", 30);
+
+               ignoreuntil = ServerInstance->startup_time + bootwait;
+       }
+
+       void OnServerSplit(const Server* server, bool error) CXX11_OVERRIDE
+       {
+               if (splitwait)
+                       ignoreuntil = ServerInstance->Time() + splitwait;
        }
 
        ModResult OnUserPreJoin(LocalUser* user, Channel* chan, const std::string& cname, std::string& privs, const std::string& keygiven) CXX11_OVERRIDE
@@ -151,7 +176,7 @@ class ModuleJoinFlood : public Module
                        joinfloodsettings *f = jf.ext.get(chan);
                        if (f && f->islocked())
                        {
-                               user->WriteNumeric(ERR_UNAVAILRESOURCE, chan->name, "This channel is temporarily unavailable (+j). Please try again later.");
+                               user->WriteNumeric(ERR_UNAVAILRESOURCE, chan->name, "This channel is temporarily unavailable (+j is set). Please try again later.");
                                return MOD_RES_DENY;
                        }
                }
@@ -161,7 +186,7 @@ class ModuleJoinFlood : public Module
        void OnUserJoin(Membership* memb, bool sync, bool created, CUList& excepts) CXX11_OVERRIDE
        {
                /* We arent interested in JOIN events caused by a network burst */
-               if (sync)
+               if (sync || ignoreuntil > ServerInstance->Time())
                        return;
 
                joinfloodsettings *f = jf.ext.get(memb->chan);
@@ -181,7 +206,7 @@ class ModuleJoinFlood : public Module
 
        Version GetVersion() CXX11_OVERRIDE
        {
-               return Version("Provides channel mode +j (join flood protection)", VF_VENDOR);
+               return Version("Adds channel mode j (joinflood) which helps protect against spammers which mass-join channels.", VF_VENDOR);
        }
 };