Exploring the roots and future of Internet Relay Chat

Bots relais et passerelles IRC : Matterbridge, BitlBee et le pont Matrix

En 2024, vos interlocuteurs sont dispersés sur cinq plateformes différentes. L'équipe dev vit sur IRC, le marketing est sur Slack, la communauté open source est sur Matrix, et les utilisateurs finaux traînent sur Discord. Plutôt que de forcer tout le monde à migrer (bonne chance), on fait des ponts. Voici comment.

Pourquoi relier IRC à d'autres plateformes

Le bridging n'est pas un caprice technique. C'est une réponse pragmatique à la fragmentation des messageries. Les cas d'usage concrets :

Communautés open source. Le canal historique est sur IRC (Libera Chat, OFTC). Les nouveaux contributeurs arrivent via Matrix ou Discord. Sans pont, la communauté se scinde et les discussions sont dupliquées.

Équipes mixtes. Les sysadmins sont sur IRC depuis 20 ans. Les nouveaux collègues préfèrent Slack. Un bot relais permet à chacun de rester sur son outil tout en lisant les mêmes conversations.

Notifications cross-plateformes. Votre CI/CD poste sur Slack, mais vos ops surveillent IRC. Un pont permet de recevoir les alertes où vous les attendez.

Le bridging a aussi des limites. La perte de contexte (pas de threads, pas de réactions, pas d'édition de messages), les problèmes de nommage (le pseudo IRC ne correspond pas au nom Slack), et la complexité de maintenance sont des réalités dont il faut avoir conscience avant de se lancer.

Matterbridge : la passerelle universelle

Matterbridge est un binaire Go qui relaie les messages entre une vingtaine de plateformes : IRC, Slack, Discord, Telegram, Matrix, Mattermost, Rocket.Chat, XMPP, Microsoft Teams, et d'autres. C'est le couteau suisse du bridging.

Installation :

# Télécharger le binaire
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

# Ou compiler depuis les sources
git clone https://github.com/42wim/matterbridge.git
cd matterbridge
go build -o matterbridge

La configuration se fait dans un fichier TOML. Exemple d'un pont IRC ↔ Slack ↔ Discord :

# matterbridge.toml

[irc.monreseau]
Server = "irc.example.net:6697"
UseTLS = true
Nick = "bridge-bot"
Password = "sasl_password"

[slack.monworkspace]
Token = "xoxb-xxxxxxxxxxxx-xxxxxxxxxxxx-xxxxxxxxxxxxxxxxxxxxxxxx"

[discord.monserveur]
Token = "NTM0xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
Server = "123456789012345678"  # ID du serveur Discord

[[gateway]]
name = "dev-bridge"
enable = true

  [[gateway.inout]]
  account = "irc.monreseau"
  channel = "#dev"

  [[gateway.inout]]
  account = "slack.monworkspace"
  channel = "dev"

  [[gateway.inout]]
  account = "discord.monserveur"
  channel = "ID:987654321098765432"  # ID du canal Discord

Lancer Matterbridge :

matterbridge -conf matterbridge.toml

Service systemd pour Matterbridge :

[Unit]
Description=Matterbridge relay bot
After=network.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

Matterbridge formate les messages relayés avec un préfixe : [IRC] <Marco> bonjour côté Slack, [Slack] <Alice> salut côté IRC. Ce format est configurable :

[irc.monreseau]
# ...
RemoteNickFormat = "<{NICK}@{PROTOCOL}> "

# Résultat :  salut
Conseil : Matterbridge supporte le mode "ghost" sur certaines plateformes : au lieu d'un seul bot qui relaie avec des préfixes, il crée un utilisateur virtuel par personne. Cela donne une apparence plus naturelle, mais ne fonctionne qu'avec les plateformes qui permettent le multi-utilisateur programmatique (Matrix, Mattermost).

BitlBee : IRC comme interface unifiée

BitlBee prend le problème à l'envers : au lieu de relayer les messages entre plateformes, il présente les autres plateformes comme des canaux IRC. Vous vous connectez à BitlBee avec votre client IRC habituel, et vos contacts Slack, XMPP ou Twitter apparaissent comme des utilisateurs IRC.

# Installation
sudo apt install bitlbee bitlbee-plugin-purple

# BitlBee écoute par défaut sur le port 6667
sudo systemctl enable --now bitlbee

Après connexion depuis votre client IRC, la configuration se fait dans le canal &bitlbee :

# Enregistrer un compte BitlBee
register monmotdepasse

# Ajouter un compte XMPP
account add jabber marco@example.net motdepasse
account jabber on

# Ajouter un compte Slack (via plugin purple)
account add slack-libpurple marco@monworkspace.slack.com
account slack-libpurple set api_token xoxp-xxxxxxxxxxxx
account slack-libpurple on

BitlBee n'est pas un bot relais — c'est une passerelle personnelle. Chaque utilisateur voit ses propres contacts depuis son propre client IRC. Ce n'est pas adapté pour bridger un canal entier entre IRC et Slack ; c'est adapté pour quelqu'un qui veut tout gérer depuis WeeChat ou Irssi.

Les limitations de BitlBee sont réelles : le support des plateformes modernes dépend de plugins libpurple qui ne sont pas toujours maintenus. Le plugin Discord, par exemple, casse régulièrement quand Discord modifie son API. Le plugin Telegram via tdlib fonctionne mieux.

Le pont Matrix-IRC

Matrix et IRC ont une relation spéciale. Le protocole Matrix a été conçu dès le départ avec le bridging IRC en tête. L'écosystème Matrix propose plusieurs ponts IRC :

matrix-appservice-irc — Le pont officiel, géré par la fondation Matrix. C'est celui qui tourne sur matrix.org et qui relie des centaines de canaux Libera Chat à des salons Matrix. Il crée des utilisateurs fantômes des deux côtés.

Heisenbridge — Un pont plus léger, conçu pour l'auto-hébergement. Écrit en Python, il se contrôle via un bot Matrix. Plus simple à configurer que le pont officiel.

# Installation de Heisenbridge
pip install heisenbridge

# Générer la config d'application service
heisenbridge --generate-registration -c heisenbridge.yaml

# Ajouter le fichier de registration à Synapse
# Dans homeserver.yaml :
app_service_config_files:
  - /etc/matrix-synapse/heisenbridge.yaml

# Lancer Heisenbridge
heisenbridge -c heisenbridge.yaml \
  http://localhost:8008  # URL de votre homeserver

Une fois lancé, vous interagissez avec le bot @heisenbridge:votredomaine dans Matrix :

# Ajouter un réseau IRC
!heisenbridge addnetwork libera irc.libera.chat 6697 --tls

# Se connecter
!heisenbridge connect libera

# Joindre un canal (crée un salon Matrix lié)
!heisenbridge join libera #canal

Le pont Matrix-IRC gère les cas suivants : les messages texte, les actions (/me), les changements de topic, les joins/parts. Ce qu'il ne gère pas bien : l'édition de messages (IRC n'a pas cette notion), les threads, les réactions, les uploads de fichiers (dépend de la configuration).

Attention : Le pont officiel matrix-appservice-irc est gourmand en ressources. Pour un déploiement auto-hébergé avec 50+ canaux pontés, prévoyez un serveur avec au moins 2 Go de RAM. Heisenbridge est plus léger mais offre moins de fonctionnalités (pas de portalling automatique).

Cas particulier : IRC ↔ Discord

Discord est la plateforme la plus demandée pour le bridging IRC, et aussi la plus pénible à maintenir. Discord modifie régulièrement son API et ses conditions d'utilisation. Les bots de bridge sont dans une zone grise — Discord ne les interdit pas explicitement, mais ne les encourage pas non plus.

Les options :

Matterbridge (décrit plus haut) — fonctionne bien, un seul bot Discord avec des messages préfixés.

discord-irc — Bot Node.js dédié au bridging IRC ↔ Discord. Plus léger que Matterbridge si vous n'avez besoin que de ce pont spécifique.

# Installation discord-irc
npm install -g discord-irc

# Configuration (config.json)
{
  "nickname": "bridge-bot",
  "server": "irc.example.net",
  "discordToken": "votre_token_discord",
  "channelMapping": {
    "#general": "123456789012345678",
    "#dev": "234567890123456789"
  }
}

# Lancement
discord-irc --config config.json

Le problème récurrent avec les ponts Discord : les noms d'utilisateurs. Sur IRC, les nicks font 9-30 caractères alphanumériques. Sur Discord, les noms d'affichage contiennent des espaces, des caractères spéciaux, des émojis. Le bot de bridge doit translittérer ces noms en nicks IRC valides, ce qui donne parfois des résultats illisibles.

Problèmes courants et solutions

Boucles de messages. Si deux ponts couvrent le même canal par des chemins différents, chaque message est relayé deux fois, puis quatre fois, puis le serveur vous déconnecte pour flood. Vérifiez qu'un seul chemin de relais existe entre deux canaux.

Flood et rate limiting. IRC a des limites de débit strictes. Si un canal Slack actif envoie 20 messages en 10 secondes, le bot IRC sera déconnecté pour Excess Flood. Configurez le rate limiting dans Matterbridge :

[irc.monreseau]
# ...
MessageDelay = 1300    # Millisecondes entre chaque message
MessageQueue = 30      # File d'attente max
MessageLength = 400    # Tronquer les messages longs

Perte de formatage. Le gras, l'italique, le code inline ne se traduisent pas parfaitement entre plateformes. IRC utilise des codes de contrôle (\x02 pour le gras), Slack utilise du Markdown, Discord utilise un Markdown légèrement différent. Matterbridge fait de son mieux pour convertir, mais le résultat n'est pas toujours propre.

Gestion des fichiers. Quelqu'un poste une image sur Slack — que se passe-t-il côté IRC ? Le bot envoie l'URL du fichier. C'est fonctionnel mais pas élégant. Matterbridge peut être configuré pour télécharger les fichiers et les ré-uploader via un service d'hébergement intermédiaire.

Quelle solution choisir

┌──────────────────────┬──────────────────────────────────────┐
│ Besoin               │ Solution recommandée                 │
├──────────────────────┼──────────────────────────────────────┤
│ IRC ↔ Slack/Discord  │ Matterbridge                         │
│ IRC ↔ Matrix         │ Heisenbridge (auto-hébergé)          │
│                      │ matrix-appservice-irc (gros volumes) │
│ Tout depuis IRC      │ BitlBee (usage personnel)            │
│ IRC ↔ Telegram seul  │ Matterbridge ou teleirc              │
│ IRC ↔ 5+ plateformes │ Matterbridge (seul à tout couvrir)   │
└──────────────────────┴──────────────────────────────────────┘

Questions fréquentes

Matterbridge supporte-t-il les messages privés cross-plateformes ?

Non par défaut. Matterbridge relaie les messages de canaux/salons. Les messages privés ne sont pas pontés — c'est un choix de design pour éviter les problèmes de confidentialité. Certains ponts Matrix gèrent les DM cross-protocole, mais la configuration est plus complexe.

Le bot de bridge a-t-il besoin d'être opérateur sur le canal IRC ?

Non, un utilisateur normal suffit pour le relais de messages. Cependant, si vous voulez que le bot relaye les changements de topic ou gère les kicks, des permissions supplémentaires sont nécessaires. Donnez-lui le +o uniquement si ces fonctionnalités sont utiles.

Peut-on bridger un canal IRC chiffré (mode +S) ?

Le mode +S (SSL-only) exige que tous les utilisateurs du canal soient connectés via TLS. Votre bot de bridge doit donc se connecter en TLS — ce qui est de toute façon la bonne pratique. Ce n'est pas un obstacle technique, juste un paramètre de configuration à vérifier.