Exploring the roots and future of Internet Relay Chat

Bots relay y puentes IRC: Matterbridge, BitlBee, Matrix y más

En 2016, cuando Discord empezó a comerse la base de usuarios de IRC en comunidades de gaming, me resistí. "Es una moda", pensaba. "IRC sobrevivirá como siempre". Y tenía razón en que IRC sobrevive — pero también tenía que aceptar que una parte de mis comunidades se fragmentó entre IRC, Discord, Telegram y Matrix.

La solución pragmática: puentes. Conectar los protocolos para que un mensaje enviado en Discord aparezca en IRC y viceversa. Llevo 6 años operando puentes entre IRC y al menos otros tres protocolos. Este artículo es lo que aprendí en ese tiempo — lo bueno, lo malo y lo que te va a frustrar.

¿Por qué conectar IRC con otros protocolos?

La razón principal es práctica: tu comunidad está fragmentada y no puedes obligar a nadie a usar un protocolo específico. Hay gente que vive en Discord, hay gente (como yo) que no va a salir de IRC, y hay gente que adoptó Matrix. Un puente permite que la conversación sea una sola.

Razones técnicas legítimas:

  • Comunidades open source que históricamente viven en IRC pero necesitan atraer contribuidores jóvenes que usan Discord.
  • Equipos de trabajo donde unos usan Slack y otros prefieren IRC.
  • Migración gradual — Estás moviendo tu comunidad de IRC a Matrix (o viceversa) y necesitas un periodo de transición.
  • Archivado unificado — Un solo punto donde todos los mensajes se loguean independientemente de dónde se originaron.

Y la razón por la que yo los opero: porque me niego a tener 5 aplicaciones de chat abiertas. IRC es mi interfaz, y los puentes traen todo lo demás a IRC.

Matterbridge: el puente universal

Matterbridge es un binario Go que conecta prácticamente cualquier protocolo de chat con cualquier otro. IRC, Discord, Telegram, Slack, Matrix, Mattermost, XMPP, Rocket.Chat, WhatsApp (via WhatsApp Web), y más. Es la navaja suiza de los puentes.

Instalación

# Descargar el último release
wget https://github.com/42wim/matterbridge/releases/latest/download/matterbridge-linux-amd64
chmod +x matterbridge-linux-amd64
sudo mv matterbridge-linux-amd64 /usr/local/bin/matterbridge

# Verificar
matterbridge -version

Configuración IRC ↔ Discord

# matterbridge.toml

[irc.mirc]
Server = "irc.irc6.net:6697"
UseTLS = true
Nick = "bridge-bot"
Password = "password_nickserv"    # Si el nick está registrado
RealName = "Matterbridge Relay"
SkipTLSVerify = false

[discord.midiscord]
Token = "tu_token_de_bot_discord"
Server = "ID_del_servidor_discord"
AutoWebhooks = true               # Usa webhooks para mostrar nicks reales

[[gateway]]
name = "mi-puente"
enable = true

[[gateway.inout]]
account = "irc.mirc"
channel = "#general"

[[gateway.inout]]
account = "discord.midiscord"
channel = "ID_del_canal_discord"
# Probar la configuración
matterbridge -conf matterbridge.toml -debug

# Si funciona, crear el servicio systemd:
# /etc/systemd/system/matterbridge.service
[Unit]
Description=Matterbridge Chat Bridge
After=network-online.target
Wants=network-online.target

[Service]
Type=simple
User=matterbridge
ExecStart=/usr/local/bin/matterbridge -conf /etc/matterbridge/matterbridge.toml
Restart=on-failure
RestartSec=10

[Install]
WantedBy=multi-user.target

Lo que Matterbridge hace bien

  • AutoWebhooks en Discord — En vez de mostrar todo como "bridge-bot: mensaje", crea webhooks que muestran el nick y avatar del usuario de IRC en Discord. Es una mejora enorme de UX.
  • Multi-gateway — Puedes conectar múltiples canales de múltiples protocolos en una sola instancia.
  • Formateo de mensajes — Traduce markdown de Discord a formato legible en IRC y viceversa.
  • Archivos y imágenes — Los archivos enviados en Discord se convierten en URLs que se comparten en IRC.
Consejo: Usa AutoWebhooks = true siempre que puedas. La diferencia de experiencia para los usuarios de Discord es abismal. En vez de ver un bot monolítico, ven nicks individuales con avatares. Los usuarios de Discord ni se enteran de que están hablando con gente en IRC.

BitlBee: todos los protocolos en tu cliente IRC

