17 septiembre 2007

Creando un cliente de chat IRC con Indy (I)

Aunque MSN es el rey de la comunicación instantánea aún siguen muy vivos los servidores de chat IRC tales como irc-hispano.

IRC define un protocolo de comunicaciones entre clientes y servidores permitiendo incluso el envío de archivos por conexión directa. De todos es conocido el potente programa para Windows llamado MIRC creado hace años y que aún sigue siendo el cliente más utilizado para el IRC debido a sus múltiples extensiones.

En nuestro caso vamos a ver como utilizar el componente de la clase TIdIRC el cual esta situado en la pestaña de componentes Indy.

CONECTANDO CON EL SERVIDOR

Antes de comenzar a chatear con el servidor hay que establecer una conexión con el mismo utilizando un apodo (nick) y una contraseña en el caso de que sea necesaria (la mayoría de los servidores IRC son públicos).

Supongamos que tenemos en el formulario principal de nuestra aplicación un componente IdIRC que vamos a llamar IRC. Para conectar con el servidor hay que hacer lo siguiente:

IRC.Nick := 'juanito33487';
IRC.AltNick := 'juanito33488';
IRC.Username := 'juanito33487';
IRC.RealName := 'juan';
IRC.Password := '';
IRC.Host := 'irc.irc-hispano.org';

try
IRC.Connect;
except
Application.MessageBox( 'No se ha podido conectar con el servidor.',
'Error de conexión', MB_ICONSTOP );
end;

Estos son los parámetros para conectar:

Nick -> apodo por el que nos conocerán los demás usuarios
AltNick -> si el nick que hemos utilizado está ocupado por otro usuario cogerá este otro nick
Username -> Nombre del usuario para el servidor (da lo mismo si no estamos registrados)
Realname -> Nombre real del usuario
Password -> Clave de acceso para usuarios registrados
Host -> Dirección IP del servidor

Cualquier persona puede conectarse a un servidor de chat dando sólo el nombre del usuario sin contraseña. Pero si queremos que nadie utilice nuestro nick nos podemos registrar gratuitamente (en la mayoría de los casos) en el servidor con un usuario y password obteniendo además algunas características adicionales como entrar a salas de chat restringidas o tener nuestro propio servidor de mensajes y correo online 24 horas al día.

Una vez conectados al servidor toca entrar en una sala de chat. Pero, ¿de que salas de chat dispone el servidor? Para ello utilizamos el comando:

IRC.Raw( 'LIST' );

El método Raw permite mandar cualquier tipo de comando al servidor. Se suele utilizar cuando el componente IRC no contiene métodos para realizar tareas específicas. Los servidores IRC trabajan enviando y recibiendo mensajes de texto continuamente. Para los que les interese saber como funciona por dentro el protocolo IRC disponen de este documento RFC:

http://www.rfc-es.org/rfc/rfc1459-es.txt

Pese a los comandos del IRC estándar algunos servidores disponen de comandos propios para tareas específicas. Para esos casos utilizaremos el método Raw.

Hay que tener mucho cuidado cuando se llama al comando LIST ya que hay servidores como los irc-hispano que disponen de miles de canales lo cual puede hacer que el tiempo en sacar el listado llegue a ser desesperante. Por ello sería deseable que tanto la función de conectar a un servidor IRC como la de listar los canales estuviera dentro de un hilo de ejecución, ya que hasta que no conecta da la sensación de que nuestro programa esta colgado.

Después de ejecutar dicho comando tenemos que programar el evento OnList para recoger la información del listado de canales. En este caso para volcar los canales en un componente ListBox llamado Canales hacemos lo siguiente:

procedure TFormulario.IRCList( Sender: TObject; AChans: TStringList;
APosition: Integer; ALast: Boolean );
begin
Canales.Items := AChans;
end;

Con esto ya tenemos la lista de canales que dispone el servidor así como el número de usuarios que hay conectados por canal y su descripción. Por ejemplo:

#amistades 20 Busca nuevos amig@s
#amor 50 Conoce a tu media naranja
#sexo 80 No te cortes un pelo
#musica 34 Comparte la pasión por tus artistas preferidos
....

En un servidor de IRC los canales comienzan con el carácter # seguido de su nombre sin espacios.

En el próximo artículo veremos como entrar a los canales de chat y hablar con otros usuarios.

Pruebas realizadas en Delphi 7.

2 comentarios:

Anónimo dijo...

HOLA checando tu articulo cheke si funciona pero no encontre el evento OnList que mencionas, aclaro que estoy trabajando en el c++builder 2009, pero el componente existe asi que no deberia de tener problemas por ese lado, por cierto es muy interesante tu blog

Administrador dijo...

Para resolver ese tipo de problemas al final siempre recurro a mirar el código fuente del componente, ya que la información que hay de los Indy por Internet es escasa y anticuada.

Te aconsejo que hagas lo mismo.

Saludos.

Publicidad