X-Git-Url: https://arthur.barton.de/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=src%2Fngircd%2Firc-channel.c;h=b9f0bdcdbba57cebd9ee828e9905bd929aba90a3;hb=56ed5c90ad02fb10cdbd7767a9dd85b2e06cdb19;hp=4eee5046763d95ad96e354224e87cb6af07885a4;hpb=259c314d142abd6f9295047c116235cfdd119563;p=ngircd-alex.git diff --git a/src/ngircd/irc-channel.c b/src/ngircd/irc-channel.c index 4eee5046..b9f0bdcd 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-2013 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 @@ -21,7 +21,6 @@ #include #include -#include "defines.h" #include "conn.h" #include "channel.h" #include "conn-func.h" @@ -177,7 +176,7 @@ join_set_channelmodes(CHANNEL *chan, CLIENT *target, const char *flags) * 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. */ @@ -210,7 +209,7 @@ cb_join_forward(CLIENT *To, CLIENT *Prefix, void *Data) * 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 @@ -251,7 +250,7 @@ join_forward(CLIENT *Client, CLIENT *target, CHANNEL *chan, /** * 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 @@ -449,7 +448,7 @@ IRC_PART(CLIENT * Client, REQUEST * Req) while (chan) { Channel_Part(target, Client, chan, - Req->argc > 1 ? Req->argv[1] : Client_ID(target)); + Req->argc > 1 ? Req->argv[1] : ""); chan = strtok(NULL, ","); } @@ -498,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, @@ -533,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] : ""); @@ -546,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]); @@ -598,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) @@ -609,9 +618,7 @@ IRC_LIST( CLIENT *Client, REQUEST *Req ) /* Gotcha! */ if (!Channel_HasMode(chan, 's') || Channel_IsMemberOf(chan, from) - || (!Conf_MorePrivacy - && Client_HasMode(Client, 'o') - && Client_Conn(Client) > NONE)) + || Client_HasMode(from, 'o')) { if ((Conf_MaxListSize > 0) && IRC_CheckListTooBig(from, count,