]> arthur.barton.de Git - ngircd-alex.git/blobdiff - src/ngircd/channel.c
{Add|Del}_Ban_Invite > {Add_To|Del_From}_List(): more generic
[ngircd-alex.git] / src / ngircd / channel.c
index c8c15d96c3a6033d401a3e61be5caf69e5c3b2aa..781d91a5a69ef13f12ec24b3210d46a955620ffb 100644 (file)
@@ -7,16 +7,17 @@
  * the Free Software Foundation; either version 2 of the License, or
  * (at your option) any later version.
  * Please read the file COPYING, README and AUTHORS for more information.
- *
- * Channel management
  */
 
-
 #define __channel_c__
 
-
 #include "portab.h"
 
+/**
+ * @file
+ * Channel management
+ */
+
 #include "imp.h"
 #include <assert.h>
 #include <stdlib.h>
@@ -109,9 +110,12 @@ Channel_InitPredefined( void )
        assert(channel_count == 0 || conf_chan != NULL);
 
        for (i = 0; i < channel_count; i++, conf_chan++) {
-               if (!conf_chan->name[0] || !Channel_IsValidName(conf_chan->name)) {
-                       Log(LOG_ERR, "Can't create pre-defined channel: invalid name: \"%s\"",
-                                                                       conf_chan->name);
+               if (!conf_chan->name[0])
+                       continue;
+               if (!Channel_IsValidName(conf_chan->name)) {
+                       Log(LOG_ERR,
+                           "Can't create pre-defined channel: invalid name: \"%s\"",
+                           conf_chan->name);
                        continue;
                }
 
@@ -262,6 +266,9 @@ Channel_Part(CLIENT * Client, CLIENT * Origin, const char *Name, const char *Rea
                return false;
        }
 
+       if (Conf_MorePrivacy)
+               Reason = "";
+
        /* Part client from channel */
        if (!Remove_Client(REMOVE_PART, chan, Client, Origin, Reason, true))
                return false;
@@ -330,6 +337,9 @@ Channel_Quit( CLIENT *Client, const char *Reason )
        assert( Client != NULL );
        assert( Reason != NULL );
 
+       if (Conf_MorePrivacy)
+               Reason = "";
+
        IRC_WriteStrRelatedPrefix( Client, Client, false, "QUIT :%s", Reason );
 
        c = My_Channels;
@@ -342,20 +352,31 @@ Channel_Quit( CLIENT *Client, const char *Reason )
 } /* Channel_Quit */
 
 
+/**
+ * Get number of channels this server knows and that are "visible" to
+ * the given client. If no client is given, all channels will be counted.
+ *
+ * @param Client The client to check or NULL.
+ * @return Number of channels visible to the client.
+ */
 GLOBAL unsigned long
-Channel_Count( void )
+Channel_CountVisible (CLIENT *Client)
 {
        CHANNEL *c;
        unsigned long count = 0;
 
        c = My_Channels;
-       while( c )
-       {
-               count++;
+       while(c) {
+               if (Client) {
+                       if (!strchr(Channel_Modes(c), 's')
+                           || Channel_IsMemberOf(c, Client))
+                               count++;
+               } else
+                       count++;
                c = c->next;
        }
        return count;
-} /* Channel_Count */
+}
 
 
 GLOBAL unsigned long
@@ -960,6 +981,9 @@ Remove_Client( int Type, CHANNEL *Chan, CLIENT *Client, CLIENT *Origin, const ch
                                Client_Mask( Client ), c->name, Client_ID(Origin), Reason);
                        break;
                default: /* PART */
+                       if (Conf_MorePrivacy)
+                               Reason = "";
+
                        if (InformServer)
                                IRC_WriteStrServersPrefix(Origin, Client, "PART %s :%s", c->name, Reason);
 
@@ -990,7 +1014,7 @@ Channel_AddBan(CHANNEL *c, const char *mask )
 {
        struct list_head *h = Channel_GetListBans(c);
        LogDebug("Adding \"%s\" to \"%s\" %s list", mask, Channel_Name(c), "ban");
-       return Lists_Add(h, mask, false);
+       return Lists_Add(h, mask, false, NULL);
 }
 
 
@@ -999,29 +1023,30 @@ Channel_AddInvite(CHANNEL *c, const char *mask, bool onlyonce)
 {
        struct list_head *h = Channel_GetListInvites(c);
        LogDebug("Adding \"%s\" to \"%s\" %s list", mask, Channel_Name(c), "invite");
-       return Lists_Add(h, mask, onlyonce);
+       return Lists_Add(h, mask, onlyonce, NULL);
 }
 
 
 static bool
-ShowInvitesBans(struct list_head *head, CLIENT *Client, CHANNEL *Channel, bool invite)
+ShowChannelList(struct list_head *head, CLIENT *Client, CHANNEL *Channel,
+               char *msg, char *msg_end)
 {
        struct list_elem *e;
-       char *msg = invite ? RPL_INVITELIST_MSG : RPL_BANLIST_MSG;
-       char *msg_end;
 
-       assert( Client != NULL );
-       assert( Channel != NULL );
+       assert (Client != NULL);
+       assert (Channel != NULL);
 
        e = Lists_GetFirst(head);
        while (e) {
-               if( ! IRC_WriteStrClient( Client, msg, Client_ID( Client ),
-                               Channel_Name( Channel ), Lists_GetMask(e) )) return DISCONNECTED;
+               if (!IRC_WriteStrClient(Client, msg, Client_ID(Client),
+                                       Channel_Name(Channel),
+                                       Lists_GetMask(e)))
+                       return DISCONNECTED;
                e = Lists_GetNext(e);
        }
 
-       msg_end = invite ? RPL_ENDOFINVITELIST_MSG : RPL_ENDOFBANLIST_MSG;
-       return IRC_WriteStrClient( Client, msg_end, Client_ID( Client ), Channel_Name( Channel ));
+       return IRC_WriteStrClient(Client, msg_end, Client_ID(Client),
+                                 Channel_Name(Channel));
 }
 
 
@@ -1033,7 +1058,8 @@ Channel_ShowBans( CLIENT *Client, CHANNEL *Channel )
        assert( Channel != NULL );
 
        h = Channel_GetListBans(Channel);
-       return ShowInvitesBans(h, Client, Channel, false);
+       return ShowChannelList(h, Client, Channel, RPL_BANLIST_MSG,
+                              RPL_ENDOFBANLIST_MSG);
 }
 
 
@@ -1045,7 +1071,8 @@ Channel_ShowInvites( CLIENT *Client, CHANNEL *Channel )
        assert( Channel != NULL );
 
        h = Channel_GetListInvites(Channel);
-       return ShowInvitesBans(h, Client, Channel, true);
+       return ShowChannelList(h, Client, Channel, RPL_INVITELIST_MSG,
+                              RPL_ENDOFINVITELIST_MSG);
 }
 
 
@@ -1081,10 +1108,10 @@ Channel_CheckKey(CHANNEL *Chan, CLIENT *Client, const char *Key)
 
        if (!strchr(Chan->modes, 'k'))
                return true;
-       if (strcmp(Chan->key, Key) == 0)
-               return true;
        if (*Key == '\0')
                return false;
+       if (strcmp(Chan->key, Key) == 0)
+               return true;
 
        file_name = array_start(&Chan->keyfile);
        if (!file_name)