]> git.netwichtig.de Git - user/henk/code/inspircd.git/blobdiff - src/modules/m_spanningtree/compat.cpp
Split ProtocolInterface::SendMetaData() into multiple functions
[user/henk/code/inspircd.git] / src / modules / m_spanningtree / compat.cpp
index 0fc837beb939cec4c8794ed71ad1d508a79bea77..f3d6ac66ae2a5a683000f7eaee54fb59c10f1f51 100644 (file)
 
 static std::string newline("\n");
 
-void TreeSocket::WriteLine(std::string line)
+void TreeSocket::WriteLine(const std::string& original_line)
 {
        if (LinkState == CONNECTED)
        {
-               if (line[0] != ':')
+               if (original_line.c_str()[0] != ':')
                {
                        ServerInstance->Logs->Log(MODNAME, LOG_DEFAULT, "Sending line without server prefix!");
-                       line = ":" + ServerInstance->Config->GetSID() + " " + line;
+                       WriteLine(":" + ServerInstance->Config->GetSID() + " " + original_line);
+                       return;
                }
                if (proto_version != ProtocolVersion)
                {
+                       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);
@@ -121,8 +123,10 @@ void TreeSocket::WriteLine(std::string line)
                                else if (command == "FTOPIC")
                                {
                                        // Drop channel TS for FTOPIC
-                                       // :sid FTOPIC #target TS TopicTS ...
-                                       //     A      B       C  D
+                                       // :sid FTOPIC #target TS TopicTS setter :newtopic
+                                       //     A      B       C  D       E      F
+                                       // :uid FTOPIC #target TS TopicTS :newtopic
+                                       //     A      B       C  D       E
                                        if (b == std::string::npos)
                                                return;
 
@@ -134,7 +138,14 @@ void TreeSocket::WriteLine(std::string line)
                                        if (d == std::string::npos)
                                                return;
 
-                                       line.erase(c, d-c);
+                                       std::string::size_type e = line.find(' ', d + 1);
+                                       if (line[e+1] == ':')
+                                       {
+                                               line.erase(c, e-c);
+                                               line.erase(a+1, 1);
+                                       }
+                                       else
+                                               line.erase(c, d-c);
                                }
                                else if ((command == "PING") || (command == "PONG"))
                                {
@@ -159,11 +170,15 @@ void TreeSocket::WriteLine(std::string line)
                                        }
                                }
                        }
+                       ServerInstance->Logs->Log(MODNAME, LOG_RAWIO, "S[%d] O %s", this->GetFd(), line.c_str());
+                       this->WriteData(line);
+                       this->WriteData(newline);
+                       return;
                }
        }
 
-       ServerInstance->Logs->Log(MODNAME, LOG_RAWIO, "S[%d] O %s", this->GetFd(), line.c_str());
-       this->WriteData(line);
+       ServerInstance->Logs->Log(MODNAME, LOG_RAWIO, "S[%d] O %s", this->GetFd(), original_line.c_str());
+       this->WriteData(original_line);
        this->WriteData(newline);
 }
 
@@ -262,6 +277,22 @@ bool TreeSocket::PreProcessOldProtocolMessage(User*& who, std::string& cmd, std:
                params.insert(params.begin()+1, "operquit");
                who = MyRoot->ServerUser;
        }
+       else if ((cmd == "TOPIC") && (params.size() >= 2))
+       {
+               // :20DAAAAAC TOPIC #chan :new topic
+               cmd = "FTOPIC";
+               if (!InsertCurrentChannelTS(params))
+                       return false;
+
+               params.insert(params.begin()+2, ConvToStr(ServerInstance->Time()));
+       }
+       else if (cmd == "MODENOTICE")
+       {
+               // MODENOTICE is always supported by 2.0 but it's optional in 2.2.
+               params.insert(params.begin(), "*");
+               params.insert(params.begin()+1, cmd);
+               cmd = "ENCAP";
+       }
 
        return true; // Passthru
 }