1
0
mirror of https://github.com/osmarks/ngircd.git synced 2024-12-12 09:50:29 +00:00

Only send TOPIC updates to a channel when the topic actually changed

This prevents the channel from becoming flooded by unecessary TOPIC
update messages, that can happen when IRC services try to enforce a
certain topic but which is already set (at least on the local server),
for example. Therefore still forward it to all servers, but don't inform
local clients (still update setter and timestamp information, though!)
This commit is contained in:
Alexander Barton 2018-03-11 20:57:19 +01:00
parent 6a622c0084
commit ac341176da

View File

@ -1,6 +1,6 @@
/* /*
* ngIRCd -- The Next Generation IRC Daemon * ngIRCd -- The Next Generation IRC Daemon
* Copyright (c)2001-2015 Alexander Barton (alex@barton.de) and Contributors. * Copyright (c)2001-2018 Alexander Barton (alex@barton.de) and Contributors.
* *
* This program is free software; you can redistribute it and/or modify * This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by * it under the terms of the GNU General Public License as published by
@ -497,7 +497,7 @@ IRC_TOPIC( CLIENT *Client, REQUEST *Req )
topic_power = true; topic_power = true;
if (Req->argc == 1) { if (Req->argc == 1) {
/* Request actual topic */ /* Request current topic */
topic = Channel_Topic(chan); topic = Channel_Topic(chan);
if (*topic) { if (*topic) {
r = IRC_WriteStrClient(from, RPL_TOPIC_MSG, r = IRC_WriteStrClient(from, RPL_TOPIC_MSG,
@ -532,8 +532,6 @@ IRC_TOPIC( CLIENT *Client, REQUEST *Req )
Channel_Name(chan)); Channel_Name(chan));
} }
/* Set new topic */
Channel_SetTopic(chan, from, Req->argv[1]);
LogDebug("%s \"%s\" set topic on \"%s\": %s", LogDebug("%s \"%s\" set topic on \"%s\": %s",
Client_TypeText(from), Client_Mask(from), Channel_Name(chan), Client_TypeText(from), Client_Mask(from), Channel_Name(chan),
Req->argv[1][0] ? Req->argv[1] : "<none>"); Req->argv[1][0] ? Req->argv[1] : "<none>");
@ -545,9 +543,17 @@ IRC_TOPIC( CLIENT *Client, REQUEST *Req )
if (!Channel_IsLocal(chan)) if (!Channel_IsLocal(chan))
IRC_WriteStrServersPrefix(Client, from, "TOPIC %s :%s", IRC_WriteStrServersPrefix(Client, from, "TOPIC %s :%s",
Req->argv[0], Req->argv[1]); Req->argv[0], Req->argv[1]);
IRC_WriteStrChannelPrefix(Client, chan, from, false, "TOPIC %s :%s",
Req->argv[0], Req->argv[1]);
/* Infrom local clients, but only when the topic really changed. */
if (strcmp(Req->argv[1], Channel_Topic(chan)) != 0)
IRC_WriteStrChannelPrefix(Client, chan, from, false,
"TOPIC %s :%s", Req->argv[0],
Req->argv[1]);
/* Update topic, setter, and timestamp. */
Channel_SetTopic(chan, from, Req->argv[1]);
/* Send confirmation when the local client is a user. */
if (Client_Type(Client) == CLIENT_USER) if (Client_Type(Client) == CLIENT_USER)
return IRC_WriteStrClientPrefix(Client, Client, "TOPIC %s :%s", return IRC_WriteStrClientPrefix(Client, Client, "TOPIC %s :%s",
Req->argv[0], Req->argv[1]); Req->argv[0], Req->argv[1]);