summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/modules/m_spanningtree/commands.h2
-rw-r--r--src/modules/m_spanningtree/compat.cpp23
-rw-r--r--src/modules/m_spanningtree/ftopic.cpp18
-rw-r--r--src/modules/m_spanningtree/netburst.cpp2
-rw-r--r--src/modules/m_spanningtree/protocolinterface.cpp1
5 files changed, 39 insertions, 7 deletions
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<std::string>& parameters, User *user);
RouteDescriptor GetRouting(User* user, const std::vector<std::string>& 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<std::string>& 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<std::string>& 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);