Biboumi

XMPP is a great protocol, and poezio is (of course) the best XMPP client. But I sometimes still need to join IRC channels.

I didn’t want to maintain two different software configurations (poezio and weechat) and have different features to remember on each of them, so I wanted to join IRC channels using a XMPP gateway. For a long time I struggled to find a working IRC gateway with all the features I wanted. I tried a lot of them, but never found what I wanted. They all had one of these problems:

  • No (or poor) IRC mode changes notifications: if you’re not aware that the mode +m has just been set on the channel or that you’ve just been banned, and you continue talking, and the gateway doesn’t even notify you that your messages are not being sent to other participants, that is a really broken gateway.

  • No way to set IRC modes: IRC modes is a quite unique feature, and is not really translatable into XMPP. So, most of the gateway only let you change the participants’ roles and affiliations (admin, moderator, member, etc), but not much more. What if you want to set the mode “+j 3:5” on the #foobar channel? With most gateways you just cannot.

  • Poor nickname handling. IRC servers lets you use only some of the ascii characters in your nickname, while on XMPP you can use pretty much any (with a few exceptions) unicode character in your nickname. When you try to set a forbidden nickname, the IRC server refuses and sends you an error message. With some gateways the nickname you see in your XMPP client is not the same you actually have on the IRC server, leading to a lot of confusion when people try to mention your nick (for example if you believe you are louiz’ but people on IRC see you as louiz_). In addition to that, your nickname is unique per IRC server. This means that if you change your nickname in a room, the gateway should notify or your nick change on all the rooms of that channel.

  • No conversion from IRC formatting into XHTML-im

  • Various bugs. The most annoying: receiving the participants’ presences in the wrong order (as defined in the MUC XEP, 0045).

Biboumi

That’s why I decided to code my own gateway: biboumi.

The version 1.1 has just been released, it is at a point where I don’t ever need an IRC client, because biboumi does everything I need.

Feature-wise, it has everything I wanted:

  • Verbose notifications about what is going on the IRC side of the connection. No more “oh, I was disconnected from that server and I didn’t know about it…?”, and no more “I asked to join that room and I didn’t receive any response yet, is it trying to connect, or has it failed?”.

  • A complete support of IRC modes. You get a message notification in the room whenever a mode is changed, even if that mode has absolutely no equivalent in the XMPP protocol. You are also able to change the modes by sending a message that starts with /mode. No “All this time I was banned and I didn’t know about it… now I understand why nobody responds to my messages…”

  • Smart private messages. You can query anybody on an IRC server by sending a message to user!irc.example.com@biboumi.example.com, but also to #foo%irc.example.com@irc.example.com/user, which is what your XMPP client will do when you try to send a message to “user” in the room “#foo”. And biboumi will remember what JID you used to talk to “user”, and when he/she responds, the message will come from the JID you just sent your message to.

  • IRC formatting to XHTML-IM: you can see (but not yet send) colors in messages.

  • TLS support. Biboumi tries to connect to IRC using TLS encryption. However, there is no way yet to check the certificate, force encryption (it will fallback to plain connection if the TLS connection fails), so this is not really secure yet.

  • Encoding handling. Biboumi will checks that every message received from IRC is correct UTF-8, and if it is not, it will try to convert from iso_8859-1 to UTF-8 (because this is the most common case I encountered). In future version it will be possible to configure an outgoing and incoming encoding for each IRC channel.

  • Basic Ad-Hoc commands support. The admin can list the users connected to his/her biboumi instance, and disconnect one (or more) of them only by using its XMPP client.

It tries to be lightweight, remain simple and have as little dependencies as possible: it can work with only libuuid and expat (which are probably already installed on your system). However, it requires a “recent” version of gcc (4.9), because it is developed in C++14.

If you want to test it, download the latest version on biboumi.louiz.org and install it. If you have any problem, or idea, or feature request, please come and ask on the biboumi MUC room biboumi@muc.poez.io. Also don’t hesitate to report bugs, view the roadmap for the 2.0 version or even contribute (you can ask for help about how the biboumi’s code is architectured, or any basic programming question if you don’t have a good programming level yet; I’ll be very glad to help).