+} /* IRC_Show_MOTD */
+
+
+GLOBAL BOOLEAN
+IRC_Send_NAMES( CLIENT *Client, CHANNEL *Chan )
+{
+ BOOLEAN is_visible, is_member;
+ CHAR str[LINE_LEN + 1];
+ CL2CHAN *cl2chan;
+ CLIENT *cl;
+
+ assert( Client != NULL );
+ assert( Chan != NULL );
+
+ if( Channel_IsMemberOf( Chan, Client )) is_member = TRUE;
+ else is_member = FALSE;
+
+ /* Alle Mitglieder suchen */
+ sprintf( str, RPL_NAMREPLY_MSG, Client_ID( Client ), "=", Channel_Name( Chan ));
+ cl2chan = Channel_FirstMember( Chan );
+ while( cl2chan )
+ {
+ cl = Channel_GetClient( cl2chan );
+
+ if( strchr( Client_Modes( cl ), 'i' )) is_visible = FALSE;
+ else is_visible = TRUE;
+
+ if( is_member || is_visible )
+ {
+ /* Nick anhaengen */
+ if( str[strlen( str ) - 1] != ':' ) strcat( str, " " );
+ if( strchr( Channel_UserModes( Chan, cl ), 'o' )) strcat( str, "@" );
+ else if( strchr( Channel_UserModes( Chan, cl ), 'v' )) strcat( str, "+" );
+ strcat( str, Client_ID( cl ));
+
+ if( strlen( str ) > ( LINE_LEN - CLIENT_NICK_LEN - 4 ))
+ {
+ /* Zeile wird zu lang: senden! */
+ if( ! IRC_WriteStrClient( Client, "%s", str )) return DISCONNECTED;
+ sprintf( str, RPL_NAMREPLY_MSG, Client_ID( Client ), "=", Channel_Name( Chan ));
+ }
+ }
+
+ /* naechstes Mitglied suchen */
+ cl2chan = Channel_NextMember( Chan, cl2chan );
+ }
+ if( str[strlen( str ) - 1] != ':')
+ {
+ /* Es sind noch Daten da, die gesendet werden muessen */
+ if( ! IRC_WriteStrClient( Client, "%s", str )) return DISCONNECTED;
+ }
+
+ return CONNECTED;
+} /* IRC_Send_NAMES */
+
+
+GLOBAL BOOLEAN
+IRC_Send_WHO( CLIENT *Client, CHANNEL *Chan, BOOLEAN OnlyOps )
+{
+ BOOLEAN is_visible, is_member;
+ CL2CHAN *cl2chan;
+ CHAR flags[8];
+ CLIENT *c;
+
+ assert( Client != NULL );
+ assert( Chan != NULL );
+
+ if( Channel_IsMemberOf( Chan, Client )) is_member = TRUE;
+ else is_member = FALSE;
+
+ /* Alle Mitglieder suchen */
+ cl2chan = Channel_FirstMember( Chan );
+ while( cl2chan )
+ {
+ c = Channel_GetClient( cl2chan );
+
+ if( strchr( Client_Modes( c ), 'i' )) is_visible = FALSE;
+ else is_visible = TRUE;
+
+ if( is_member || is_visible )
+ {
+ /* Flags zusammenbasteln */
+ strcpy( flags, "H" );
+ if( strchr( Client_Modes( c ), 'o' )) strcat( flags, "*" );
+ if( strchr( Channel_UserModes( Chan, c ), 'o' )) strcat( flags, "@" );
+ else if( strchr( Channel_UserModes( Chan, c ), 'v' )) strcat( flags, "+" );
+
+ /* ausgeben */
+ if(( ! OnlyOps ) || ( strchr( Client_Modes( c ), 'o' )))
+ {
+ if( ! IRC_WriteStrClient( Client, RPL_WHOREPLY_MSG, Client_ID( Client ), Channel_Name( Chan ), Client_User( c ), Client_Hostname( c ), Client_ID( Client_Introducer( c )), Client_ID( c ), flags, Client_Hops( c ), Client_Info( c ))) return DISCONNECTED;
+ }
+ }
+
+ /* naechstes Mitglied suchen */
+ cl2chan = Channel_NextMember( Chan, cl2chan );
+ }
+ return CONNECTED;
+} /* IRC_Send_WHO */
+
+
+GLOBAL BOOLEAN
+IRC_Send_LUSERS( CLIENT *Client )
+{
+ LONG cnt;
+
+ assert( Client != NULL );
+
+ /* Users, Services und Serevr im Netz */
+ if( ! IRC_WriteStrClient( Client, RPL_LUSERCLIENT_MSG, Client_ID( Client ), Client_UserCount( ), Client_ServiceCount( ), Client_ServerCount( ))) return DISCONNECTED;
+
+ /* IRC-Operatoren im Netz */
+ cnt = Client_OperCount( );
+ if( cnt > 0 )
+ {
+ if( ! IRC_WriteStrClient( Client, RPL_LUSEROP_MSG, Client_ID( Client ), cnt )) return DISCONNECTED;
+ }
+
+ /* Unbekannt Verbindungen */
+ cnt = Client_UnknownCount( );
+ if( cnt > 0 )
+ {
+ if( ! IRC_WriteStrClient( Client, RPL_LUSERUNKNOWN_MSG, Client_ID( Client ), cnt )) return DISCONNECTED;
+ }
+
+ /* Channels im Netz */
+ if( ! IRC_WriteStrClient( Client, RPL_LUSERCHANNELS_MSG, Client_ID( Client ), Channel_Count( ))) return DISCONNECTED;
+
+ /* Channels im Netz */
+ if( ! IRC_WriteStrClient( Client, RPL_LUSERME_MSG, Client_ID( Client ), Client_MyUserCount( ), Client_MyServiceCount( ), Client_MyServerCount( ))) return DISCONNECTED;
+
+ return CONNECTED;
+} /* IRC_Send_LUSERS */