A Slack bot written in python that connects via the RTM API.
Python-rtmbot is a callback based bot engine. The plugins architecture should be familiar to anyone with knowledge to the Slack API and Python. The configuration file format is YAML.
Some differences to webhooks:
Download the python-rtmbot code
git clone https://github.com/slackhq/python-rtmbot.git
cd python-rtmbot
Install dependencies (virtualenv is recommended.)
pip install -r requirements.txt
Configure rtmbot (https://api.slack.com/bot-users)
cp docs/example-config/rtmbot.conf .
vi rtmbot.conf
SLACK_TOKEN: "xoxb-11111111111-222222222222222"
Note: At this point rtmbot is ready to run, however no plugins are configured.
Plugins can be installed as .py files in the plugins/
directory OR as a .py file in any first level subdirectory. If your plugin uses multiple source files and libraries, it is recommended that you create a directory. You can install as many plugins as you like, and each will handle every event received by the bot indepentently.
To install the example 'repeat' plugin
mkdir plugins/repeat
cp docs/example-plugins/repeat.py plugins/repeat/
The repeat plugin will now be loaded by the bot on startup.
./rtmbot.py
Plugins are callback based and respond to any event sent via the rtm websocket. To act on an event, create a function definition called process_(api_method) that accepts a single arg. For example, to handle incoming messages:
def process_message(data):
print data
This will print the incoming message json (dict) to the screen where the bot is running.
Plugins having a method defined as catch_all(data)
will receive ALL events from the websocket. This is useful for learning the names of events and debugging.
Note: If you're using Python 2.x, the incoming data should be a unicode string, be careful you don't coerce it into a normal str object as it will cause errors on output. You can add from __future__ import unicode_literals
to your plugin file to avoid this.
Plugins can send messages back to any channel, including direct messages. This is done by appending a two item array to the outputs global array. The first item in the array is the channel ID and the second is the message text. Example that writes "hello world" when the plugin is started:
outputs = []
outputs.append(["C12345667", "hello world"])
Note: you should always create the outputs array at the start of your program, i.e. outputs = []
Plugins can also run methods on a schedule. This allows a plugin to poll for updates or perform housekeeping during its lifetime. This is done by appending a two item array to the crontable array. The first item is the interval in seconds and the second item is the method to run. For example, this will print "hello world" every 10 seconds.
outputs = []
crontable = []
crontable.append([10, "say_hello"])
def say_hello():
outputs.append(["C12345667", "hello world"])
The data within a plugin persists for the life of the rtmbot process. If you need persistent data, you should use something like sqlite or the python pickle libraries.
You can directly call the Slack web API in your plugins by including the following import:
from client import slack_client
You can also rename the client on import so it can be easily referenced like shown below:
from client import slack_client as sc
Direct API calls can be called in your plugins in the following form:
sc.api_call("API.method", "parameters")
Some rtm data should be handled upstream, such as channel and user creation. These should create the proper objects on-the-fly.