lunes, junio 12, 2006

Modificando Gaim

Uso Gaim para manejar todas mis conversaciones de mensajería instantánea. Me gusta tener todas las conversaciones en la misma ventana, no importa de qué red sea. Gaim me permite tener mis conversaciones de IRC, MSN, Yahoo y Google en la misma ventana. Sin embargo, hay algo que siempre me ha molestado de usar Gaim como cliente de IRC: No se puede ver en la lista de usuarios quién está ausente o away. Otros clientes como XChat o Chatzilla si hacen esto. Así que decidí aprovechar las ventajas del software libre y me propuse modificar Gaim para realizara esta tarea.

Aquí hay un pantallazo de XChat mostrando los usuarios away (en gris).

Pantallazo-XChat

En un principio pensé que sería un cambio bastante fácil. Sin embargo, poco a poco me di cuenta de que había una razón por la cual un cambio tan aparentemente sencillo no se había hecho ya. El problema viene directamente desde el protocolo IRC. A diferencia de estados como de operador (op) o de voz (voice), el estado de ausencia (away) no puede obtenerse con un mensaje names. Para conocer si un usuario esta away hay que mandar un mensaje whois. La solución entonces para conocer qué usuarios están away es mandar un mensaje whois por cada usuario de un canal y, en base a su respuesta, colocar una etiqueta al usuario para indicar que esta away. La serie de mensajes whois tendría que mandarse cada cierto tiempo para mantener la lista actualizada. El problema de este enfoque es que se genera un gran overhead al tener que hacer los whois a cada rato. Por esta misma razón fué que a el mantenedor del módulo de IRC de Gaim, Ethan Blanton, no le sonó la idea de implementar esta característica. Cuando le dije que todos los clientes hacen eso, me dijo: if everybody else jumped off a bridge, would you? Creo que estaba de mal genio, cuando le pregunté en #gaim, estaba embolatado con el sistema de señales. Otro día tengo que insistir.

Definitivamente ver el código fuente de proyectos de software libre es una gran experiencia. Uno aprende muchas cosas. El código de Gaim me pareció muy bonito, organizado y fácil de entender. El código de XChat me pareció horrible. Husmear en el código de los programas también sirve para encontrar pequeños huevos de pascua muy curiosos, como lo que hace este pequeño fragmento del código del mensaje whois del módulo IRC de Gaim:

if (!strcmp(irc->whois.nick, "Paco-Paco")) {
    g_string_append_printf(info, 
     _("<br><b>Defining adjective:</b> Glorious<br>"));
}

Lo que hace este pedazo de código es que cada vez que se hace un whois al usuario Paco-Paco (Ethan Blanton), le colocaa al final del mensaje "Defining adjective: Glorious". Algo más curioso aún es que es una cadena traducible, por lo tanto, los traductores lo han traducido sin darse cuenta. Aquí hay un pantallazo de un whois a Paco-Paco:

Pantallazo-Gaim