]> arthur.barton.de Git - ngircd-alex.git/blobdiff - src/ngircd/irc-channel.c
- an Clients wurden Modes mit fuehrendem ":" geliefert. Das ist zwar RFC-
[ngircd-alex.git] / src / ngircd / irc-channel.c
index 8d6dce0975a2f52c4beab987e6e71524e65c211e..7ee157d9ed8322915d9d377e8928f17356a5829f 100644 (file)
@@ -9,7 +9,7 @@
  * Naehere Informationen entnehmen Sie bitter der Datei COPYING. Eine Liste
  * der an ngIRCd beteiligten Autoren finden Sie in der Datei AUTHORS.
  *
- * $Id: irc-channel.c,v 1.6 2002/05/27 13:09:26 alex Exp $
+ * $Id: irc-channel.c,v 1.12 2002/08/27 13:57:03 alex Exp $
  *
  * irc-channel.c: IRC-Channel-Befehle
  */
@@ -27,6 +27,7 @@
 #include "channel.h"
 #include "lists.h"
 #include "log.h"
+#include "match.h"
 #include "messages.h"
 #include "parse.h"
 #include "irc.h"
@@ -62,9 +63,9 @@ IRC_JOIN( CLIENT *Client, REQUEST *Req )
        channame = strtok( Req->argv[0], "," );
        while( channame )
        {
-               /* wird der Channel neu angelegt? */
-               flags = NULL;
+               chan = flags = NULL;
 
+               /* wird der Channel neu angelegt? */
                if( Channel_Search( channame )) is_new_chan = FALSE;
                else is_new_chan = TRUE;
 
@@ -73,7 +74,11 @@ IRC_JOIN( CLIENT *Client, REQUEST *Req )
                {
                        /* Channel-Flags extrahieren */
                        flags = strchr( channame, 0x7 );
-                       if( flags ) *flags++ = '\0';
+                       if( flags )
+                       {
+                               *flags = '\0';
+                               flags++;
+                       }
                }
 
                /* Lokaler Client? */
@@ -95,6 +100,11 @@ IRC_JOIN( CLIENT *Client, REQUEST *Req )
                                if( Lists_CheckBanned( target, chan ))
                                {
                                        /* Client ist gebanned: */
+                                       IRC_WriteStrClient( Client, ERR_BANNEDFROMCHAN_MSG, Client_ID( Client ), channame );
+
+                                       /* naechsten Namen ermitteln */
+                                       channame = strtok( NULL, "," );
+                                       continue;
                                }
 
                                /* Ist der Channel "invite-only"? */
@@ -104,6 +114,11 @@ IRC_JOIN( CLIENT *Client, REQUEST *Req )
                                        if( ! Lists_CheckInvited( target, chan ))
                                        {
                                                /* Client wurde nicht invited: */
+                                               IRC_WriteStrClient( Client, ERR_INVITEONLYCHAN_MSG, Client_ID( Client ), channame );
+
+                                               /* naechsten Namen ermitteln */
+                                               channame = strtok( NULL, "," );
+                                               continue;
                                        }
                                }
                        }
@@ -142,7 +157,7 @@ IRC_JOIN( CLIENT *Client, REQUEST *Req )
                if( modes[1] )
                {
                        /* Modes im Channel bekannt machen */
-                       IRC_WriteStrChannelPrefix( Client, chan, target, FALSE, "MODE %s %s :%s", channame, modes, Client_ID( target ));
+                       IRC_WriteStrChannelPrefix( Client, chan, target, FALSE, "MODE %s +%s %s", channame, &modes[1], Client_ID( target ));
                }
 
                if( Client_Type( Client ) == CLIENT_USER )
@@ -224,7 +239,7 @@ IRC_TOPIC( CLIENT *Client, REQUEST *Req )
 
        /* Welcher Channel? */
        chan = Channel_Search( Req->argv[0] );
-       if( ! chan ) return IRC_WriteStrClient( from, ERR_NOTONCHANNEL_MSG, Client_ID( from ), Req->argv[0] );
+       if( ! chan ) return IRC_WriteStrClient( from, ERR_NOSUCHCHANNEL_MSG, Client_ID( from ), Req->argv[0] );
 
        /* Ist der User Mitglied in dem Channel? */
        if( ! Channel_IsMemberOf( chan, from )) return IRC_WriteStrClient( from, ERR_NOTONCHANNEL_MSG, Client_ID( from ), Req->argv[0] );
@@ -279,9 +294,8 @@ IRC_LIST( CLIENT *Client, REQUEST *Req )
                chan = Channel_First( );
                while( chan )
                {
-                       /* Passt die Suchmaske auf diesen Channel? Bisher werden hier
-                        * "regular expressions" aber noch nicht unterstuetzt ... */
-                       if(( strcasecmp( pattern, Channel_Name( chan )) == 0 ) || ( strcmp( pattern, "*" ) == 0 ))
+                       /* Passt die Suchmaske auf diesen Channel? */
+                       if( Match( pattern, Channel_Name( chan )))
                        {
                                /* Treffer! */
                                if( ! IRC_WriteStrClient( Client, RPL_LIST_MSG, Client_ID( Client), Channel_Name( chan ), Channel_MemberCount( chan ), Channel_Topic( chan ))) return DISCONNECTED;