Created
October 19, 2016 23:12
-
-
Save fidiego/41230751dd55e09928a1997a6b8501c4 to your computer and use it in GitHub Desktop.
A tornado-based slackbot.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
``` | |
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