Using Matrix to connect to Slack from an IRC client on Ubuntu
June 08, 2018 [Tech]Update: I found a better solution using slirc.
I like using HexChat to talk to my colleagues, like one other guy. It is fast, and it pops up a new window when someone sends me a direct/private message.
Recently, Slack shut down their IRC gateway, forcing me to use their slow UI, and making me unable to be responsive to direct messages without spending my entire life checking said UI, or being disturbed by notifications.
So, I decided to set up a Matrix bridge, because how hard can it be?
My system is Ubuntu MATE 18.04.
What I did
Install Synapse
Install Synapse, a Matrix homeserver.
wget -qO - https://matrix.org/packages/debian/repo-key.asc | sudo apt-key add - sudo apt-add-repository http://matrix.org/packages/debian/ sudo apt update sudo apt install matrix-synapse
Edit /etc/matrix-synapse/homeserver.yaml to change the line containing "registration_shared_secret" to look something like:
registration_shared_secret: "some secret password you made up"
(Replacing "some secret password you made up" with something secret.)
Make a new user:
register_new_matrix_user -c /etc/matrix-synapse/homeserver.yaml http://localhost:8008
Enter a username and password, and take a note of them.
Install Riot
(Technically, this step is optional, but I definitely recommend it to check everything is working.)
Install Riot, a client that can talk to a homeserver.
curl https://riot.im/packages/debian/repo-key.asc | sudo apt-key add - sudo apt-add-repository https://riot.im/packages/debian/ sudo apt update sudo apt install riot-web
Start Riot from the menu or by typing riot-web in a console.
Choose to log in to a Custom Server (not create a new user), and enter the Home Server URL as http://localhost:8008, leave the Identity Server URL as it is, and enter the username and password you entered in the previous step.
Riot should be able to connect to the Synapse server, even though it won't have any rooms in it yet.
If this doesn't work, try running riot-web in a console, and check the Synapse log file at /var/log/matrix-synapse/homeserver.log
Install matrix-puppet-slack
(Note: after this step, the homeserver can only be for you now, because it is logged into Slack as you. If you want to make a new Matrix server for lots of people, I found that matrix-appservice-slack works, but this only connects channels, not direct messages.)
Get a Slack legacy token which matrix-puppet-slack will use to connect to Slack as you. Follow the instructions given at that link, and you should end up with a token that looks something like "abcd-123456768-ETC-ETC". Keep a note of it.
Install matrix-puppet-slack which allows you to connect a homeserver to a Slack instance, pretending it is you:
cd git clone https://github.com/matrix-hacks/matrix-puppet-slack.git cd matrix-puppet-slack/ npm install cp config.sample.json config.json
Edit config.json so it looks something like this:
{ "slack": [{ "team_name": "Name of my team", "user_access_token": "abcd-123456768-ETC-ETC" }], "registrationPath": "slack-registration.yaml", "port": 8090, "bridge": { "homeserverUrl":"http://localhost:8008", "domain": "localhost", "registration": "slack-registration.yaml" } }
Now generate a config file that Synapse will use, called slack-registration.yaml, by typing this command (still in the matrix-puppet-slack directory):
node index.js -r -u "http://localhost:8090"
When asked, type in the username and password you entered in the first step (when you ran the register_new_matrix_user command).
This creates a config file telling Synapse that matrix-puppet-slack is running on the local machine on port 8090.
Now, run it:
node index.js
and edit Synapse's config file /etc/matrix-synapse/homeserver.yaml to point at the new config file you just made, by editing the line mentioning app_service_config_files so that it looks like this:
app_service_config_files: [ "/path/to/matrix-puppet-slack/slack-registration.yaml" ]
Make sure you replace "/path/to/matrix-puppet-slack" in the above with the directory where you put matrix-puppet-slack, which is /home/yourusername/matrix-puppet-slack if you followed the instructions exactly.
Restart Synapse, and when you go back into Riot, you should see your Slack channels appear gradually (as people talk in them):
sudo service matrix-synapse restart
If not, check the output from the node index.js command, and the Synapse log file at /var/log/matrix-synapse/homeserver.log.
Install matrix-ircd
To allow connecting to Matrix from an IRC client, install matrix-ircd:
cd git clone https://github.com/matrix-org/matrix-ircd.git cd matrix-ircd cargo build cargo run -- --url "http://localhost:8008"
(Note this works on Ubuntu 18.04, but operating systems with older versions of Rust may need to get the latest first - see the matrix-ircd page for details.)
Connect from an IRC client
Now use an IRC client to connect to matrix-ird. I recommend HexChat if you're looking for one.
matrix-ircd runs on port 5999 by default, so you should be able to connect to it from your IRC client by setting the server to localhost/5999 and using the username and password from the first step (when you ran the register_new_matrix_user command). Use plain username/password authentication.
If it works, you should see your Slack channels appear in your IRC client. If not check the logs mentioned before, and the error messages and logs from your IRC client.
What works and doesn't work
- Messages typed by me and others into IRC, Riot and Slack appear in all the other places, including direct messages.
- Synapse and Riot are installed fully, so Synapse will be running after a reboot, and Riot is available in the menus, but matrix-puppet-slack and matrix-ircd are just running in a console, and have to be manually started. It should be reasonably simple to make custom systemd files to start them automatically.
- matrix-puppet-slack crashed once and I had to restart it, so this may not be very reliable. I logged an issue.
- The Slack channel names look terrible in my IRC client. I think matrix-ircd needs to find the pretty names (which are displayed correctly in Riot) and use them instead of the coded names used under the cover in Matrix.
- My first ever direct message to someone does not work, even though I can choose them and attempt to send a message. As soon as they say something to me, they appear as a channel in Riot and IRC, and I can talk back and forth no problem from then on.
- Direct messages look like normal channels in Matrix, which means I can't use HexChat to pop up notifications for them, so this was all pointless.
Please leave comments below if you know how I can fix any of these problems.
Conclusions
- Matrix seems really cool
- It is basically possible to bridge IRC-Matrix-Slack as I wanted
- But, some remaining bugs mean I have to keep using Slack's UI for now :-(
- Please comment telling me how to do this better