]> git.netwichtig.de Git - user/henk/code/inspircd.git/blobdiff - src/modules/m_chanfilter.cpp
Implement support for IPv6 GeoIP lookups.
[user/henk/code/inspircd.git] / src / modules / m_chanfilter.cpp
index e7dc6372b664ca166b74b861a02da73573e3c87e..903aab33a8eeb2f5f2e724a0225a6188849152b1 100644 (file)
 #include "listmode.h"
 #include "modules/exemption.h"
 
+enum
+{
+       // InspIRCd-specific.
+       ERR_ALREADYCHANFILTERED = 937,
+       ERR_NOSUCHCHANFILTER = 938,
+       ERR_CHANFILTERFULL = 939
+};
+
 /** Handles channel mode +g
  */
 class ChanFilter : public ListModeBase
 {
  public:
+       unsigned long maxlen;
+
        ChanFilter(Module* Creator) : ListModeBase(Creator, "filter", 'g', "End of channel spamfilter list", 941, 940, false, "chanfilter") { }
 
-       bool ValidateParam(User* user, Channel* chan, std::string& word) CXX11_OVERRIDE {
-               if (word.length() > 35)
+       bool ValidateParam(User* user, Channel* chan, std::string& word) CXX11_OVERRIDE
+       {
+               if (word.length() > maxlen)
                {
-                       user->WriteNumeric(935, chan->name, word, "%word is too long for censor list");
+                       user->WriteNumeric(Numerics::InvalidModeParameter(chan, this, word, "Word is too long for the spamfilter list"));
                        return false;
                }
 
@@ -46,17 +57,17 @@ class ChanFilter : public ListModeBase
 
        void TellListTooLong(User* user, Channel* chan, std::string& word) CXX11_OVERRIDE
        {
-               user->WriteNumeric(939, chan->name, word, "Channel spamfilter list is full");
+               user->WriteNumeric(ERR_CHANFILTERFULL, chan->name, word, "Channel spamfilter list is full");
        }
 
        void TellAlreadyOnList(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()));
+               user->WriteNumeric(ERR_ALREADYCHANFILTERED, chan->name, InspIRCd::Format("The word %s is already on the spamfilter list", word.c_str()));
        }
 
        void TellNotSet(User* user, Channel* chan, std::string& word) CXX11_OVERRIDE
        {
-               user->WriteNumeric(938, chan->name, "No such spamfilter word is set");
+               user->WriteNumeric(ERR_NOSUCHCHANFILTER, chan->name, "No such spamfilter word is set");
        }
 };
 
@@ -65,6 +76,7 @@ class ModuleChanFilter : public Module
        CheckExemption::EventProvider exemptionprov;
        ChanFilter cf;
        bool hidemask;
+       bool notifyuser;
 
  public:
 
@@ -76,7 +88,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, 100);
+               notifyuser = tag->getBool("notifyuser", true);
                cf.DoRehash();
        }
 
@@ -99,10 +114,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 +134,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);
        }
 };