/*
* 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
* and MODE commands.
*
* @param To Forward JOIN (and MODE) command to this peer server
- * @param Prefix Client used to prefix the genrated commands
+ * @param Prefix Client used to prefix the generated commands
* @param Data Parameters of JOIN command to forward, probably
* containing channel modes separated by ASCII 7.
*/
* This function calls cb_join_forward(), which differentiates between
* protocol implementations (e.g. RFC 2812, RFC 1459).
*
- * @param Client Client used to prefix the genrated commands
+ * @param Client Client used to prefix the generated commands
* @param target Forward JOIN (and MODE) command to this peer server
* @param chan Channel structure
* @param channame Channel name
/**
* Acknowledge user JOIN request and send "channel info" numerics.
*
- * @param Client Client used to prefix the genrated commands
+ * @param Client Client used to prefix the generated commands
* @param target Forward commands/numerics to this user
* @param chan Channel structure
* @param channame Channel name
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,
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] : "<none>");
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]);