]> git.netwichtig.de Git - user/henk/code/inspircd.git/blobdiff - src/modules/m_banredirect.cpp
Merge pull request #971 from SaberUK/master+numeric-xline
[user/henk/code/inspircd.git] / src / modules / m_banredirect.cpp
index 1a123e580082907f86a85e9295aca2a39c25f430..d3490acc062aab9eeb569ff4d4ebf9c4fd791916 100644 (file)
@@ -50,7 +50,7 @@ class BanRedirect : public ModeWatcher
        BanRedirect(Module* parent)
                : ModeWatcher(parent, "ban", MODETYPE_CHANNEL)
                , ban(parent, "ban")
-               , extItem("banredirect", parent)
+               , extItem("banredirect", ExtensionItem::EXT_CHANNEL, parent)
        {
        }
 
@@ -74,6 +74,9 @@ class BanRedirect : public ModeWatcher
                        if (param.length() >= 2 && param[1] == ':')
                                return true;
 
+                       if (param.find('#') == std::string::npos)
+                               return true;
+
                        ListModeBase* banlm = static_cast<ListModeBase*>(*ban);
                        unsigned int maxbans = banlm->GetLimit(channel);
                        ListModeBase::ModeList* list = banlm->GetList(channel);
@@ -123,6 +126,14 @@ class BanRedirect : public ModeWatcher
                                mask[NICK].swap(mask[IDENT]);
                        }
 
+                       if (!mask[NICK].empty() && mask[IDENT].empty() && mask[HOST].empty())
+                       {
+                               if (mask[NICK].find('.') != std::string::npos || mask[NICK].find(':') != std::string::npos)
+                               {
+                                       mask[NICK].swap(mask[HOST]);
+                               }
+                       }
+
                        for(int i = 0; i < 3; i++)
                        {
                                if(mask[i].empty())
@@ -238,26 +249,16 @@ class ModuleBanRedirect : public Module
 
                        if(redirects)
                        {
-                               irc::modestacker modestack(false);
+                               ModeHandler* ban = ServerInstance->Modes->FindMode('b', MODETYPE_CHANNEL);
+                               Modes::ChangeList changelist;
 
                                for(BanRedirectList::iterator i = redirects->begin(); i != redirects->end(); i++)
-                               {
-                                       modestack.Push('b', i->targetchan.insert(0, i->banmask));
-                               }
+                                       changelist.push_remove(ban, i->targetchan.insert(0, i->banmask));
 
                                for(BanRedirectList::iterator i = redirects->begin(); i != redirects->end(); i++)
-                               {
-                                       modestack.PushPlus();
-                                       modestack.Push('b', i->banmask);
-                               }
+                                       changelist.push_add(ban, i->banmask);
 
-                               std::vector<std::string> stackresult;
-                               stackresult.push_back(chan->name);
-                               while (modestack.GetStackedLine(stackresult))
-                               {
-                                       ServerInstance->Modes->Process(stackresult, ServerInstance->FakeClient, ModeParser::MODE_LOCALONLY);
-                                       stackresult.erase(stackresult.begin() + 1, stackresult.end());
-                               }
+                               ServerInstance->Modes->Process(ServerInstance->FakeClient, chan, NULL, changelist, ModeParser::MODE_LOCALONLY);
                        }
                }
        }