]> git.netwichtig.de Git - user/henk/code/inspircd.git/blobdiff - src/modules/m_spanningtree/compat.cpp
m_spanningtree Rewrite PING logic to use Timers
[user/henk/code/inspircd.git] / src / modules / m_spanningtree / compat.cpp
index 83ad77414371a0d476d059209c8f4f11544a4cd4..c2ee940fccb6e2e18fb73d5ba08defa4632cfa5e 100644 (file)
@@ -46,7 +46,7 @@ void TreeSocket::WriteLine(const std::string& original_line)
                        std::string line = original_line;
                        std::string::size_type a = line.find(' ');
                        std::string::size_type b = line.find(' ', a + 1);
-                       std::string command = line.substr(a + 1, b-a-1);
+                       std::string command(line, a + 1, b-a-1);
                        // now try to find a translation entry
                        // TODO a more efficient lookup method will be needed later
                        if (proto_version < 1205)
@@ -68,7 +68,7 @@ void TreeSocket::WriteLine(const std::string& original_line)
                                        {
                                                // No TS or modes in the command
                                                // :22DAAAAAB IJOIN #chan
-                                               const std::string channame = line.substr(b+1, c-b-1);
+                                               const std::string channame(line, b+1, c-b-1);
                                                Channel* chan = ServerInstance->FindChan(channame);
                                                if (!chan)
                                                        return;
@@ -280,6 +280,15 @@ void TreeSocket::WriteLine(const std::string& original_line)
 
                                        line.erase(d, spcolon-d);
                                        line.insert(c, " * 0");
+
+                                       if (burstsent)
+                                       {
+                                               WriteLineNoCompat(line);
+
+                                               // Synthesize a :<newserver> BURST <time> message
+                                               spcolon = line.find(" :");
+                                               line = CmdBuilder(line.substr(spcolon-3, 3), "BURST").push_int(ServerInstance->Time()).str();
+                                       }
                                }
                        }
                        WriteLineNoCompat(line);
@@ -460,6 +469,16 @@ bool TreeSocket::PreProcessOldProtocolMessage(User*& who, std::string& cmd, std:
 
                params[1].swap(params[3]);
                params.erase(params.begin()+2, params.begin()+4);
+
+               // If the source of this SERVER message is not bursting, then new servers it introduces are bursting
+               TreeServer* server = TreeServer::Get(who);
+               if (!server->IsBursting())
+                       params.insert(params.begin()+2, "burst=" + ConvToStr(ServerInstance->Time()*1000));
+       }
+       else if (cmd == "BURST")
+       {
+               // A server is introducing another one, drop unnecessary BURST
+               return false;
        }
 
        return true; // Passthru