BitlBee tiene un enfoque diferente a Matterbridge. En vez de ser un puente entre canales, BitlBee es un gateway personal: convierte otros protocolos en IRC para que tú puedas usar tu cliente IRC para hablar en XMPP, Twitter (RIP), y con plugins, en Discord y Telegram.

Corres BitlBee como un servidor IRC local. Te conectas con tu cliente IRC a localhost:6667. BitlBee te presenta un canal especial (&bitlbee) donde gestionas tus cuentas. Los contactos de otros protocolos aparecen como usuarios IRC.

# Instalar BitlBee en Debian/Ubuntu
sudo apt install bitlbee bitlbee-plugin-otr

# Instalar plugin de Discord (via bitlbee-discord)
sudo apt install bitlbee-discord
# O compilar desde source:
git clone https://github.com/sm00th/bitlbee-discord.git
cd bitlbee-discord && ./autogen.sh && ./configure && make && sudo make install

# Instalar plugin de Telegram (via tdlib-purple)
# Este requiere compilación — ver el repo para instrucciones actualizadas

# Configurar BitlBee
# /etc/bitlbee/bitlbee.conf
[settings]
RunMode = ForkDaemon
User = bitlbee
DaemonInterface = 127.0.0.1
DaemonPort = 6667
AuthMode = Registered

# Iniciar
sudo systemctl enable bitlbee
sudo systemctl start bitlbee

Uso desde tu cliente IRC

# Conectar a BitlBee desde tu cliente IRC:
/server add bitlbee 127.0.0.1/6667
/connect bitlbee

# En el canal &bitlbee:
register mi_password          # Crear cuenta BitlBee

# Añadir cuenta Discord:
account add discord tu_email@example.com
account discord set password tu_password_discord
account discord on

# Los canales de Discord aparecen como canales IRC
# Los contactos de Telegram aparecen como nicks IRC
# Todo en tu cliente IRC habitual

La ventaja de BitlBee es que es personal. No estás haciendo relay público entre canales — estás usando tu cliente IRC como interfaz unificada para todas tus mensajerías. Es el enfoque que uso a diario.

Puentes Matrix-IRC

Matrix tiene el ecosistema de puentes más maduro gracias a la especificación Application Service. Hay dos puentes IRC-Matrix principales:

matrix-appservice-irc (puente oficial)

Es el puente que usa matrix.org para conectar con Libera.Chat. Cada usuario de Matrix que entra en una sala puenteada aparece como un usuario IRC individual. Es transparente — en IRC no puedes distinguir a un usuario de Matrix de uno nativo (excepto por el host).

# Estructura del matrix-appservice-irc:
#
# Matrix room: #canal:matrix.org
#     ↕
# IRC channel: #canal en irc.libera.chat
#
# Cada usuario de Matrix → nick IRC virtual
# @user:matrix.org → user[m] en IRC
#
# El puente necesita:
# 1. Un servidor Matrix (Synapse/Dendrite)
# 2. Registro como Application Service
# 3. Conexión IRC con permisos suficientes

# config.yaml del appservice (extracto)
ircService:
  servers:
    irc.libera.chat:
      port: 6697
      ssl: true
      sasl: true
      botConfig:
        nick: "matrixbot"
        username: "matrixbot"
      membershipLists:
        enabled: true
        global:
          ircToMatrix:
            initial: true
            incremental: true
          matrixToIrc:
            initial: true
            incremental: true
      mappings:
        "#canal":
          roomIds: ["!roomid:matrix.org"]

Heisenbridge (puente personal)

Heisenbridge es un puente Matrix-IRC más ligero, orientado a uso personal o redes pequeñas. No crea usuarios virtuales en IRC — todo pasa por un solo bot. Es más sencillo de configurar pero menos transparente.

# Instalar Heisenbridge
pip install heisenbridge

# Generar configuración de registration
heisenbridge -c /etc/heisenbridge/config.yaml --generate

# Configurar en Synapse (homeserver.yaml)
app_service_config_files:
  - /etc/heisenbridge/registration.yaml

# Iniciar
heisenbridge -c /etc/heisenbridge/config.yaml -l http://localhost:9898
Advertencia: El matrix-appservice-irc en redes IRC grandes (100+ salas puenteadas) consume una cantidad considerable de recursos. En Libera.Chat, el puente de matrix.org llegó a crear miles de conexiones IRC virtuales, lo que generó problemas de rendimiento tanto en el lado Matrix como en el IRC. Si vas a puentear muchos canales, habla con los operadores de la red IRC antes — pueden necesitar ajustar límites de conexión.

Problemas comunes y cómo resolverlos

1. Mensajes duplicados

