In the Digital build team, we have two hours every Wednesday to work on our own personal development. I recently spent a few of these sessions making my own Slackbot.
Slack is a messaging application designed for work teams. We've used it for several years now and found it an extremely useful communication tool – it's a great way to keep everyone in the loop while keeping our email inboxes relatively clear.
A Slackbot is a program that interacts with users through Slack. It can react to user input (like a user saying a certain command) or external input (like a trigger from another website to post a message in Slack).
Slack comes with its own bot, @slackbot, which responds to several default commands and has some customisation options.
Using @slackbot's reminder functionality
Unsurprisingly, lots of other digital services have built their own bots to integrate with Slack. We use these to get notifications in Slack when something important happens, for example, if a team member starts a new story in Pivotal Tracker or a new version of Ruby is released.
This bot notifies everyone in the #beta channel when the Content Publisher deploys
Building my own Slackbot
The content team has written a lot of guidance for our lead publishers, from editorial style to using specific content types in the Content Publisher. We use this guidance a lot ourselves. I decided to create a bot that could make it easier to retrieve this guidance from the comfort of the Slack window.
I built my bot using Ruby. The slack-ruby-bot gem makes it really easy to get a basic bot up and running. After registering the bot with Slack and setting up an API token, I added it to a channel.
The bot responds to anyone who greets it with a cheery "Hi @username!" out of the box, but then it was up to me to add my own functionality.
Setting up a very basic Slackbot command
We've had a lot of raging debates about our editorial style for bulleted lists, so inevitably this was my Slackbot's first new feature:
Not this again...
Getting variables from the user
It's also possible to build more complex features. Slackbots can get variables from user input (regular expressions come in handy here), so I added a feature that lets users request a particular guide.
I created a hash with the names of guides and their URLs. When the bot receives the command, it identifies the term provided by the user and checks the hash to see if there is a corresponding guide. If there is, it posts the URL for the guide in the channel.
Requesting guidance on using images using the command 'rtm' (or 'read the manual')
This might save some time for users, but they still need to leave Slack to read the information. What if we want the bot to provide guidance directly in Slack?
Retrieving information from the web
Our editorial style guide is the longest, most detailed guidance we have for creating content on bath.ac.uk. Sometimes it can take a while to find what we're looking for. What if the bot could do it for us?
We could follow the same format as the guide search feature and just store all the information in the code. But our editorial style guide is constantly evolving, so this could quickly become out of date. And it'd be absolutely massive. It's better to have the bot to search the guide itself directly.
Nokogiri is a Ruby library for parsing HTML and XML documents. It's an incredibly useful tool for searching or processing the content of a webpage. I decided to use Nokogiri to search for and retrieve content in the editorial style guide.
Here's how the feature works:
- A Slack user requests content from the editorial style guide using the command "style guide for [search term]".
- The bot recognises the request and gets the search term.
- The bot uses Nokogiri to get the content of the editorial style guide from the website.
- The bot checks each heading to see if it matches the search term.
- Once a heading matches, the bot collects the content of each subsequent paragraph, heading or list until it reaches a heading that's the same level or higher.
- The bot processes the collected information to format lists and headings.
- Finally, the bot posts the results in the original Slack channel.
If the bot can't find anything, it'll notify the user so they don't have to wait for an answer that isn't coming.
How should we refer to the Chancellor? The bot has the answers
If we're discussing a style question in Slack, the bot can provide the answer to everyone in the channel – hopefully making it easier to settle some debates.
Downsides of Slackbots
The bot should be useful when you want it, but stay out of the way when you don't. Nobody wants a bot which spams the chat with unnecessary messages or notifications.
It's also important to be aware of potential security risks. When you give a Slackbot access to a channel, you're allowing it to potentially access a lot of sensitive information – what everyone is saying, when users are online, or even when they are typing.
I created an entirely separate team just to test my bot in, so it hasn't made it to our actual chat yet. If we do unleash it upon our actual Slack team, we'll definitely need to do some more research into the security aspects first.
Go forth and build bots
While my Slackbot hasn't made it into production use yet, I'm still glad I built it. It was an interesting and fun little project which I hope has the potential to become really useful for our team.
If you use Slack, I'd recommend having a go at making your own bot. There are some powerful tools for building your own bots in your choice of languages – Node.js is especially popular.
If you've built a Slackbot, or have a favourite one that makes your working life much easier, let me know in the comments. I'm looking forward to seeing what everyone's come up with.