18 septiembre 2007

Creando un cliente de chat IRC con Indy (II)

Una vez establecida la conexión con el servidor y sabiendo de que salas de chat dispone, vamos a entrar a un canal a chatear.

ENTRANDO A UN CANAL

Para entrar a un canal se utiliza el método Join:

IRC.Join( '#amistades' );

Esto viene a ser lo mismo que hacer:

IRC.Raw( 'join #amistades' );

Podemos entrar a tantos canales como deseemos pero para hacer un buen cliente de chat hay que crear un formulario por canal, ya que el protocolo IRC nos permite chatear en múltiples canales simultaneamente.

Una vez se ha enviado el comando JOIN el servidor nos devuelve la lista de usuarios que hay en ese canal. Para recoger dicha lista hay que utilizar el evento OnNames del componente IdIRC, donde volcaremos el contenido de la misma en un ListBox que vamos a llamar Usuarios:

procedure TFormulario.IRCNames( Sender: TObject; AUsers: TIdIRCUsers; AChannel: TIdIRCChannel );
var i: Integer;
begin
if Assigned( AUsers ) then
begin
Usuarios.Clear;

for i := 0 to AUsers.Count - 1 do
Usuarios.Items.Add( AUsers.Items[i].Nick );
end;
end;

Es conveniente que el ListBox este ordenado alfabéticamente activando la propiedad Sorted para no volvernos locos buscando los usuarios por su nombre.

LEYENDO LOS MENSAJES DEL SERVIDOR

Una vez conectados a un canal, el servidor nos mandará dos tipos de mensajes: lo que hablan todos los usuarios en el canal y lo que un usuario en concreto nos esta diciendo. ¿Cómo distinguimos cada cual? Pues para ello el evento OnMessaje nos dice el usuario y canal que nos manda el mensaje:

procedure TFormulario.IRCMessage( Sender: TObject; AUser: TIdIRCUser;
AChannel: TIdIRCChannel; Content: string );
begin
if Assigned( AUser ) then
begin
if Assigned( AChannel ) then
Canal.Lines.Add( AUser.Nick + '> ' + Content )
else
Privado.Lines.Add( AUser.Nick + '> ' + Content );
end;
end;

Como se puede apreciar primero comprobamos si existe el usuario (por si acaso es un mensaje del sistema) y luego si tiene canal metemos el mensaje por el mismo (poniendo el nick delante como MIRC) y si no es asi lo mandamos a una conversación privada. En este caso he enviado el texto de la conversación a un componente RichEdit.

Sería interesante que nuestro cliente de chat dispusiera de un formulario por cada conversación privada. Por ello, sería recomendable que nuestro programa de chat utilizara ventanas MDI para permitir el control absoluto cada una de las salas en las que estamos así como cada una de las conversaciones privadas. En otro artículo escribiré como crear aplicaciones MDI.

Otra característica que lo haría más profesional sería dibujar el nick y el mensaje del usuario con colores distintos como vimos anteriormente en el artículo dedicado al componente RichEdit. Y si además damos al usuario la posibilidad de seleccionar los colores de fondo, texto, nicks y tipo de fuente, el programa se aproximaría al famoso cliente MIRC.

ENVIANDO MENSAJES AL SERVIDOR

Se pueden enviar dos tipos de mensajes: a un canal donde estamos (para el público en general ) o a un usuario en concreto. El método say del componente IdIRC cumple dicho cometido.

Si quiero enviar un mensaje al canal amistades:

IRC.Say( '#amistades', 'hola a todos' );

Y si es para un usuario con el que estamos chateando:

IRC.Say( '#maria', 'hola guapa, que tal?' );

Al fin y al cabo para el servidor todo son canales, tanto canales públicos como usuarios particulares. Tenemos que ser nosotros los que debemos procesar de donde viene el mensaje y a donde deseamos enviarlo. De ahí la necesidad de crear un formulario por canal y otro por conversación privada.

ABANDONANDO UN CANAL Y UN SERVIDOR

Para abandonar un canal se utiliza el método Part:

IRC.Part( '#amistades' );

Si se nos olvida hacer esto y seguimos abriendo canales al final gastaremos mucho ancho de banda, ya que el servidor nos manda todos los mensajes publicos de cada uno de los canales abiertos.

Si queremos desconectar del servidor se utiliza el comando:

IRC.Disconnect;

Esto cancelará la conexión con el servidor cerrando todos los mensajes públicos y privados del mismo. En nuestro programa deberemos cerrar todas las ventanas de conversación abiertas.

Todavía quedan algunos puntos importantes para terminar de crear un cliente de chat, tales como saber si un usuario entra o abandona el canal donde estamos.

Pruebas realizadas en Delphi 7.

Publicidad