El problema más frecuente: un mensaje se envía en IRC, el puente lo reenvía a Discord, otro puente lo detecta en Discord y lo reenvía de vuelta a IRC. Bucle infinito.

# Solución: ignorar mensajes del propio bot
# En Matterbridge, esto es automático si usas la misma instancia
# Si tienes dos instancias separadas, añade:

[general]
IgnoreNicks = "bridge-bot otro-bot"

# En configuraciones multi-puente, define claramente qué instancia
# maneja qué dirección. Nunca dos puentes en el mismo canal.

2. Nicks truncados o con caracteres inválidos

Los nicks de Discord permiten espacios, emojis y caracteres que IRC no acepta. El puente tiene que sanitizar.

# Matterbridge maneja esto con RemoteNickFormat:
[irc.mirc]
RemoteNickFormat = "<{NICK}> "
# O para nicks más cortos:
RemoteNickFormat = "[{NICK:.8}] "  # Trunca a 8 caracteres

3. Desconexiones y reconexiones

Los puentes se desconectan. Tu IRCd tiene límites de reconexión. Discord cambia la API. Telegram rate-limita. Cada protocolo falla de maneras diferentes.

# En Matterbridge, configurar reconexión robusta:
[irc.mirc]
RejoinDelay = 5000         # ms entre reconexión y rejoin
DebounceDelay = 3000       # Agrupa mensajes rápidos

# Monitoring: verificar que el puente está activo
# Crea un script que envía un mensaje de test cada hora
# y verifica que aparece en el otro lado

4. Historial perdido

IRC no tiene historial nativo (sin IRCv3 chathistory). Si un usuario de Discord se conecta y mira el canal, ve todo el historial. Si un usuario de IRC se conecta, no ve los mensajes que se enviaron mientras estaba desconectado, ni los que vinieron de Discord. Los puentes no solucionan esto — es una limitación fundamental del protocolo IRC.

Anti-patrones: lo que no deberías hacer

  • Puentear canales masivos sin avisar a los operadores IRC — He visto puentes que conectaban canales de Discord con 5.000 miembros a canales de IRC de 100 personas. El canal IRC se inundó con cientos de mensajes por minuto de usuarios que ni sabían que existía IRC. Avisa siempre antes.
  • Múltiples puentes en el mismo canal — Dos Matterbridge apuntando al mismo par IRC-Discord. Resultado: cada mensaje aparece duplicado. Es más común de lo que parece.
  • Puentear sin moderación cruzada — Un usuario de Discord spamea. El moderador de IRC no puede banear un usuario de Discord. El moderador de Discord no sabe que existe IRC. Resultado: el spam llega a ambos lados sin que nadie lo pare. Define quién modera qué y da herramientas para ambos lados.
  • Ignorar la privacidad — Los mensajes en IRC son por definición texto plano visible para operadores y cualquiera en el canal. Los mensajes en Matrix pueden estar cifrados con E2EE. Puentear una sala E2EE a IRC elimina la cifración. Avisa a los usuarios.
Consejo: Documenta tu setup de puentes. Quién lo opera, qué canales están conectados, cómo reportar problemas, y qué pasa si el puente se cae. Pon esta info en el topic del canal IRC y en la descripción del canal Discord. Te ahorrará preguntas repetidas cada vez que el bot se desconecte 5 minutos.

Preguntas frecuentes

¿Matterbridge soporta hilos de Discord/Slack?

Parcialmente. Los mensajes en hilos se reenvían al canal IRC como mensajes normales, generalmente con un prefijo que indica que es una respuesta o un hilo. Pero IRC no tiene concepto de hilos, así que la conversación se aplana. Los mensajes de vuelta desde IRC al hilo de Discord no funcionan de forma intuitiva — van al canal principal, no al hilo.

¿BitlBee funciona con la API actual de Discord?

El plugin bitlbee-discord funciona, pero Discord cambia su API regularmente y el plugin va por detrás. Hay periodos donde deja de funcionar hasta que alguien actualiza el plugin. Si necesitas fiabilidad para Discord, Matterbridge es más estable porque tiene desarrollo más activo y el mantenedor responde rápido a cambios de API.

¿Es posible puentear mensajes privados, no solo canales?

Matterbridge está diseñado para canales, no para mensajes privados. BitlBee sí maneja mensajes privados — los contactos de Discord/Telegram aparecen como nicks IRC y puedes hablar con ellos por privado. Para Heisenbridge, los mensajes privados de Matrix se pueden mapear a queries IRC. Pero cada herramienta tiene limitaciones: no esperes que las reacciones, ediciones de mensaje y features nativas de cada protocolo funcionen perfectamente a través de un puente.