Exploring the roots and future of Internet Relay Chat

WeeChat: plugins, relay y configuracion avanzada

Migre de irssi a WeeChat en 2015. No porque irssi tuviera problemas — funcionaba perfectamente. Sino porque necesitaba acceder a IRC desde el movil de forma decente, y el relay protocol de WeeChat era la unica solucion que no requeria instalar un bouncer separado. Diez anos despues, sigo con WeeChat. Irssi fue un buen cliente. WeeChat es un ecosistema.

WeeChat en 2025

WeeChat es un cliente IRC de terminal, como irssi, pero con una filosofia diferente. Donde irssi es minimalista y delega funcionalidades a scripts Perl, WeeChat viene con baterias incluidas: soporte de mouse, buffers con scroll independiente, configuracion granular con mas de 500 opciones, y sobre todo, el relay protocol que permite conectar clientes remotos — incluyendo clientes web y moviles — directamente a tu WeeChat.

Tambien soporta otros protocolos ademas de IRC. Matrix, Slack, y XMPP tienen plugins (no oficiales pero funcionales). WeeChat se convierte en un hub de comunicacion centralizado en terminal. Pero su corazon sigue siendo IRC, y es donde mejor funciona.

La curva de aprendizaje es real. WeeChat tiene mas opciones que cualquier otro cliente IRC, y la documentacion, aunque completa, es densa. Pero una vez configurado, es el cliente mas potente y flexible que existe en terminal.

Configuracion esencial

WeeChat usa un sistema de opciones con prefijo. Cada opcion tiene un nombre jerarquico como irc.server.libera.autojoin. Modificas opciones con /set y las guardas con /save.

# Identidad por defecto:
/set irc.server_default.nicks "marco,marco_,marco__"
/set irc.server_default.username "marco"
/set irc.server_default.realname "Marco Pellegrini"

# Apariencia:
/set weechat.look.buffer_time_format "%H:%M:%S"
/set weechat.look.prefix_align max_length
/set weechat.look.prefix_align_max 15
/set weechat.look.nick_color_force ""
/set weechat.look.nick_color_hash djb2
/set weechat.bar.nicklist.size_max 15

# Filtrar joins/parts/quits:
/filter add joinquit * irc_join,irc_part,irc_quit *
# Para desactivar el filtro temporalmente:
/filter toggle joinquit

# Logging:
/set logger.level.irc 9
/set logger.mask.irc "$server/$channel/%Y-%m-%d.log"

# Layout (organizar barras):
/set weechat.bar.status.items "[time],[buffer_last_number],[buffer_plugin],buffer_number+:+buffer_name+(buffer_modes)+{buffer_nicklist_count}+buffer_zoom+buffer_filter,scroll,[lag],[hotlist],completion"

# Mouse (si tu terminal lo soporta):
/mouse enable

# Guardar:
/save

Una diferencia clave con irssi: WeeChat guarda la configuracion en archivos separados por modulo (weechat.conf, irc.conf, plugins.conf, etc.), no en un solo archivo monolitico. Esto hace que la configuracion sea mas manejable y los merge de git menos dolorosos.

Plugins que importan

