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);
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;
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"))
{
}
}
}
+ 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);
}
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
}