- if ((ts >= c->topicset) || (!*c->topic))
- {
- std::string oldtopic = c->topic;
- strlcpy(c->topic,params[3].c_str(),MAXTOPIC);
- strlcpy(c->setby,params[2].c_str(),127);
- c->topicset = ts;
- /* if the topic text is the same as the current topic,
- * dont bother to send the TOPIC command out, just silently
- * update the set time and set nick.
- */
- if (oldtopic != params[3])
- {
- User* user = this->Instance->FindNick(source);
- if (!user)
- {
- c->WriteChannelWithServ(Instance->Config->ServerName, "TOPIC %s :%s", c->name, c->topic);
- }
- else
- {
- c->WriteChannel(user, "TOPIC %s :%s", c->name, c->topic);
- nsource = user->server;
- }
- }
-
- /* all done, send it on its way */
- params[3] = ":" + params[3];
- Utils->DoOneToAllButSender(source,"FTOPIC",params,nsource);
- }
+ // Discard if their topic text is "smaller"
+ if (c->topic > newtopic)
+ return CMD_FAILURE;
+
+ // If the texts are equal in addition to the timestamps, decide which setter to keep
+ if ((c->topic == newtopic) && (c->setby >= setter))
+ return CMD_FAILURE;
+ }