]> git.netwichtig.de Git - user/henk/code/inspircd.git/blobdiff - src/modules/m_filter.cpp
Merge pull request #984 from Renegade334/modules-exempt-uline
[user/henk/code/inspircd.git] / src / modules / m_filter.cpp
index 1e9b094f0ffb55d740eb4768050cd3983c635202..34d0bebb3cce91d865a14cde6f912b69ee4175b6 100644 (file)
@@ -156,7 +156,7 @@ class CommandFilter : public Command
 
 class ModuleFilter : public Module
 {
-       typedef std::set<std::string, irc::insensitive_swo> ExemptTargetSet;
+       typedef insp::flat_set<std::string, irc::insensitive_swo> ExemptTargetSet;
 
        bool initing;
        RegexFactory* factory;
@@ -172,6 +172,9 @@ class ModuleFilter : public Module
        // List of channel names excluded from filtering.
        ExemptTargetSet exemptedchans;
 
+       // List of target nicknames excluded from filtering.
+       ExemptTargetSet exemptednicks;
+
        ModuleFilter();
        CullResult cull();
        ModResult OnUserPreMessage(User* user, void* dest, int target_type, std::string& text, char status, CUList& exempt_list, MessageType msgtype) CXX11_OVERRIDE;
@@ -322,6 +325,10 @@ ModResult ModuleFilter::OnUserPreMessage(User* user, void* dest, int target_type
                if (target_type == TYPE_USER)
                {
                        User* t = (User*)dest;
+                       // Check if the target nick is exempted, if yes, ignore this message
+                       if (exemptednicks.count(t->nick))
+                               return MOD_RES_PASSTHRU;
+
                        target = t->nick;
                }
                else if (target_type == TYPE_CHANNEL)
@@ -370,7 +377,7 @@ ModResult ModuleFilter::OnUserPreMessage(User* user, void* dest, int target_type
 
 ModResult ModuleFilter::OnPreCommand(std::string &command, std::vector<std::string> &parameters, LocalUser *user, bool validated, const std::string &original_line)
 {
-       if (validated && IS_LOCAL(user))
+       if (validated)
        {
                flags = 0;
                bool parting;
@@ -444,6 +451,8 @@ void ModuleFilter::ReadConfig(ConfigStatus& status)
 {
        ConfigTagList tags = ServerInstance->Config->ConfTags("exemptfromfilter");
        exemptedchans.clear();
+       exemptednicks.clear();
+
        for (ConfigIter i = tags.first; i != tags.second; ++i)
        {
                ConfigTag* tag = i->second;
@@ -451,7 +460,12 @@ void ModuleFilter::ReadConfig(ConfigStatus& status)
                // If "target" is not found, try the old "channel" key to keep compatibility with 2.0 configs
                const std::string target = tag->getString("target", tag->getString("channel"));
                if (!target.empty())
-                       exemptedchans.insert(target);
+               {
+                       if (target[0] == '#')
+                               exemptedchans.insert(target);
+                       else
+                               exemptednicks.insert(target);
+               }
        }
 
        std::string newrxengine = ServerInstance->Config->ConfValue("filteropts")->getString("engine");
@@ -691,6 +705,10 @@ ModResult ModuleFilter::OnStats(char symbol, User* user, string_list &results)
                {
                        results.push_back("223 "+user->nick+" :EXEMPT "+(*i));
                }
+               for (ExemptTargetSet::const_iterator i = exemptednicks.begin(); i != exemptednicks.end(); ++i)
+               {
+                       results.push_back("223 "+user->nick+" :EXEMPT "+(*i));
+               }
        }
        return MOD_RES_PASSTHRU;
 }