-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathmain.py
More file actions
132 lines (107 loc) · 4.53 KB
/
main.py
File metadata and controls
132 lines (107 loc) · 4.53 KB
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
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
import json
import logging
import urllib.request
import os
print('Loading function... ')
logger = logging.getLogger()
logger.setLevel(logging.INFO)
def event_to_dict(event):
if 'body' in event:
body = json.loads(event.get('body'))
return body
elif 'token' in event:
body = event
return body
else:
logger.error('unexpected event format')
exit
class ChallangeJson(object):
def data(self, key):
return {
'isBase64Encoded': 'true',
'statusCode': 200,
'headers': {},
'body': key
}
class PostData(object):
def __init__(self):
self.BOT_TOKEN = os.environ['BOT_TOKEN']
self.OAUTH_TOKEN = os.environ['OAUTH_TOKEN']
def headers(self):
return {
'Content-Type': 'application/json; charset=UTF-8',
'Authorization': 'Bearer {0}'.format(self.BOT_TOKEN)
}
def data(self, channel,ts,emoji):
return {
'token': self.OAUTH_TOKEN,
'channel': channel,
'timestamp': ts,
'name': emoji
}
def handler(event, context):
#getenv
HOOK_REACTIONS = os.environ['HOOK_REACTIONS']
BOT_USER = os.environ['BOT_USER']
# Output the received event to the log
logging.info(json.dumps(event))
body = event_to_dict(event)
# return if it was challange-event
if 'challenge' in body:
challenge_key = body.get('challenge')
logging.info('return challenge key %s:', challenge_key)
return ChallangeJson().data(challenge_key)
# define reaction
emojis = HOOK_REACTIONS.split(',')
if body.get('event').get('reaction') in emojis:
logger.info('hit: %s', body.get('event').get('reaction'))
postdata = PostData()
# added 1st reaction
if body.get('event').get('type') == 'reaction_added':
# 1st emoji has added
if body.get('event').get('reaction') == emojis[0] and body.get(
'event').get('user', '') != BOT_USER:
logger.info('1st emoji has added, set 2nd emoji: %s', emojis[1])
post_head = postdata.headers()
post_data = postdata.data(body.get('event').get('item').get('channel'),body.get('event').get('item').get('ts'),emojis[1])
# the 2nd and the subsequent emoji has added
if body.get('event').get('reaction') in emojis and body.get(
'event').get('reaction') != emojis[0] and body.get(
'event').get('user', '') == BOT_USER:
logger.info('the 2nd and the subsequent emoji has added')
last_count = len(emojis) - 1
this_count = emojis.index(body.get('event').get('reaction'))
if (this_count != last_count):
logger.info('bot will add: %s', emojis[this_count + 1])
post_head = postdata.headers()
post_data = postdata.data(body.get('event').get('item').get('channel'),body.get('event').get('item').get('ts'),emojis[this_count + 1])
print(json.dumps(post_head))
print(json.dumps(post_data))
url = 'https://slack.com/api/reactions.add'
req = urllib.request.Request(
url,
data=json.dumps(post_data).encode('utf-8'),
method='POST',
headers=post_head)
res = urllib.request.urlopen(req)
logger.info('post result: %s', res.msg)
# 1st emoji has removed
elif body.get('event').get('type') == 'reaction_removed' and body.get(
'event').get('reaction') in emojis[0]:
logger.info('1st emoji has removed')
url = 'https://slack.com/api/reactions.remove'
for emoji in emojis:
logger.info('remove: %s', emoji)
post_head = postdata.headers()
post_data = postdata.data(body.get('event').get('item').get('channel'),body.get('event').get('item').get('ts'),emoji)
print(json.dumps(post_head))
print(json.dumps(post_data))
req = urllib.request.Request(
url,
data=json.dumps(post_data).encode('utf-8'),
method='POST',
headers=post_head)
res = urllib.request.urlopen(req)
logger.info('post result: %s', res.msg)
return {'statusCode': 200, 'body': 'ok'}
return {'statusCode': 200, 'body': 'quit'}