]> git.netwichtig.de Git - user/henk/code/inspircd.git/blobdiff - src/modules/m_messageflood.cpp
Convert WriteNumeric() calls to pass the parameters of the numeric as method parameters
[user/henk/code/inspircd.git] / src / modules / m_messageflood.cpp
index ffac281377a70b848093c14da19c6a558ff27682..c5c872169ea1a2b360ff24d60a240e756a790b05 100644 (file)
@@ -34,7 +34,7 @@ class floodsettings
        unsigned int secs;
        unsigned int lines;
        time_t reset;
-       std::map<User*, unsigned int> counters;
+       insp::flat_map<User*, unsigned int> counters;
 
        floodsettings(bool a, int b, int c) : ban(a), secs(b), lines(c)
        {
@@ -54,62 +54,50 @@ class floodsettings
 
        void clear(User* who)
        {
-               std::map<User*, unsigned int>::iterator iter = counters.find(who);
-               if (iter != counters.end())
-               {
-                       counters.erase(iter);
-               }
+               counters.erase(who);
        }
 };
 
 /** Handles channel mode +f
  */
-class MsgFlood : public ModeHandler
+class MsgFlood : public ParamMode<MsgFlood, SimpleExtItem<floodsettings> >
 {
  public:
-       SimpleExtItem<floodsettings> ext;
-       MsgFlood(Module* Creator) : ModeHandler(Creator, "flood", 'f', PARAM_SETONLY, MODETYPE_CHANNEL),
-               ext("messageflood", Creator) { }
+       MsgFlood(Module* Creator)
+               : ParamMode<MsgFlood, SimpleExtItem<floodsettings> >(Creator, "flood", 'f')
+       {
+       }
 
-       ModeAction OnModeChange(User* source, User* dest, Channel* channel, std::string &parameter, bool adding)
+       ModeAction OnSet(User* source, Channel* channel, std::string& parameter)
        {
-               if (adding)
+               std::string::size_type colon = parameter.find(':');
+               if ((colon == std::string::npos) || (parameter.find('-') != std::string::npos))
                {
-                       std::string::size_type colon = parameter.find(':');
-                       if ((colon == std::string::npos) || (parameter.find('-') != std::string::npos))
-                       {
-                               source->WriteNumeric(608, "%s %s :Invalid flood parameter",source->nick.c_str(),channel->name.c_str());
-                               return MODEACTION_DENY;
-                       }
-
-                       /* Set up the flood parameters for this channel */
-                       bool ban = (parameter[0] == '*');
-                       unsigned int nlines = ConvToInt(parameter.substr(ban ? 1 : 0, ban ? colon-1 : colon));
-                       unsigned int nsecs = ConvToInt(parameter.substr(colon+1));
-
-                       if ((nlines<2) || (nsecs<1))
-                       {
-                               source->WriteNumeric(608, "%s %s :Invalid flood parameter",source->nick.c_str(),channel->name.c_str());
-                               return MODEACTION_DENY;
-                       }
+                       source->WriteNumeric(608, channel->name, "Invalid flood parameter");
+                       return MODEACTION_DENY;
+               }
 
-                       floodsettings* f = ext.get(channel);
-                       if ((f) && (nlines == f->lines) && (nsecs == f->secs) && (ban == f->ban))
-                               // mode params match
-                               return MODEACTION_DENY;
+               /* Set up the flood parameters for this channel */
+               bool ban = (parameter[0] == '*');
+               unsigned int nlines = ConvToInt(parameter.substr(ban ? 1 : 0, ban ? colon-1 : colon));
+               unsigned int nsecs = ConvToInt(parameter.substr(colon+1));
 
-                       ext.set(channel, new floodsettings(ban, nsecs, nlines));
-                       parameter = std::string(ban ? "*" : "") + ConvToStr(nlines) + ":" + ConvToStr(nsecs);
-                       return MODEACTION_ALLOW;
-               }
-               else
+               if ((nlines<2) || (nsecs<1))
                {
-                       if (!channel->IsModeSet(this))
-                               return MODEACTION_DENY;
-
-                       ext.unset(channel);
-                       return MODEACTION_ALLOW;
+                       source->WriteNumeric(608, channel->name, "Invalid flood parameter");
+                       return MODEACTION_DENY;
                }
+
+               ext.set(channel, new floodsettings(ban, nsecs, nlines));
+               return MODEACTION_ALLOW;
+       }
+
+       void SerializeParam(Channel* chan, const floodsettings* fs, std::string& out)
+       {
+               if (fs->ban)
+                       out.push_back('*');
+               out.append(ConvToStr(fs->lines)).push_back(':');
+               out.append(ConvToStr(fs->secs));
        }
 };
 
@@ -124,8 +112,12 @@ class ModuleMsgFlood : public Module
        {
        }
 
-       ModResult ProcessMessages(User* user,Channel* dest, const std::string &text)
+       ModResult OnUserPreMessage(User* user, void* voiddest, int target_type, std::string& text, char status, CUList& exempt_list, MessageType msgtype) CXX11_OVERRIDE
        {
+               if (target_type != TYPE_CHANNEL)
+                       return MOD_RES_PASSTHRU;
+
+               Channel* dest = static_cast<Channel*>(voiddest);
                if ((!IS_LOCAL(user)) || !dest->IsModeSet(mf))
                        return MOD_RES_PASSTHRU;
 
@@ -141,11 +133,9 @@ class ModuleMsgFlood : public Module
                                f->clear(user);
                                if (f->ban)
                                {
-                                       std::vector<std::string> parameters;
-                                       parameters.push_back(dest->name);
-                                       parameters.push_back("+b");
-                                       parameters.push_back("*!*@" + user->dhost);
-                                       ServerInstance->Modes->Process(parameters, ServerInstance->FakeClient);
+                                       Modes::ChangeList changelist;
+                                       changelist.push_add(ServerInstance->Modes->FindMode('b', MODETYPE_CHANNEL), "*!*@" + user->dhost);
+                                       ServerInstance->Modes->Process(ServerInstance->FakeClient, dest, NULL, changelist);
                                }
 
                                const std::string kickMessage = "Channel flood triggered (limit is " + ConvToStr(f->lines) +
@@ -160,14 +150,6 @@ class ModuleMsgFlood : public Module
                return MOD_RES_PASSTHRU;
        }
 
-       ModResult OnUserPreMessage(User* user, void* dest, int target_type, std::string& text, char status, CUList& exempt_list, MessageType msgtype) CXX11_OVERRIDE
-       {
-               if (target_type == TYPE_CHANNEL)
-                       return ProcessMessages(user,(Channel*)dest,text);
-
-               return MOD_RES_PASSTHRU;
-       }
-
        void Prioritize()
        {
                // we want to be after all modules that might deny the message (e.g. m_muteban, m_noctcp, m_blockcolor, etc.)