+
+ Log( LOG_NOTICE, "Got KILL command from \"%s\" for \"%s\": %s", Client_Mask( prefix ), Req->argv[0], Req->argv[1] );
+
+ /* andere Server benachrichtigen */
+ IRC_WriteStrServersPrefix( Client, prefix, "KILL %s :%s", Req->argv[0], Req->argv[1] );
+
+ /* haben wir selber einen solchen Client? */
+ c = Client_GetFromID( Req->argv[0] );
+ if( c && ( Client_Conn( c ) != NONE )) Conn_Close( Client_Conn( c ), NULL, Req->argv[1], TRUE );
+
+ return CONNECTED;
+} /* IRC_KILL */
+
+
+GLOBAL BOOLEAN IRC_Show_MOTD( CLIENT *Client )
+{
+ BOOLEAN ok;
+ CHAR line[127];
+ FILE *fd;
+
+ assert( Client != NULL );
+
+ fd = fopen( Conf_MotdFile, "r" );
+ if( ! fd )
+ {
+ Log( LOG_WARNING, "Can't read MOTD file \"%s\": %s", Conf_MotdFile, strerror( errno ));
+ return IRC_WriteStrClient( Client, ERR_NOMOTD_MSG, Client_ID( Client ) );
+ }
+
+ IRC_WriteStrClient( Client, RPL_MOTDSTART_MSG, Client_ID( Client ), Client_ID( Client_ThisServer( )));
+ while( TRUE )
+ {
+ if( ! fgets( line, 126, fd )) break;
+ if( line[strlen( line ) - 1] == '\n' ) line[strlen( line ) - 1] = '\0';
+ if( ! IRC_WriteStrClient( Client, RPL_MOTD_MSG, Client_ID( Client ), line ))
+ {
+ fclose( fd );
+ return FALSE;
+ }
+ }
+ ok = IRC_WriteStrClient( Client, RPL_ENDOFMOTD_MSG, Client_ID( Client ) );
+
+ fclose( fd );
+
+ return ok;
+} /* 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, 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, 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 )
+{
+ INT 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 */