Skip to content

Instantly share code, notes, and snippets.

@fidiego
Created October 19, 2016 23:12
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save fidiego/41230751dd55e09928a1997a6b8501c4 to your computer and use it in GitHub Desktop.
Save fidiego/41230751dd55e09928a1997a6b8501c4 to your computer and use it in GitHub Desktop.
A tornado-based slackbot.
```
Tornado-based slack client inspired by the full stack python version:
https://www.fullstackpython.com/blog/build-first-slack-bot-python.html
Polls the rtm_stream every second w/ a periodic callback
```
import logging
import os
import time
import tornado.options
import tornado.gen
import tornado.ioloop
from slackclient import SlackClient
BOT_NAME = os.env('BOT_NAME')
BOT_ID = os.env('bot_id')
AT_BOT = '<@{}>'.format(BOT_ID)
slack_client = SlackClient(os.env('BOT_TOKEN'))
@tornado.gen.coroutine
def handle_message(user, message, team=None, channel=None):
logging.info('handling message - from {}: {}'.format(user, message))
return 'Success or something'
@tornado.gen.coroutine
def handle_events(events):
for event in events:
if event['type'] == 'message':
logging.debug('Handling message: {}'.format(event))
message = event['text'].split(AT_BOT)[1].strip()
handle_message(event['user'], message, channel=event.get('channel'), team=event.get('team'))
def get_relevant_events(slack_rtm_output):
events = slack_rtm_output
relevant_events = []
for event in events:
if event and 'text' in event.keys() and AT_BOT in event['text']:
relevant_events.append(event)
return relevant_events
@tornado.gen.coroutine
def process_rtm_output():
rtm_output = slack_client.rtm_read()
relevant_events = get_relevant_events(rtm_output)
if relevant_events:
yield handle_events(relevant_events)
elif int(time.time()) % 15 == 0:
logging.debug('No relevant messages on this poll')
if __name__ == '__main__':
tornado.options.parse_command_line()
logging.info('Starting bot - {}:{}.'.format(BOT_NAME, BOT_ID))
read_websocket_delay = 1 # we'll be polling once a second
if slack_client.rtm_connect():
tornado.ioloop.PeriodicCallback(
process_rtm_output,
read_websocket_delay * 1000
).start()
tornado.ioloop.IOLoop.current().start()
else:
logging.error('Connection Failed: Check slack token and bot ID.')
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment