]> git.netwichtig.de Git - user/henk/code/inspircd.git/blobdiff - src/modules/m_shun.cpp
Add support for blocking tag messages with the deaf mode.
[user/henk/code/inspircd.git] / src / modules / m_shun.cpp
index 6be91ce671b23d1a70c193919bdcd73607b97f8c..d63b721a0ebe5938c285cbcbbfcfacb948692e58 100644 (file)
@@ -4,18 +4,16 @@
  *   Copyright (C) 2019 Matt Schatz <genius3000@g3k.solutions>
  *   Copyright (C) 2018 linuxdaemon <linuxdaemon.irc@gmail.com>
  *   Copyright (C) 2017-2018 B00mX0r <b00mx0r@aureus.pw>
- *   Copyright (C) 2013, 2017-2018, 2020 Sadie Powell <sadie@witchery.services>
- *   Copyright (C) 2012-2016 Attila Molnar <attilamolnar@hush.com>
- *   Copyright (C) 2012, 2018-2019 Robby <robby@chatbelgie.be>
+ *   Copyright (C) 2013, 2017-2018, 2020-2021 Sadie Powell <sadie@witchery.services>
+ *   Copyright (C) 2012-2013, 2015-2016 Attila Molnar <attilamolnar@hush.com>
+ *   Copyright (C) 2012, 2019 Robby <robby@chatbelgie.be>
  *   Copyright (C) 2012 Jens Voss <DukePyrolator@anope.org>
  *   Copyright (C) 2009 Uli Schlachter <psychon@inspircd.org>
- *   Copyright (C) 2009 Matt Smith <dz@inspircd.org>
- *   Copyright (C) 2009 John Brooks <special@inspircd.org>
  *   Copyright (C) 2009 Dennis Friis <peavey@inspircd.org>
  *   Copyright (C) 2009 Daniel De Graaf <danieldg@inspircd.org>
  *   Copyright (C) 2008-2010 Craig Edwards <brain@inspircd.org>
- *   Copyright (C) 2008-2009 Robin Burchell <robin+git@viroteck.net>
  *   Copyright (C) 2008 Thomas Stagner <aquanight@inspircd.org>
+ *   Copyright (C) 2008 Robin Burchell <robin+git@viroteck.net>
  *
  * 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
@@ -154,13 +152,19 @@ class ModuleShun : public Module, public Stats::EventListener
  private:
        CommandShun cmd;
        ShunFactory shun;
+       insp::flat_set<std::string, irc::insensitive_swo> cleanedcommands;
        insp::flat_set<std::string, irc::insensitive_swo> enabledcommands;
        bool affectopers;
+       bool allowconnect;
        bool allowtags;
        bool notifyuser;
 
        bool IsShunned(LocalUser* user)
        {
+               // Exempt the user if they are not fully connected and allowconnect is enabled.
+               if (allowconnect && user->registered != REG_ALL)
+                       return false;
+
                // Exempt the user from shuns if they are an oper and affectopers is disabled.
                if (!affectopers && user->IsOper())
                        return false;
@@ -210,6 +214,11 @@ class ModuleShun : public Module, public Stats::EventListener
        {
                ConfigTag* tag = ServerInstance->Config->ConfValue("shun");
 
+               cleanedcommands.clear();
+               irc::spacesepstream cleanedcmds(tag->getString("cleanedcommands", "AWAY PART QUIT"));
+               for (std::string cleanedcmd; cleanedcmds.GetToken(cleanedcmd); )
+                       cleanedcommands.insert(cleanedcmd);
+
                enabledcommands.clear();
                irc::spacesepstream enabledcmds(tag->getString("enabledcommands", "ADMIN OPER PING PONG QUIT", 1));
                for (std::string enabledcmd; enabledcmds.GetToken(enabledcmd); )
@@ -217,6 +226,7 @@ class ModuleShun : public Module, public Stats::EventListener
 
                affectopers = tag->getBool("affectopers", false);
                allowtags = tag->getBool("allowtags");
+               allowconnect = tag->getBool("allowconnect");
                notifyuser = tag->getBool("notifyuser", true);
        }
 
@@ -244,18 +254,26 @@ class ModuleShun : public Module, public Stats::EventListener
                                        tag++;
                        }
                }
-               if (command == "QUIT")
-               {
-                       /* Allow QUIT but dont show any quit message */
-                       parameters.clear();
-               }
-               else if ((command == "PART") && (parameters.size() > 1))
+
+               if (cleanedcommands.count(command))
                {
-                       /* same for PART */
-                       parameters.pop_back();
+                       if (command == "AWAY" && !parameters.empty())
+                       {
+                               // Allow away but only for unsetting.
+                               parameters.clear();
+                       }
+                       else if (command == "PART" && parameters.size() > 1)
+                       {
+                               // Allow part but strip the message.
+                               parameters.pop_back();
+                       }
+                       else if (command == "QUIT" && !parameters.empty())
+                       {
+                               // Allow quit but strip the message.
+                               parameters.clear();
+                       }
                }
 
-               /* if we're here, allow the command. */
                return MOD_RES_PASSTHRU;
        }