-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathslackbot.py
107 lines (94 loc) · 3.91 KB
/
slackbot.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
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
import os
import time
import requests
import json
import urllib.request
from slackclient import SlackClient
#Lookup für Bot ID und so
BOT_NAME = 'servitor'
SLACK_BOT_TOKEN = 'xoxb-84060539537-XXXXXXXXXXXXXXXXXXXXXX'
#instanziiere Slack
slack_client = SlackClient(SLACK_BOT_TOKEN)
if __name__ == "__main__":
api_call = slack_client.api_call("users.list")
if api_call.get('ok'):
# retrieve all users so we can find our bot
users = api_call.get('members')
for user in users:
if 'name' in user and user.get('name') == BOT_NAME:
BOT_ID=user.get('id')
print("Die Bot ID für '" + user['name'] + "' ist " + user.get('id'))
#constants
AT_BOT = "<@" + BOT_ID + ">"
EXAMPLE_COMMAND = "tu"
WETTER = "wetter"
CLOCK = "uhr"
CITY = "Wiesbaden"
client = SlackClient(SLACK_BOT_TOKEN)
#Funktionen zum parsen von Slack output und den handle commands und so
def handle_command(command, channel):
"""
Empfängt Befehle für den Bot und ermittelt, ob sie valide sind, den rest kannst du dir wahrscheinlich denken
"""
response="Wat meinste? Nimm den *" + EXAMPLE_COMMAND + "* Befehl, du Spasti"
if command.startswith(EXAMPLE_COMMAND):
response="Alles klar, da fehlt aber noch ein bissl code, meinste nicht auch?"
slack_client.api_call("chat.postMessage", channel=channel,
text=response, as_user=True)
if WETTER in command:
#Wetterversuch, mal schauen was drauss wirt
openweather_api='442c26ca8ed7eec9212e6beb25720d27'
print(command)
#teile den input in die einzelnen worte
split=command.split()
for x in split:
CITY=x
#strip wetter
if CITY=='wetter':
print('wetter, aber das bleibt unter uns ;)')
else:
print('Wetter für ' + CITY)
line=urllib.request.urlopen('http://api.openweathermap.org/data/2.5/forecast/city?q=' + CITY +',de&APPID=442c26ca8ed7eec9212e6beb25720d27').read()
jdata=json.loads(line.decode('utf-8'))
if 'error' in jdata:
print('FEHLER! FEHLER! FEHLER!')
else:
#hier werden die einzelnen dinge die einen interessieren aus dem
#riesigen json extrahiert, und im anschluss dargestellt.
Main_Weather=jdata["list"][0]["weather"]
Weather=Main_Weather[0]["description"]
Wind=jdata["list"][0]["wind"]
Speed=Wind["speed"]
Angle=Wind["deg"]
Main_Temp=jdata["list"][0]["main"]
Temp=Main_Temp["temp"]
Temp_C=int(Temp)-275.13
Pressure=jdata["list"][0]["clouds"]
i=('In ' + str.capitalize(CITY)+ ', there\'s ' + str(Weather) + ' at ' + str(Temp) + 'K (' + str(Temp_C) + '°C) with a windspeed of ' + str(Speed) + 'km/h coming from ' + str(Angle) + '°N.')
slack_client.api_call("chat.postMessage", channel=channel, text=i, as_user=True)
if CLOCK in command:
i=time.strftime("It's %A, the %d of %B %Y, %H:%M:%S ", time.localtime())
slack_client.api_call("chat.postMessage", channel=channel, text=i, as_user=True)
print('Uhrzeit')
def parse_slack_output(slack_rtm_output):
"""
Die Slack Real Time Messaging API ist ein wahrer Feuerwehrschlauch der Ereignisse, diese Parsing Funktion antwortet nur, wenn die Nachricht an den BOT gewandt ist, in Abhängigkeit von seiner 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']:
#gibt den text nach dem @ aus, ohne leerzeichen
return output['text'].split(AT_BOT)[1].strip().lower(), output ['channel']
return None, None
if __name__=="__main__":
READ_WEBSOCKET_DELAY=0.1 #1 Sekunde delay
if slack_client.rtm_connect():
print("SlackBot verbunden und am RENNEN!")
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("Verbindung fehlgeschlagen, da stimmt am end was mit dem TOKEN oder der ID nicht :(")