From 75fa56618e2f10782dc66262f964f6146d10bbc3 Mon Sep 17 00:00:00 2001 From: attilamolnar Date: Fri, 12 Apr 2013 17:16:00 +0200 Subject: m_spanningtree Add channel timestamp to FTOPIC --- src/modules/m_spanningtree/commands.h | 2 +- src/modules/m_spanningtree/compat.cpp | 23 +++++++++++++++++++++++ src/modules/m_spanningtree/ftopic.cpp | 18 +++++++++++++----- src/modules/m_spanningtree/netburst.cpp | 2 +- src/modules/m_spanningtree/protocolinterface.cpp | 1 + 5 files changed, 39 insertions(+), 7 deletions(-) (limited to 'src/modules/m_spanningtree') diff --git a/src/modules/m_spanningtree/commands.h b/src/modules/m_spanningtree/commands.h index 7e171aa99..dd54b5b6b 100644 --- a/src/modules/m_spanningtree/commands.h +++ b/src/modules/m_spanningtree/commands.h @@ -107,7 +107,7 @@ class CommandFMode : public Command class CommandFTopic : public Command { public: - CommandFTopic(Module* Creator) : Command(Creator, "FTOPIC", 4) { flags_needed = FLAG_SERVERONLY; } + CommandFTopic(Module* Creator) : Command(Creator, "FTOPIC", 5) { flags_needed = FLAG_SERVERONLY; } CmdResult Handle (const std::vector& parameters, User *user); RouteDescriptor GetRouting(User* user, const std::vector& parameters) { return ROUTE_BROADCAST; } }; diff --git a/src/modules/m_spanningtree/compat.cpp b/src/modules/m_spanningtree/compat.cpp index c14115bed..30b7ba8bb 100644 --- a/src/modules/m_spanningtree/compat.cpp +++ b/src/modules/m_spanningtree/compat.cpp @@ -112,6 +112,24 @@ void TreeSocket::WriteLine(std::string line) line.erase(c, d-c); } } + else if (command == "FTOPIC") + { + // Drop channel TS for FTOPIC + // :sid FTOPIC #target TS TopicTS ... + // A B C D + if (b == std::string::npos) + return; + + std::string::size_type c = line.find(' ', b + 1); + if (c == std::string::npos) + return; + + std::string::size_type d = line.find(' ', c + 1); + if (d == std::string::npos) + return; + + line.erase(c, d-c); + } } } } @@ -142,6 +160,11 @@ bool TreeSocket::PreProcessOldProtocolMessage(User*& who, std::string& cmd, std: // :20D METADATA #channel extname :extdata return InsertCurrentChannelTS(params); } + else if ((cmd == "FTOPIC") && (params.size() >= 4)) + { + // :20D FTOPIC #channel 100 Attila :topic text + return InsertCurrentChannelTS(params); + } return true; // Passthru } diff --git a/src/modules/m_spanningtree/ftopic.cpp b/src/modules/m_spanningtree/ftopic.cpp index 918bb7f2c..69d3af565 100644 --- a/src/modules/m_spanningtree/ftopic.cpp +++ b/src/modules/m_spanningtree/ftopic.cpp @@ -28,7 +28,15 @@ CmdResult CommandFTopic::Handle(const std::vector& params, User *us if (!c) return CMD_FAILURE; - time_t ts = ConvToInt(params[1]); + time_t ChanTS = ConvToInt(params[1]); + if (!ChanTS) + return CMD_INVALID; + + if (c->age < ChanTS) + // Our channel TS is older, nothing to do + return CMD_FAILURE; + + time_t ts = ConvToInt(params[2]); if (!ts) return CMD_INVALID; @@ -42,18 +50,18 @@ CmdResult CommandFTopic::Handle(const std::vector& params, User *us * string comparision, so non-empty topics always overridde * empty topics if their timestamps are equal */ - if ((ts == c->topicset) && (c->topic > params[3])) + if ((ts == c->topicset) && (c->topic > params[4])) return CMD_FAILURE; // Topics were set at the exact same time, keep our topic and setter - if (c->topic != params[3]) + if (c->topic != params[4]) { // Update topic only when it differs from current topic - c->topic.assign(params[3], 0, ServerInstance->Config->Limits.MaxTopic); + c->topic.assign(params[4], 0, ServerInstance->Config->Limits.MaxTopic); c->WriteChannel(user, "TOPIC %s :%s", c->name.c_str(), c->topic.c_str()); } // Update setter and settime - c->setby.assign(params[2], 0, 127); + c->setby.assign(params[3], 0, 127); c->topicset = ts; return CMD_SUCCESS; diff --git a/src/modules/m_spanningtree/netburst.cpp b/src/modules/m_spanningtree/netburst.cpp index 566224c7a..a77623bfc 100644 --- a/src/modules/m_spanningtree/netburst.cpp +++ b/src/modules/m_spanningtree/netburst.cpp @@ -161,7 +161,7 @@ void TreeSocket::SyncChannel(Channel* chan) SendFJoins(chan); if (!chan->topic.empty()) { - snprintf(data,MAXBUF,":%s FTOPIC %s %lu %s :%s", ServerInstance->Config->GetSID().c_str(), chan->name.c_str(), (unsigned long)chan->topicset, chan->setby.c_str(), chan->topic.c_str()); + snprintf(data,MAXBUF,":%s FTOPIC %s %lu %lu %s :%s", ServerInstance->Config->GetSID().c_str(), chan->name.c_str(), (unsigned long) chan->age, (unsigned long)chan->topicset, chan->setby.c_str(), chan->topic.c_str()); this->WriteLine(data); } diff --git a/src/modules/m_spanningtree/protocolinterface.cpp b/src/modules/m_spanningtree/protocolinterface.cpp index d727f588c..93a138758 100644 --- a/src/modules/m_spanningtree/protocolinterface.cpp +++ b/src/modules/m_spanningtree/protocolinterface.cpp @@ -81,6 +81,7 @@ void SpanningTreeProtocolInterface::SendTopic(Channel* channel, std::string &top parameterlist params; params.push_back(channel->name); + params.push_back(ConvToStr(channel->age)); params.push_back(ConvToStr(ServerInstance->Time())); params.push_back(ServerInstance->Config->ServerName); params.push_back(":" + topic); -- cgit v1.2.3