X-Git-Url: https://arthur.barton.de/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=src%2Fngircd%2Firc-channel.c;h=812429bbf33eadc2a0dbd5174522bb673572f121;hb=e954b59d414fb32b89291514d0d690c9ebabba49;hp=c7a3e1b31e7f8b81e79f8d8854446965fb0f3351;hpb=f8f7f83f5a2228bb9deeb8324be015cd76b84ced;p=ngircd-alex.git diff --git a/src/ngircd/irc-channel.c b/src/ngircd/irc-channel.c index c7a3e1b3..812429bb 100644 --- a/src/ngircd/irc-channel.c +++ b/src/ngircd/irc-channel.c @@ -1,6 +1,6 @@ /* * 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 * 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; if (Req->argc == 1) { - /* Request actual topic */ + /* Request current topic */ topic = Channel_Topic(chan); if (*topic) { r = IRC_WriteStrClient(from, RPL_TOPIC_MSG, @@ -532,8 +532,6 @@ IRC_TOPIC( CLIENT *Client, REQUEST *Req ) Channel_Name(chan)); } - /* Set new topic */ - Channel_SetTopic(chan, from, Req->argv[1]); LogDebug("%s \"%s\" set topic on \"%s\": %s", Client_TypeText(from), Client_Mask(from), Channel_Name(chan), Req->argv[1][0] ? Req->argv[1] : ""); @@ -545,9 +543,17 @@ IRC_TOPIC( CLIENT *Client, REQUEST *Req ) if (!Channel_IsLocal(chan)) IRC_WriteStrServersPrefix(Client, from, "TOPIC %s :%s", 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) return IRC_WriteStrClientPrefix(Client, Client, "TOPIC %s :%s", Req->argv[0], Req->argv[1]); @@ -597,6 +603,10 @@ IRC_LIST( CLIENT *Client, REQUEST *Req ) } } + /* Send list head */ + if (!IRC_WriteStrClient(from, RPL_LISTSTART_MSG, Client_ID(from))) + return DISCONNECTED; + while (pattern) { /* Loop through all the channels */ if (Req->argc > 0)