]> arthur.barton.de Git - ngircd-alex.git/blobdiff - src/ngircd/irc-channel.c
Constify some of Channel_Kick()s arguments.
[ngircd-alex.git] / src / ngircd / irc-channel.c
index 55770571f61b68b13d39d60bc89abad0100b1642..e95999275aaab341c5a40252754d7343efa99df7 100644 (file)
@@ -70,6 +70,10 @@ join_allowed(CLIENT *Client, CLIENT *target, CHANNEL *chan,
        bool is_invited, is_banned;
        const char *channel_modes;
 
+       /* Allow IRC operators to overwrite channel limits */
+       if (strchr(Client_Modes(Client), 'o'))
+               return true;
+
        is_banned = Lists_Check(Channel_GetListBans(chan), target);
        is_invited = Lists_Check(Channel_GetListInvites(chan), target);
 
@@ -239,9 +243,14 @@ IRC_JOIN( CLIENT *Client, REQUEST *Req )
                        if ((Conf_MaxJoins > 0) && (Channel_CountForUser(Client) >= Conf_MaxJoins))
                                return IRC_WriteStrClient(Client, ERR_TOOMANYCHANNELS_MSG,
                                                        Client_ID(Client), channame);
-                       if (!chan) /* New Channel: first user will be channel operator */
-                               flags = "o";
-                       else
+                       if (!chan) {
+                               /*
+                                * New Channel: first user will be channel operator
+                                * unless this is a modeless channel.
+                                */
+                               if (*channame != '+')
+                                       flags = "o";
+                       } else
                                if (!join_allowed(Client, target, chan, channame, key))
                                        break;
                } else {
@@ -257,8 +266,14 @@ IRC_JOIN( CLIENT *Client, REQUEST *Req )
                if (!Channel_Join(target, channame))
                        break;
 
-               if (!chan) /* channel is new; it has been created above */
+               if (!chan) /* channel is new; it has been created above */
                        chan = Channel_Search(channame);
+                       assert(chan != NULL);
+                       if (*channame == '+') { /* modeless channel... */
+                               Channel_ModeAdd(chan, 't'); /* /TOPIC not allowed */
+                               Channel_ModeAdd(chan, 'n'); /* no external msgs */
+                       }
+               }
                assert(chan != NULL);
 
                join_set_channelmodes(chan, target, flags);
@@ -286,29 +301,36 @@ IRC_JOIN( CLIENT *Client, REQUEST *Req )
 } /* IRC_JOIN */
 
 
+/**
+ * Handler for the IRC "PART" command.
+ */
 GLOBAL bool
-IRC_PART( CLIENT *Client, REQUEST *Req )
+IRC_PART(CLIENT * Client, REQUEST * Req)
 {
        CLIENT *target;
        char *chan;
 
-       assert( Client != NULL );
-       assert( Req != NULL );
+       assert(Client != NULL);
+       assert(Req != NULL);
 
        if (Req->argc < 1 || Req->argc > 2)
                return IRC_WriteStrClient(Client, ERR_NEEDMOREPARAMS_MSG,
-                                       Client_ID(Client), Req->command);
+                                         Client_ID(Client), Req->command);
 
-       /* Wer ist der Absender? */
-       if( Client_Type( Client ) == CLIENT_SERVER ) target = Client_Search( Req->prefix );
-       else target = Client;
-       if( ! target ) return IRC_WriteStrClient( Client, ERR_NOSUCHNICK_MSG, Client_ID( Client ), Req->prefix );
+       /* Get the sender */
+       if (Client_Type(Client) == CLIENT_SERVER)
+               target = Client_Search(Req->prefix);
+       else
+               target = Client;
+       if (!target)
+               return IRC_WriteStrClient(Client, ERR_NOSUCHNICK_MSG,
+                                         Client_ID(Client), Req->prefix);
 
-       /* Channel-Namen durchgehen */
+       /* Loop over all the given channel names */
        chan = strtok(Req->argv[0], ",");
        while (chan) {
-               Channel_Part(target, Client, chan, Req->argc > 1 ? Req->argv[1] : Client_ID(target));
-
+               Channel_Part(target, Client, chan,
+                            Req->argc > 1 ? Req->argv[1] : Client_ID(target));
                chan = strtok(NULL, ",");
        }
        return CONNECTED;
@@ -326,8 +348,8 @@ IRC_TOPIC( CLIENT *Client, REQUEST *Req )
        assert( Client != NULL );
        assert( Req != NULL );
 
-       /* Falsche Anzahl Parameter? */
-       if(( Req->argc < 1 ) || ( Req->argc > 2 )) return IRC_WriteStrClient( Client, ERR_NEEDMOREPARAMS_MSG, Client_ID( Client ), Req->command );
+       if ((Req->argc < 1) || (Req->argc > 2))
+               return IRC_WriteStrClient(Client, ERR_NEEDMOREPARAMS_MSG, Client_ID(Client), Req->command);
 
        if( Client_Type( Client ) == CLIENT_SERVER ) from = Client_Search( Req->prefix );
        else from = Client;