Skip to content

Plugin Basics

Writing plugins for Slack Machine is easy. To show you how easy, we'll build and run a simple plugin from start to finish. To be able to follow this guide, you have to have installed and configured Slack Machine first!

The Base class for plugins

Plugins in Slack Machine are classes that subclass MachineBasePlugin. Inheriting from this class tells Slack Machine that we're dealing with a plugin. But that's not even the most exciting part! With this base class, your plugin immediately has a lot of functionality at its disposal that makes it super easy to do anything from talking to channels, responding to messages, sending DMs, and much more!

The decorators

Being able to talk in Slack is only half the story for plugins. The functions in your plugin have to be triggered somehow. Slack Machine provides decorators for that. You can decorate the functions in your plugin class to tell them what they should react to.

As an example, let's create a cool plugin!

Step 1: Creating the plugin

We're going to create a plugin that listens for The Answer, and responds in kind.

In the root of your bot (where your local_settings.py lives), create a plugins folder. In it, create an __init__.py (so your plugins folder becomes a package) and a file named hitchhikers.py.

Your folder structure should look like this:

├── local_settings.py
└── plugins
    ├── __init__.py
    └── hitchhikers.py

Step 2: Adding the code

First, we should import the MachineBasePlugin in our code, and the decorator to listen for specific messages. Then we can create our plugin class that includes a function that listens for The Answer, and responds to it:

from src.machine.plugins.base import MachineBasePlugin
from src.machine import listen_to
import re


class UltimateQuestionPlugin(MachineBasePlugin):

    @listen_to(regex=r"^42$")
    async def question(self, msg):
        await msg.say("You're telling me the Answer to the Ultimate Question of Life, the Universe and Everything, ",
                      "but I don't know the question :cry:")

Tip

As Slack-Machine is fully built on top of Python's excellent AsyncIO library, all of the functionality that Slack Machine offers (e.g. sending messages, adding reactions etc.) comes in the form of async functions, a.k.a. coroutines. This means that the plugin functions you define, have to be coroutines as well!

This will take a while to get used to, but the reward is that Slack Machine is able to run your plugin functions concurrently.

Step 3: Enabling our plugin

Now we can enable our plugin in our configuration file. Your local_settings.py should look like this:

SLACK_APP_TOKEN = "xapp-my-app-token"
SLACK_BOT_TOKEN = "xoxb-my-bot-token"

PLUGINS = ["machine.plugins.builtin.general.HelloPlugin",
           "machine.plugins.builtin.general.PingPongPlugin",
           "plugins.hitchhikers.UltimateQuestionPlugin"]

Step 4: Run that bot!

To run your bot with the new plugin:

$ slack-machine

That's all there is to it!

Examples

There is an example plugin that shows off many of the features of Slack Machine: Slack Machine Kitchensink Plugin