WeeChat tiene un repositorio oficial de scripts con cientos de plugins. Los que considero esenciales:

  • buffers.pl: Reemplaza la lista de buffers por defecto con una sidebar mas informativa. Muestra actividad, hilights, y nombres de canal.
  • iset.pl: Editor interactivo de opciones. En vez de recordar nombres exactos de opciones, buscas con /iset y navegas.
  • colorize_nicks.py: Colorea los nicks mencionados en los mensajes, no solo en el prefijo. Mejora la legibilidad cuando alguien menciona a otro usuario.
  • go.py: Navegacion rapida entre buffers. Escribes /go deb y salta al buffer que coincida (ej: #debian).
  • autosort.py: Ordena los buffers automaticamente por red y nombre. Sin esto, los buffers se acumulan en orden de apertura.
  • spell.py: Correccion ortografica en tiempo real usando aspell/hunspell.
# Instalar scripts desde WeeChat:
/script install buffers.pl
/script install iset.pl
/script install colorize_nicks.py
/script install go.py
/script install autosort.py

# Los scripts se descargan a ~/.local/share/weechat/scripts/
# Los activos se enlazan en .../scripts/autoload/

# Buscar scripts:
/script search keyword

# Actualizar lista de scripts:
/script update
Consejo: /script es el gestor de plugins integrado de WeeChat. No necesitas descargar archivos manualmente ni gestionar symlinks como en irssi. Instalar, actualizar, y desinstalar se hace todo desde dentro de WeeChat.

Escribir plugins en Python

WeeChat soporta plugins en Python, Perl, Ruby, Lua, Tcl, Guile, JavaScript, y PHP. Python es el mas usado y el que mejor documentacion tiene. Un plugin basico:

# ~/.local/share/weechat/python/miplugin.py
import weechat

MY_NAME = "miplugin"
MY_VERSION = "1.0"
MY_DESCRIPTION = "Plugin de ejemplo"

def mi_comando_cb(data, buffer, args):
    """Callback para /miplugin"""
    if not args:
        weechat.prnt(buffer, "Uso: /miplugin ")
        return weechat.WEECHAT_RC_OK
    weechat.prnt(buffer, f"Procesando: {args}")
    return weechat.WEECHAT_RC_OK

def mi_timer_cb(data, remaining_calls):
    """Se ejecuta cada 5 minutos"""
    weechat.prnt("", f"{MY_NAME}: timer ejecutado")
    return weechat.WEECHAT_RC_OK

def mi_signal_cb(data, signal, signal_data):
    """Reacciona a eventos IRC"""
    # signal_data contiene el mensaje IRC raw
    weechat.prnt("", f"Signal: {signal} -> {signal_data}")
    return weechat.WEECHAT_RC_OK

if __name__ == "__main__":
    if weechat.register(MY_NAME, "marco", MY_VERSION, "MIT",
                        MY_DESCRIPTION, "", ""):
        # Registrar comando:
        weechat.hook_command(
            "miplugin",      # nombre
            "Descripcion",   # descripcion
            "",       # argumentos
            "texto: lo que quieras procesar",  # help
            "",              # completion
            "mi_comando_cb", # callback
            ""               # data
        )
        # Timer cada 300 segundos:
        weechat.hook_timer(300000, 0, 0, "mi_timer_cb", "")
        # Escuchar mensajes publicos:
        weechat.hook_signal("*,irc_in2_PRIVMSG",
                           "mi_signal_cb", "")
        weechat.prnt("", f"{MY_NAME} v{MY_VERSION} cargado.")

La API de WeeChat para scripts es extensa. Los hooks principales:

# hook_command: registrar un /comando
# hook_timer: ejecutar cada N milisegundos
# hook_signal: reaccionar a eventos (join, part, msg...)
# hook_print: interceptar mensajes impresos en buffers
# hook_modifier: modificar mensajes antes de mostrarlos
# hook_process: ejecutar comandos externos de forma asincrona
# hook_url: hacer peticiones HTTP asincronas (WeeChat 4.0+)

# Ejemplo: peticion HTTP asincrona
def url_cb(data, command, return_code, out, err):
    if return_code == 0:
        weechat.prnt("", f"Resultado: {out}")
    return weechat.WEECHAT_RC_OK

weechat.hook_process(
    "url:https://api.example.com/data",
    10000,       # timeout ms
    "url_cb",
    ""
)

La ventaja sobre Eggdrop/Tcl es evidente: acceso completo al ecosistema Python. Puedes importar requests, json, sqlite3, o cualquier modulo instalado. Y las peticiones externas son asincronas por defecto — el cliente no se bloquea mientras espera una respuesta HTTP.

El relay protocol

El relay protocol es la funcionalidad que distingue a WeeChat de todos los demas clientes IRC de terminal. Permite que clientes remotos se conecten a tu WeeChat y accedan a todos sus buffers, mensajes, y funcionalidades. Es como un bouncer integrado, pero mejor: los clientes remotos ven la misma interfaz que tu WeeChat local.

# Activar relay:
/set relay.network.password "tu_contrasena_fuerte"

# Relay para clientes WeeChat (protocolo weechat):
/relay add weechat 9001

# Relay con TLS:
# Primero, certificado:
mkdir -p ~/.local/share/weechat/tls
# Copiar o generar cert:
openssl req -x509 -nodes -days 365 -newkey rsa:2048 \
  -keyout ~/.local/share/weechat/tls/relay.pem \
  -out ~/.local/share/weechat/tls/relay.pem
# O con Let's Encrypt:
cat /etc/letsencrypt/live/tudominio/privkey.pem \
    /etc/letsencrypt/live/tudominio/fullchain.pem \
    > ~/.local/share/weechat/tls/relay.pem

/relay add tls.weechat 9001

# Relay para clientes IRC (tu WeeChat actua como bouncer):
/relay add tls.irc 7992

# Ver conexiones activas:
/relay

# Clientes compatibles con relay weechat:
# - Glowing Bear (web) — glowing-bear.org
# - WeeChatAndroid (movil)
# - weechat.js (Node.js)

/save

Glowing Bear es un cliente web que se conecta a tu WeeChat via relay. Lo abres en el navegador, introduces la IP, puerto, y contrasena de tu relay, y tienes acceso completo a tu IRC desde cualquier dispositivo con un navegador. Todo el procesamiento ocurre en tu servidor — el navegador solo renderiza.

Para uso movil, WeeChatAndroid se conecta directamente al relay y soporta notificaciones push. Recibes una notificacion cuando alguien te menciona, abres la app, y estas en tu sesion IRC. Sin bouncer separado, sin sincronizacion de buffers — todo vive en tu WeeChat del servidor.

Atencion: El relay protocol transmite todo: mensajes, contrasenas, comandos. Si no usas TLS en el relay, cualquiera en la red puede interceptar tu sesion. Usa SIEMPRE tls.weechat en vez de weechat para el relay. La version sin TLS solo debe usarse en localhost.

Multiples redes

# Anadir servidores:
/server add libera irc.libera.chat/6697 -tls
/server add oftc irc.oftc.net/6697 -tls
/server add efnet irc.efnet.org/6697 -tls

# SASL por servidor:
/set irc.server.libera.sasl_mechanism plain
/set irc.server.libera.sasl_username tunick
/set irc.server.libera.sasl_password tupassword

# Canales automaticos:
/set irc.server.libera.autojoin "#debian,#linux,#python"
/set irc.server.oftc.autojoin "#sysadmin,#networking"

# Autoconectar:
/set irc.server.libera.autoconnect on
/set irc.server.oftc.autoconnect on

# Nick diferente por red:
/set irc.server.efnet.nicks "otro_nick"

# Conectar:
/connect libera
/connect oftc

/save

WeeChat gestiona las redes en buffers separados. El plugin autosort los agrupa por red, asi que ves todos los canales de Libera juntos, todos los de OFTC juntos. Navegar entre redes es igual que navegar entre canales: /go o los atajos de teclado.

Triggers: automatizacion nativa

Los triggers son el sistema de automatizacion nativo de WeeChat. Permiten interceptar y modificar eventos sin escribir un plugin completo. Son como hooks declarativos.

# Ejemplo: ocultar passwords en el input
/trigger add hide_password modifier input_text_display
"" "${tg_string} =~ /password/" "/password \S+/password *****/"

# Ejemplo: notificacion personalizada para highlights
/trigger add my_highlight print ""
"${tg_highlight} == 1" ""
"/exec -norc notify-send IRC '${tg_prefix}: ${tg_message}'"

# Ejemplo: auto-responder a CTCP VERSION
/trigger add my_version signal "*,irc_in_PRIVMSG"
"" "${tg_signal_data} =~ /VERSION/" ""
"/ctcp ${tg_signal_data} VERSION WeeChat ${info:version}"

# Listar triggers activos:
/trigger list

# Deshabilitar un trigger:
/trigger disable my_highlight

# El editor de triggers interactivo:
/trigger monitor

Los triggers son potentes pero la sintaxis es densa. Para automatizaciones simples (filtrar texto, reaccionar a patrones), son perfectos. Para logica compleja, escribe un plugin en Python — sera mas legible y mantenible.

Preguntas frecuentes

WeeChat reemplaza completamente a un bouncer?

Si y no. Con tmux + WeeChat + relay, tienes persistencia (tmux), acceso remoto (relay), y multiples clientes (Glowing Bear, movil). No tienes features especificas de bouncers como clientbuffer de ZNC (cada cliente recibe mensajes independientemente). Si necesitas eso, ZNC sigue siendo necesario.

Cuanta memoria usa WeeChat?

Mas que irssi, menos de lo que esperas. Con 5 redes, 30 canales, y varios plugins, entre 40-80 MB de RAM. El relay protocol anade poco overhead. Lo que si consume es el historial de buffers en memoria — configura un limite razonable con /set weechat.history.max_buffer_lines_number.

Puedo migrar mi configuracion de irssi a WeeChat?

No hay una herramienta automatica. Los formatos son completamente diferentes. Lo que si puedes es migrar manualmente: servidores, canales, nicks, y configuraciones de SASL. Los scripts de irssi (Perl) no son compatibles directamente — tendras que buscar equivalentes en el repositorio de scripts de WeeChat.

WeeChat soporta IRCv3?

Si, ampliamente. SASL, message-tags, server-time, echo-message, batch, labeled-response, y mas. WeeChat es uno de los clientes con mejor soporte de IRCv3 junto con Senpai y algunos clientes graficos modernos.