]> git.netwichtig.de Git - user/henk/code/inspircd.git/commitdiff
Add an option to allow disengaging joinflood after a netsplit.
authorSadie Powell <sadie@witchery.services>
Mon, 12 Oct 2020 17:35:07 +0000 (18:35 +0100)
committerSadie Powell <sadie@witchery.services>
Mon, 12 Oct 2020 17:35:07 +0000 (18:35 +0100)
docs/conf/modules.conf.example
src/modules/m_joinflood.cpp

index 2f74634d7abbf381c80b9cbb07ba6c7aa913b224..a1bd056708da0d3f3025bf3267ca82bf5415f026 100644 (file)
 # Closes the channel for N seconds if X users join in Y seconds.
 #<module name="joinflood">
 #
-# The number of seconds to close the channel for:
-#<joinflood duration="1m">
+# duration:  The number of seconds to close a channel for when it is
+#            being flooded with joins.
+#
+# splitwait: The number of seconds to disengage joinflood for after
+#            a server splits. This allows users to reconnect without
+#            being throttled by joinflood.
+#
+#<joinflood duration="1m"
+#           splitwait="30s">
 
 #-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#
 # Anti auto rejoin: Adds support for prevention of auto-rejoin (+J).
index c4b9336fbc20e501821e110c16dc2912cb886999..e5af2a4c671b847057480463d60f47407d0e9bc6 100644 (file)
@@ -24,6 +24,7 @@
 
 
 #include "inspircd.h"
+#include "modules/server.h"
 
 enum
 {
@@ -131,13 +132,23 @@ 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 splitwait;
 
  public:
+       // Stop GCC warnings about the deprecated OnServerSplit event.
+       using ServerProtocol::LinkEventListener::OnServerSplit;
+
        ModuleJoinFlood()
-               : jf(this)
+               : ServerProtocol::LinkEventListener(this)
+               , jf(this)
+               , ignoreuntil(0)
        {
        }
 
@@ -145,6 +156,13 @@ class ModuleJoinFlood : public Module
        {
                ConfigTag* tag = ServerInstance->Config->ConfValue("joinflood");
                duration = tag->getDuration("duration", 60, 10, 600);
+               splitwait = tag->getDuration("splitwait", 30);
+       }
+
+       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
@@ -164,7 +182,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);