-
Notifications
You must be signed in to change notification settings - Fork 0
/
application.py
262 lines (183 loc) · 6.94 KB
/
application.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
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
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
from flask import Flask, request, json
from oauth2client import client
import redis
import os
application = Flask(__name__)
host_redis = os.environ.get('HOST_REDIS', 'redis')
redis = redis.Redis(host=host_redis, decode_responses=True)
def _help():
"""Send help text to Hangouts Chat."""
text = """
```
Usage: @bot [command] (message)
*Commands*:
add Adds specified users to notify list | To add yourself use key 'myself'
list Lists users on notify list
remove Removes specified users from notify list | To remove yourself use key 'myself'
help This help
> Obs: All commands are optional
*Examples*:
@bot add myself @Fulano <= Will add yourself and @Fulano in list.
@bot this a messge test <= Send 'this a messge test' to all list.
@bot remove myself @Fulano <= Remove yourself and @fulano from list.
```
"""
return text
def validate_token():
# Bearer Tokens received by bots will always specify this issuer.
CHAT_ISSUER = 'chat@system.gserviceaccount.com'
# Url to obtain the public certificate for the issuer.
PUBLIC_CERT_URL_PREFIX = 'https://www.googleapis.com/service_accounts/v1/metadata/x509/'
# Intended audience of the token, which will be the project number of the bot.
#Go to -> https://console.developers.google.com/iam-admin/settings?authuser=1&organizationId=$ORGANIZATIONID&project=$PROJECT_NAME
PROJECT_NUMBER = ['']
# Authorization HTTP header.
BEARER_TOKEN = request.headers['Authorization'].split()[1]
for project_number in PROJECT_NUMBER:
try:
# Verify valid token, signed by CHAT_ISSUER, intended for a third party.
token = client.verify_id_token(
BEARER_TOKEN, project_number, cert_uri=PUBLIC_CERT_URL_PREFIX + CHAT_ISSUER)
break
except Exception as err:
print(f'->> {err}')
pass
try:
if token['iss'] != CHAT_ISSUER:
return 1, 'Invalid issuee, please contact administrator.'
else:
return 0, 'Ok'
except:
return 1, 'Invalid token, please contact administrator.'
def send_msg(texto, room_name):
"""Send message to Hangouts Chat."""
members = redis.smembers(room_name)
if str(members) == 'set()':
text = '```There are no users in the list, please add with add command. For help type help.```'
return text
else:
user = texto['message']['sender']['displayName']
remove_botname = texto['message']['text'].split()[0]
message = texto['message']['text'].replace(remove_botname,'')
text = '%s: \n%s\n\n\n/cc %s ' % (user, message, ','.join(members))
return text
def _list(room_name):
"""Send list of members to Hangouts Chat."""
members = redis.smembers(room_name)
if str(members) == 'set()':
text = '```Users in list: none```'
return text
text = 'Users in list: %s ' % ','.join(members)
return text
def _add(users, room_name):
"""Add members in list and send to Hangouts Chat."""
global users_added
users_added = []
try:
for word in users['message']['text'].split():
if word == 'myself':
user = users['message']['sender']['name']
check_result = redis.sadd(room_name, "<" + user + ">")
if check_result == 1:
users_added.append("<" + user + ">")
else:
users_added.append('Already added ->> ' + "<" + user + ">")
check_continue = 1
text = '```User added: %s ```' % (','.join(users_added))
for _item in range(len(users['message']['text'].split())):
_item = _item + 1
try:
_type = users['message']['annotations'][_item]['userMention']['user']['type']
user = users['message']['annotations'][_item]['userMention']['user']['name']
if _type == 'BOT':
if check_continue == 1:
continue
else:
text = 'Please add user with @'
continue
user = users['message']['annotations'][_item]['userMention']['user']['name']
check_result = redis.sadd(room_name, "<" + user + ">")
except:
pass
if check_result == 1:
users_added.append("<" + user + ">")
else:
users_added.append("Already added ->> " + "<" + user + ">")
text = "```Added users: %s ```" % (','.join(list(set(users_added))))
return text
except:
text = 'Please add user with @'
return text
def _remove(users, room_name):
"""Remove users from list and send to Hangouts Chat."""
global users_removed
users_removed = []
try:
for word in users['message']['text'].split():
if word == 'myself':
user = users['message']['sender']['name']
check_result = redis.srem(room_name, "<" + user + ">")
if check_result == 1:
users_removed.append("<" + user + ">")
else:
users_removed.append('Not found ->> ' + "<" + user + ">")
check_continue = 1
text = '```User removed: %s ```' % (','.join(users_removed))
for _item in range(len(users['message']['text'].split())):
_item = _item + 1
try:
_type = users['message']['annotations'][_item]['userMention']['user']['type']
user = users['message']['annotations'][_item]['userMention']['user']['name']
if _type == 'BOT':
if check_continue == 1:
continue
else:
text = 'Please add user with @'
continue
user = users['message']['annotations'][_item]['userMention']['user']['name']
check_result = redis.srem(room_name, "<" + user + ">")
except:
pass
if check_result == 1:
users_removed.append("<" + user + ">")
else:
users_removed.append("Not found ->> " + "<" + user + ">")
text = "```Removed users: %s ```" % (','.join(list(set(users_removed))))
return text
except:
text = 'Please add user with @'
return text
@application.route('/', methods=['POST'])
def on_event():
"""Handler for events from Hangouts Chat."""
event = request.get_json()
token_status, token_text = validate_token()
if token_status != 0:
return json.jsonify({'text': token_text})
if event['type'] == 'ADDED_TO_SPACE' and event['space']['type'] == 'ROOM':
text = 'Thanks for adding me to "%s"! For help type @bot help' % event['space']['displayName']
elif event['type'] == 'MESSAGE':
room_name = event['space']['name'].split('/')[1]
commands = ['list', 'add', 'remove', 'help']
try:
param = event['message']['text'].split()[1:][0]
except:
text = _help()
return json.jsonify({'text': text})
if param in commands:
if param == 'list':
text = _list(room_name)
elif param == 'add':
text = _add(event, room_name)
elif param == 'remove':
text = _remove(event, room_name)
elif param == 'help':
text = _help()
return json.jsonify({'text': text})
else:
text = send_msg(event, room_name)
else:
return
return json.jsonify({'text': text})
if __name__ == '__main__':
application.run(host='0.0.0.0')