]> git.netwichtig.de Git - user/henk/code/inspircd.git/blobdiff - src/modules/m_chanfilter.cpp
Use ERR_BANLISTFULL in the chanfilter and exemptchanops modules.
[user/henk/code/inspircd.git] / src / modules / m_chanfilter.cpp
index 133c5180dd10338730378e333d20b0e0438053fb..5591c7ef959788331465e2b3bf9d196c91f2d84f 100644 (file)
 #include "listmode.h"
 #include "modules/exemption.h"
 
+enum
+{
+       // InspIRCd-specific.
+       ERR_ALREADYCHANFILTERED = 937,
+       ERR_NOSUCHCHANFILTER = 938
+};
+
 /** 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;
                }
 
                return true;
        }
 
-       void TellListTooLong(User* user, Channel* chan, std::string& word) CXX11_OVERRIDE
-       {
-               user->WriteNumeric(939, 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 +70,7 @@ class ModuleChanFilter : public Module
        CheckExemption::EventProvider exemptionprov;
        ChanFilter cf;
        bool hidemask;
+       bool notifyuser;
 
  public:
 
@@ -76,16 +82,19 @@ 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();
        }
 
-       ModResult OnUserPreMessage(User* user, void* dest, int target_type, std::string& text, char status, CUList& exempt_list, MessageType msgtype) CXX11_OVERRIDE
+       ModResult OnUserPreMessage(User* user, const MessageTarget& target, MessageDetails& details) CXX11_OVERRIDE
        {
-               if (target_type != TYPE_CHANNEL)
+               if (target.type != MessageTarget::TYPE_CHANNEL)
                        return MOD_RES_PASSTHRU;
 
-               Channel* chan = static_cast<Channel*>(dest);
+               Channel* chan = target.Get<Channel>();
                ModResult res = CheckExemption::Call(exemptionprov, user, chan, "filter");
 
                if (!IS_LOCAL(user) || res == MOD_RES_ALLOW)
@@ -97,12 +106,18 @@ class ModuleChanFilter : public Module
                {
                        for (ListModeBase::ModeList::iterator i = list->begin(); i != list->end(); i++)
                        {
-                               if (InspIRCd::Match(text, i->mask))
+                               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 +128,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);
        }
 };