]> git.netwichtig.de Git - user/henk/code/inspircd.git/blobdiff - src/modules/m_chanfilter.cpp
Add {To,From}{Human,Internal,Network} to ExtensionItem.
[user/henk/code/inspircd.git] / src / modules / m_chanfilter.cpp
index e7dc6372b664ca166b74b861a02da73573e3c87e..6131ab9166d2471f050a8cfaa8c960a148fb8c2a 100644 (file)
 class ChanFilter : public ListModeBase
 {
  public:
-       ChanFilter(Module* Creator) : ListModeBase(Creator, "filter", 'g', "End of channel spamfilter list", 941, 940, false, "chanfilter") { }
+       unsigned long maxlen;
 
-       bool ValidateParam(User* user, Channel* chan, std::string& word) CXX11_OVERRIDE {
-               if (word.length() > 35)
-               {
-                       user->WriteNumeric(935, chan->name, word, "%word is too long for censor list");
-                       return false;
-               }
-
-               return true;
-       }
-
-       void TellListTooLong(User* user, Channel* chan, std::string& word) CXX11_OVERRIDE
+       ChanFilter(Module* Creator)
+               : ListModeBase(Creator, "filter", 'g', "End of channel spamfilter list", 941, 940, false)
        {
-               user->WriteNumeric(939, chan->name, word, "Channel spamfilter list is full");
+               syntax = "<pattern>";
        }
 
-       void TellAlreadyOnList(User* user, Channel* chan, std::string& word) CXX11_OVERRIDE
+       bool ValidateParam(User* user, Channel* chan, std::string& word) CXX11_OVERRIDE
        {
-               user->WriteNumeric(937, chan->name, InspIRCd::Format("The word %s is already on the spamfilter list", word.c_str()));
-       }
+               if (word.length() > maxlen)
+               {
+                       user->WriteNumeric(Numerics::InvalidModeParameter(chan, this, word, "Word is too long for the spamfilter list."));
+                       return false;
+               }
 
-       void TellNotSet(User* user, Channel* chan, std::string& word) CXX11_OVERRIDE
-       {
-               user->WriteNumeric(938, chan->name, "No such spamfilter word is set");
+               return true;
        }
 };
 
@@ -65,6 +57,7 @@ class ModuleChanFilter : public Module
        CheckExemption::EventProvider exemptionprov;
        ChanFilter cf;
        bool hidemask;
+       bool notifyuser;
 
  public:
 
@@ -76,7 +69,10 @@ class ModuleChanFilter : public Module
 
        void ReadConfig(ConfigStatus& status) CXX11_OVERRIDE
        {
-               hidemask = ServerInstance->Config->ConfValue("chanfilter")->getBool("hidemask");
+               ConfigTag* tag = ServerInstance->Config->ConfValue("chanfilter");
+               hidemask = tag->getBool("hidemask");
+               cf.maxlen = tag->getUInt("maxlen", 35, 10, ModeParser::MODE_PARAM_MAX);
+               notifyuser = tag->getBool("notifyuser", true);
                cf.DoRehash();
        }
 
@@ -99,10 +95,16 @@ class ModuleChanFilter : public Module
                        {
                                if (InspIRCd::Match(details.text, i->mask))
                                {
+                                       if (!notifyuser)
+                                       {
+                                               details.echo_original = true;
+                                               return MOD_RES_DENY;
+                                       }
+
                                        if (hidemask)
                                                user->WriteNumeric(ERR_CANNOTSENDTOCHAN, chan->name, "Cannot send to channel (your message contained a censored word)");
                                        else
-                                               user->WriteNumeric(ERR_CANNOTSENDTOCHAN, chan->name, i->mask, "Cannot send to channel (your message contained a censored word)");
+                                               user->WriteNumeric(ERR_CANNOTSENDTOCHAN, chan->name, "Cannot send to channel (your message contained a censored word: " + i->mask + ")");
                                        return MOD_RES_DENY;
                                }
                        }
@@ -113,7 +115,12 @@ class ModuleChanFilter : public Module
 
        Version GetVersion() CXX11_OVERRIDE
        {
-               return Version("Provides channel-specific censor lists (like mode +G but varies from channel to channel)", VF_VENDOR);
+               // We don't send any link data if the length is 35 for compatibility with the 2.0 branch.
+               std::string maxfilterlen;
+               if (cf.maxlen != 35)
+                       maxfilterlen.assign(ConvToStr(cf.maxlen));
+
+               return Version("Provides channel-specific censor lists (like mode +G but varies from channel to channel)", VF_VENDOR, maxfilterlen);
        }
 };