-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathcommandHandlers.py
More file actions
196 lines (159 loc) · 5.6 KB
/
commandHandlers.py
File metadata and controls
196 lines (159 loc) · 5.6 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
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
# Command handlers
# Nicolas Luce - 03/2017
import operator, pprint, pymongo
from helpers import *
from messages import messages
from database import db
global main_db
global saved_date
def formated_message(msg_key, **kwargs):
if msg_key == 'no-points-left' and kwargs['points_left'] == 0:
msg_key = 'zero-points-to-give'
if 'points_received' in kwargs:
kwargs['plural_p_r'] = "" if kwargs['points_received'] == 1 else "s"
if 'points_left' in kwargs:
kwargs['plural_p_l'] = "" if kwargs['points_left'] == 1 else "s"
return messages[msg_key].format(**kwargs)
def on_user_joins(bot, msg):
if ('new_chat_member' in msg and
'username' in msg['new_chat_member'] and
msg['new_chat_member']['username'] == bot.getMe()['username']):
command_start(bot, msg)
return True
return False
def on_user_lefts(bot, msg):
if ('left_chat_member' in msg and
'username' in msg['left_chat_member'] and
msg['left_chat_member']['username'] == bot.getMe()['username']):
main_db.delete_documents({'group_id':msg['chat']['id']})
return True
return False
def is_user_on_group(group_id, user_id):
doc = main_db.get_document(
{'$and':[
{'user_id':user_id},
{'group_id':group_id}
]}
)
return (doc != None)
def commandHandler(bot, msg, command, parameters= None):
if bot.getMe()['username'] in command: command = command.split('@' + bot.getMe()['username'])[0]
if command == '/start': command_start(bot, msg)
elif command == '/signup': command_signup(bot, msg)
elif command == '/mypoints': command_mypoints(bot, msg)
elif command == '/top5': command_top5(bot, msg)
elif command == '/help': command_start(bot, msg)
elif command == '/info': command_start(bot, msg)
elif command == '/bottom5': command_bottom5(bot, msg)
return
def command_start(bot, msg):
if is_private(msg):
bot.sendMessage(msg['chat']['id'], messages['welcome'], reply_to_message_id=msg['message_id'])
else:
bot.sendMessage(msg['chat']['id'], messages['welcome'], reply_to_message_id=msg['message_id'])
return
def command_signup(bot, msg):
if not is_private(msg):
group_id = msg['chat']['id']
user_id = msg['from']['id']
if not is_user_on_group(group_id, user_id):
print 'is on group'
name = msg['from']['first_name']
if 'last_name' in msg['from']:
name += ' ' + msg['from']['last_name']
new_post = {
'group_id':group_id,
'user_id':user_id,
'points_received':0,
'points_left':10,
'user_name':name
}
main_db.insert_document(new_post)
bot.sendMessage(user_id, messages['sign-up'].format(user_name=msg['from']['first_name'], group_name=msg['chat']['title']))
else:
return
def command_mypoints(bot, msg):
if not is_private(msg):
group_id = msg['chat']['id']
user_id = msg['from']['id']
if is_user_on_group(group_id, user_id):
doc = main_db.get_document(
{'$and':[
{'group_id':group_id},
{'user_id':user_id}
]})
points_received = doc['points_received']
points_left = doc['points_left']
form_msg = formated_message('my-points',**{'points_received':points_received, 'points_left':points_left})
bot.sendMessage(group_id, form_msg, reply_to_message_id=msg['message_id'])
else:
return
def command_top5(bot, msg):
if not is_private(msg):
group_id = msg['chat']['id']
top5 = main_db.find_documents({'group_id':group_id}).sort('points_received', pymongo.DESCENDING)
message = "Top 5:\n"
for member in top5[:5]:
message += member['user_name'] + ': ' + str(member['points_received']) + '\n'
bot.sendMessage(group_id, message)
def command_bottom5(bot, msg):
if not is_private(msg):
group_id = msg['chat']['id']
bottom5 = main_db.find_documents({'group_id':group_id}).sort('points_received', pymongo.ASCENDING)
message = "Bottom 5:\n"
for member in bottom5[:5]:
message += member['user_name'] + ': ' + str(member['points_received']) + '\n'
bot.sendMessage(group_id, message)
def addPoints(bot, msg, points, sender, receiver):
group_id = msg['chat']['id']
if (is_user_on_group(group_id, sender) and
is_user_on_group(group_id, receiver) and
sender != receiver):
sender_points_left = main_db.get_document(
{'$and':[
{'group_id':group_id},
{'user_id':sender}
]})['points_left']
if abs(points) <= sender_points_left:
receiver_points_received = main_db.get_document(
{'$and':[
{'group_id':group_id},
{'user_id':receiver}
]})['points_received']
receiver_points_received += points
sender_points_left -= abs(points)
main_db.update_post(
{'$and':[
{'group_id':group_id},
{'user_id':receiver}
]},
'points_received', receiver_points_received)
main_db.update_post(
{'$and':[
{'group_id':group_id},
{'user_id':sender}
]},
'points_left', sender_points_left)
# bot.sendMessage(group_id, messages['points-received'].format(user_name=msg['reply_to_message']['from']['first_name'], points_received=receiver_points_received))
else:
form_msg = formated_message('no-points-left', **{'points_left':sender_points_left})
bot.sendMessage(group_id, form_msg, reply_to_message_id=msg['message_id'])
else:
# if (is_user_on_group(group_id, sender) and
# not is_user_on_group(group_id, receiver)):
# # bot.sendMessage(group_id, "That user has not sign up.")
print "USER NOT SIGNED UP"
return
def reset_points(bot, msg):
docs = main_db.find_documents()
groups = set()
for group in docs:
if 'points_left' in group:
main_db.update_post(
{'$and':[
{'group_id':group['group_id']},
{'user_id':group['user_id']}
]}, 'points_left', 10)
groups.add(group['group_id'])
for group_id in groups:
bot.sendMessage(group_id, "Points restarted.")