-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathradicalbot.py
78 lines (57 loc) · 2.48 KB
/
radicalbot.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
# -*- coding: utf-8 -*-
"""RADICAL-Bot for a slack channell.
Returns information about the RADICAL
activities and the RADICAL software stack. """
import os
from slackclient import SlackClient
import time
# starterbot's ID as an environment variable
BOT_ID = os.environ.get("BOT_ID")
# constants
AT_BOT = "<@" + BOT_ID + ">"
EXAMPLE_COMMAND = "do"
# instantiate Slack & Twilio clients
slack_client = SlackClient(os.environ.get('SLACK_BOT_TOKEN'))
# ------------------------------------------------------------------------------
def handle_command(command, channel):
"""Receives commands from a Slack channel.
Commands are directed at the bot and determines if they are valid
commands. If so, then acts on the commands. If not, returns back what it
needs for clarification.
"""
response = "Not sure what you mean. Use the *" + EXAMPLE_COMMAND + \
"* command with numbers, delimited by spaces."
if command.startswith(EXAMPLE_COMMAND):
response = "Sure...write some more code then I can do that!"
slack_client.api_call("chat.postMessage",
channel=channel,
text=response,
as_user=True)
# ------------------------------------------------------------------------------
def parse_slack_output(slack_rtm_output):
"""Parse messages directed to the bot.
The Slack Real Time Messaging API is an events firehose.
this parsing function returns None unless a message is
directed at the Bot, based on its ID.
"""
output_list = slack_rtm_output
if output_list and len(output_list) > 0:
for output in output_list:
if output and 'text' in output and AT_BOT in output['text']:
# return text after the @ mention, whitespace removed
return output['text'].split(AT_BOT)[1].strip().lower(), \
output['channel']
return None, None
# ==============================================================================
if __name__ == "__main__":
# 1 second delay between reading from firehose
READ_WEBSOCKET_DELAY = 1
if slack_client.rtm_connect():
print("StarterBot connected and running!")
while True:
command, channel = parse_slack_output(slack_client.rtm_read())
if command and channel:
handle_command(command, channel)
time.sleep(READ_WEBSOCKET_DELAY)
else:
print("Connection failed. Invalid Slack token or bot ID?")