b3b16fdc by Barry

Added msg functionality.

1 parent 90ce5a8e
1 {"Rui": {"Everybody": {"delivery_time": "2015/12/04 00:00:00", "message": "You are a faggot", "channel": "47934985176354816"}}}
...\ No newline at end of file ...\ No newline at end of file
...@@ -2,11 +2,15 @@ import requests ...@@ -2,11 +2,15 @@ import requests
2 import discord 2 import discord
3 import random 3 import random
4 import datetime 4 import datetime
5 from dateutil.parser import parse
5 6
7 from discord.object import Object
6 from ago import human 8 from ago import human
7 import simplejson as json 9 import simplejson as json
10 from collections import defaultdict
8 11
9 member_status = 'members.json' 12 member_status = 'members.json'
13 deliveries_file = 'deliveries.json'
10 fortune_file = 'fortunes.json' 14 fortune_file = 'fortunes.json'
11 games_file = 'games.json' 15 games_file = 'games.json'
12 credentials = 'creds.json' 16 credentials = 'creds.json'
...@@ -17,6 +21,12 @@ json_data=open(credentials).read() ...@@ -17,6 +21,12 @@ json_data=open(credentials).read()
17 creds = json.loads(json_data) 21 creds = json.loads(json_data)
18 client.login(creds['username'], creds['password']) 22 client.login(creds['username'], creds['password'])
19 23
24 def leaders(xs, top=20):
25 counts = defaultdict(int)
26 for x in xs:
27 counts[x] += 1
28 return sorted(counts.items(), reverse=True, key=lambda tup: tup[1])[:top]
29
20 def byteify(input): 30 def byteify(input):
21 if isinstance(input, dict): 31 if isinstance(input, dict):
22 return {byteify(key):byteify(value) for key,value in input.iteritems()} 32 return {byteify(key):byteify(value) for key,value in input.iteritems()}
...@@ -27,6 +37,9 @@ def byteify(input): ...@@ -27,6 +37,9 @@ def byteify(input):
27 else: 37 else:
28 return input 38 return input
29 39
40 @client.event
41 def on_socket_raw_send(payload, binary=False):
42 check_msg_queue()
30 43
31 @client.event 44 @client.event
32 def on_status(member): 45 def on_status(member):
...@@ -40,6 +53,8 @@ def on_status(member): ...@@ -40,6 +53,8 @@ def on_status(member):
40 data = {} 53 data = {}
41 try: 54 try:
42 username = member.name.lower() 55 username = member.name.lower()
56 user_id = member.id
57 mention = member.mention()
43 if username in data: 58 if username in data:
44 is_afk = data[username]['is_afk'] 59 is_afk = data[username]['is_afk']
45 afk_at = data[username]['afk_at'] 60 afk_at = data[username]['afk_at']
...@@ -70,6 +85,8 @@ def on_status(member): ...@@ -70,6 +85,8 @@ def on_status(member):
70 if game_id not in games_played: 85 if game_id not in games_played:
71 games_played.append(game_id) 86 games_played.append(game_id)
72 data[username] = { 87 data[username] = {
88 'id': user_id,
89 'mention': mention,
73 'is_afk': is_afk, 90 'is_afk': is_afk,
74 'afk_at': afk_at, 91 'afk_at': afk_at,
75 'status': status, 92 'status': status,
...@@ -97,6 +114,60 @@ def get_game_names(game_id_list): ...@@ -97,6 +114,60 @@ def get_game_names(game_id_list):
97 result.append(game['name']) 114 result.append(game['name'])
98 return result 115 return result
99 116
117 def get_mention_status(mention):
118 try:
119 json_data=open(member_status).read()
120 data = json.loads(json_data)
121 except ValueError:
122 data = {}
123 if not data:
124 data = {}
125 for user in data:
126 if 'mention' in data[user]:
127 if data[user]['mention'] == mention:
128 return data[user]
129 return None
130
131 def check_msg_queue():
132 print("checking messages")
133 try:
134 json_data=open(deliveries_file).read()
135 data = json.loads(json_data)
136 except ValueError:
137 data = {}
138 if not data:
139 data = {}
140 print("Data: %s" % data)
141 new_data = {}
142 for username in data:
143 for author in data[username]:
144 print("Message: %s" % data[username][author])
145 delivery = datetime.datetime.strptime(data[username][author]['delivery_time'], '%Y/%m/%d %H:%M:%S')
146 if delivery <= datetime.datetime.now():
147 offline = False
148 for member in client.get_all_members():
149 print('MEMBER MENTION: %s USERNAME: %s' % (member.mention(), username))
150
151 if username == member.mention():
152 if member.status != 'online':
153 print('OFFLINE USER, TRY AGAIN LATER')
154 offline = True
155 break
156 if offline:
157 break
158 channel = Object(data[username][author]['channel'])
159 message = data[username][author]['message']
160 client.send_message(channel, '{}, {} asked me to tell you "{}"'.format(username, author, message))
161 else:
162 new_data[username] = {}
163 new_data[username][author] = data[username][author]
164
165 jdata = json.dumps(new_data, ensure_ascii=False)
166 print("New Data: %s" % new_data)
167 open(deliveries_file, 'wb+').write(jdata.encode('utf8'))
168 return
169
170
100 @client.event 171 @client.event
101 def on_message(message): 172 def on_message(message):
102 print message.content 173 print message.content
...@@ -114,7 +185,20 @@ def on_message(message): ...@@ -114,7 +185,20 @@ def on_message(message):
114 185
115 186
116 if message.content.startswith('!help') or message.content.startswith('!commands'): 187 if message.content.startswith('!help') or message.content.startswith('!commands'):
117 client.send_message(message.channel, '{} Available Commands:\nYou can ask compound or questions and I will choose. Example: HellsBot Rui is a Faggot or Rui is a faggot?\n!games <username> - Returns a list of games played\n!lastseen <username> - Returns info on when the user was last seen and their status\n!addfortune <fortune>\n!fortune\n!secret\n!bemyirlwaifu'.format(message.author.mention())) 188 client.send_message(message.channel,
189 """{} Available Commands:
190 You can ask compound or questions and I will choose. Example: HellsBot Rui is a Faggot or Rui is a faggot?
191 !msg <username> in 5 minutes Tea is ready
192 !msg <username> in 45 seconds Your finished masterbating
193 !msg <username> in 2 hours The movie is over
194 !msg <username> on 12/22/2015 Happy Birthday!
195 !games <username> - Returns a list of games played for a username.
196 !gameslist - Returns a list of the top 20 games and the number of people who have played that game.
197 !lastseen <username> - Returns info on when the user was last seen and their status.
198 !addfortune <fortune> - Adds a new fortune.
199 !fortune - Returns your fortune
200 !secret
201 !bemyirlwaifu""".format(message.author.mention()))
118 return 202 return
119 203
120 if message.content.startswith('!lastseen'): 204 if message.content.startswith('!lastseen'):
...@@ -145,6 +229,33 @@ def on_message(message): ...@@ -145,6 +229,33 @@ def on_message(message):
145 else: 229 else:
146 client.send_message(message.channel, 'I don\'t have any data on {} yet {}'.format(username, message.author.mention())) 230 client.send_message(message.channel, 'I don\'t have any data on {} yet {}'.format(username, message.author.mention()))
147 231
232 if message.content.startswith('!gameslist'):
233 data = None
234 try:
235 json_data=open(member_status).read()
236 data = json.loads(json_data)
237 except ValueError:
238 pass
239 if not data:
240 client.send_message(message.channel, 'I am a bit confused right now.. maybe I need more data. {}!'.format(message.author.mention()))
241 else:
242 game_list = []
243 for user in data:
244 if 'games_played' in data[user]:
245 print('%s' % data[user])
246
247 game_list += data[user]['games_played']
248 print('%s' % game_list)
249 games_sorted = leaders(get_game_names(game_list))
250 print('%s' % games_sorted)
251 out_string = ''
252 for game in games_sorted:
253 #print('%s' % game)
254 out_string += ' {} - {}\n'.format(game[1], game[0])
255
256 client.send_message(message.channel, 'The games I have seen people playing are: \n{}'.format(out_string))
257 return
258
148 if message.content.startswith('!games'): 259 if message.content.startswith('!games'):
149 data = None 260 data = None
150 try: 261 try:
...@@ -161,6 +272,76 @@ def on_message(message): ...@@ -161,6 +272,76 @@ def on_message(message):
161 client.send_message(message.channel, 'I have seen {} playing: {}'.format(username, games)) 272 client.send_message(message.channel, 'I have seen {} playing: {}'.format(username, games))
162 else: 273 else:
163 client.send_message(message.channel, 'I don\'t have any data on {} yet {}'.format(username, message.author.mention())) 274 client.send_message(message.channel, 'I don\'t have any data on {} yet {}'.format(username, message.author.mention()))
275 return
276
277 # !msg joe in 5 minutes YOU ARE A DICK
278 if message.content.startswith('!msg'):
279 try:
280 json_data=open(deliveries_file).read()
281 data = json.loads(json_data)
282 except ValueError:
283 data = {}
284 if not data:
285 data = {}
286 channel = message.channel
287 author = message.author
288 #author = message.author.name
289 username = ''
290 try:
291 message_bits = message.content.split(" ")
292 msg_datetime = datetime.datetime.now()
293 msg_idx = 2
294 if message_bits[2] == 'in' and message_bits[3].isdigit():
295 time = int(message_bits[3])
296 msg_idx = 4
297 if message_bits[4].startswith('sec'):
298 msg_datetime = msg_datetime + datetime.timedelta(seconds=time)
299 msg_idx = 5
300 elif message_bits[4].startswith('hour'):
301 msg_datetime = msg_datetime + datetime.timedelta(hours=time)
302 msg_idx = 5
303 else: # minutes by default
304 msg_datetime = msg_datetime + datetime.timedelta(minutes=time)
305 msg_idx = 5
306 elif message_bits[2] == 'on':
307 try:
308 tmp_date = parse(message_bits[3])
309 msg_datetime = tmp_date
310 msg_idx = 4
311 except ValueError:
312 client.send_message(channel, 'Your shitty message has been rejected {}. Next time learn how to date...MM\\DD\\YYYY'.format(message.author.mention()))
313 return
314
315 username = message_bits[1]
316 user_mention = ''
317 for member in client.get_all_members():
318 print("MEMBER: %s" % member)
319 if username.lower() == member.name.lower():
320 user_mention = member.mention()
321 user_id = member.id
322 if user_mention == '':
323 client.send_message(channel, 'Your shitty message has been rejected {}. That user does not exist.'.format(message.author.name))
324 return
325
326 msg_text = byteify(' '.join(message_bits[msg_idx:]))
327 message = {'user_id': user_id, 'channel': channel.id, 'delivery_time': msg_datetime.strftime('%Y/%m/%d %H:%M:%S'), 'message': msg_text}
328 print("Message: %s" % message)
329 data[user_mention] = {}
330 data[user_mention][author.mention()] = message
331 jdata = json.dumps(data, ensure_ascii=False)
332 print("Data: %s" % data)
333 #test_ch = Object(channel.id)
334 #client.send_message(test_ch, 'Test Message {}.'.format(author))
335 except Exception as e:
336 client.send_message(channel, 'Your shitty message has been rejected {}. {}'.format(author.name, e))
337 return
338 open(deliveries_file, 'wb+').write(jdata.encode('utf8'))
339 if msg_datetime < datetime.datetime.now():
340 client.send_message(channel, '{} your message will be delivered to {} as soon as they are available.'.format(author.name, user_mention))
341 else:
342 client.send_message(channel, '{} your message will be delivered to {} {}.'.format(author.name, user_mention, human(msg_datetime)))
343 check_msg_queue()
344 return
164 345
165 if message.content.startswith('!addfortune'): 346 if message.content.startswith('!addfortune'):
166 try: 347 try:
...@@ -178,7 +359,8 @@ def on_message(message): ...@@ -178,7 +359,8 @@ def on_message(message):
178 return 359 return
179 360
180 open(fortune_file, 'wb+').write(jdata.encode('utf8')) 361 open(fortune_file, 'wb+').write(jdata.encode('utf8'))
181 client.send_message(message.channel, 'Your shitty fortune has been added {}.'.format(message.author.mention())) 362 client.send_message(message.channel, 'Your shitty fortune has been added {}.'.format(message.author.mention()))
363
182 if message.content.startswith('!fortune'): 364 if message.content.startswith('!fortune'):
183 data = None 365 data = None
184 try: 366 try:
...@@ -192,7 +374,7 @@ def on_message(message): ...@@ -192,7 +374,7 @@ def on_message(message):
192 client.send_message(message.channel, '{} Your fortune is... {}'.format(message.author.mention(), random.choice(data).encode('utf-8',errors='ignore'))) 374 client.send_message(message.channel, '{} Your fortune is... {}'.format(message.author.mention(), random.choice(data).encode('utf-8',errors='ignore')))
193 375
194 if message.content.startswith('!secret'): 376 if message.content.startswith('!secret'):
195 client.send_message(message.channel, 'git gud {}!'.format(message.author.mention())) 377 client.send_message(message.channel, 'git gud {}! My source is here: http://git.savsoul.com/barry/discordbot'.format(message.author.mention()))
196 378
197 if message.content.startswith('!bemyirlwaifu'): 379 if message.content.startswith('!bemyirlwaifu'):
198 client.send_message(message.channel, 'http://orig13.deviantart.net/b25e/f/2014/175/3/d/no_waifu_no_laifu_by_imtheonenexttome-d7nsx3b.gif {}!'.format(message.author.mention())) 380 client.send_message(message.channel, 'http://orig13.deviantart.net/b25e/f/2014/175/3/d/no_waifu_no_laifu_by_imtheonenexttome-d7nsx3b.gif {}!'.format(message.author.mention()))
......
1 {"zan": {"status": "idle", "is_afk": true, "status_change_at": "2015/12/03 02:06:08", "prev_status": "online", "games_played": [], "game_id": null, "afk_at": "2015/12/03 02:06:08"}, "solidsteak": {"status": "idle", "is_afk": true, "status_change_at": "2015/12/03 02:43:24", "prev_status": "online", "games_played": [248, null], "game_id": null, "afk_at": "2015/12/03 02:43:24"}, "sheik": {"status": "idle", "is_afk": true, "status_change_at": "2015/12/02 22:02:12", "prev_status": "online", "games_played": [283, null], "game_id": null, "afk_at": "2015/12/02 22:02:12"}, "rae": {"status": "idle", "is_afk": true, "status_change_at": "2015/12/03 00:51:10", "prev_status": "online", "games_played": [], "game_id": null, "afk_at": "2015/12/03 00:51:10"}, "marion": {"status": "offline", "is_afk": false, "status_change_at": "2015/12/03 01:45:24", "prev_status": "online", "games_played": [1, null], "game_id": null, "afk_at": "2015/12/02 08:30:16"}, "shyrith": {"status": "online", "is_afk": false, "status_change_at": "2015/12/02 21:56:19", "prev_status": "idle", "games_played": [1, 644], "game_id": 644, "afk_at": "2015/12/02 21:54:35"}, "rui": {"status": "online", "is_afk": false, "status_change_at": "2015/12/03 01:46:23", "prev_status": "idle", "games_played": [], "game_id": null, "afk_at": "2015/12/03 01:35:09"}, "goshzilla": {"status": "online", "is_afk": false, "status_change_at": "2015/12/03 01:52:54", "prev_status": "idle", "games_played": [3, null], "game_id": null, "afk_at": "2015/12/03 01:50:54"}, "scoops": {"status": "online", "is_afk": false, "status_change_at": "2015/12/03 01:50:36", "prev_status": "offline", "games_played": [347, null, 0], "game_id": 0, "afk_at": "2015/12/02 08:26:41"}, "arka": {"status": "online", "is_afk": false, "status_change_at": "2015/12/03 02:21:16", "prev_status": "offline", "games_played": [1, null], "game_id": 1, "afk_at": "2015/12/03 01:04:59"}, "wriggle": {"status": "offline", "is_afk": false, "status_change_at": "2015/12/03 00:23:48", "prev_status": "online", "games_played": [], "game_id": null, "afk_at": "2015/12/02 15:37:49"}, "tim": {"status": "offline", "is_afk": false, "status_change_at": "2015/12/02 09:53:25", "prev_status": "online", "games_played": [], "game_id": null, "afk_at": "2015/12/02 09:23:29"}, "charisma": {"status": "online", "is_afk": false, "status_change_at": "2015/12/03 00:31:10", "prev_status": "idle", "games_played": [313], "game_id": 313, "afk_at": "2015/12/03 00:08:06"}, "sig": {"status": "idle", "is_afk": true, "status_change_at": "2015/12/03 02:37:00", "prev_status": "online", "games_played": [8, null, 7], "game_id": null, "afk_at": "2015/12/03 02:37:00"}, "mr. nelson": {"status": "idle", "is_afk": true, "status_change_at": "2015/12/03 02:18:48", "prev_status": "online", "games_played": [], "game_id": null, "afk_at": "2015/12/03 02:18:48"}, "skeletonhorn": {"status": "online", "is_afk": false, "status_change_at": "2015/12/03 00:36:39", "prev_status": "offline", "games_played": [], "game_id": null, "afk_at": "2015/12/03 00:36:39"}, "azia": {"status": "idle", "is_afk": true, "status_change_at": "2015/12/03 02:17:32", "prev_status": "online", "games_played": [], "game_id": null, "afk_at": "2015/12/03 02:17:32"}, "projectaria": {"status": "online", "is_afk": false, "status_change_at": "2015/12/02 23:06:07", "prev_status": "idle", "games_played": [1, null], "game_id": null, "afk_at": "2015/12/02 22:31:46"}, "moss": {"status": "online", "is_afk": false, "status_change_at": "2015/12/02 21:56:26", "prev_status": "idle", "games_played": [0, null], "game_id": 0, "afk_at": "2015/12/02 21:53:22"}, "yobi": {"status": "online", "is_afk": false, "status_change_at": "2015/12/03 01:27:37", "prev_status": "idle", "games_played": [3], "game_id": 3, "afk_at": "2015/12/03 01:18:27"}, "salt": {"status": "online", "is_afk": false, "status_change_at": "2015/12/03 00:55:01", "prev_status": "idle", "games_played": [466, 8, null, 680], "game_id": null, "afk_at": "2015/12/03 00:54:11"}, "grey": {"status": "online", "is_afk": false, "status_change_at": "2015/12/02 20:32:11", "prev_status": "idle", "games_played": [550, null, 1], "game_id": 1, "afk_at": "2015/12/02 20:31:15"}, "hellsbreath": {"status": "online", "is_afk": false, "status_change_at": "2015/12/03 02:05:59", "prev_status": "idle", "games_played": [326, null, 660, 680], "game_id": null, "afk_at": "2015/12/02 22:37:41"}, "green": {"status": "online", "is_afk": false, "status_change_at": "2015/12/02 20:04:13", "prev_status": "offline", "games_played": [4], "game_id": 4, "afk_at": "2015/12/02 09:36:27"}, "xorfos": {"status": "idle", "is_afk": true, "status_change_at": "2015/12/03 02:46:27", "prev_status": "online", "games_played": [], "game_id": null, "afk_at": "2015/12/03 02:46:27"}, "richter": {"status": "offline", "is_afk": false, "status_change_at": "2015/12/03 02:24:25", "prev_status": "online", "games_played": [], "game_id": null, "afk_at": "2015/12/02 20:18:33"}, "cae": {"status": "online", "is_afk": false, "status_change_at": "2015/12/02 23:07:33", "prev_status": "idle", "games_played": [], "game_id": null, "afk_at": "2015/12/02 23:06:53"}}
...\ No newline at end of file ...\ No newline at end of file
1 {"zan": {"status": "idle", "is_afk": true, "status_change_at": "2015/12/03 08:48:38", "prev_status": "online", "games_played": [], "game_id": null, "afk_at": "2015/12/03 08:48:38"}, "solidsteak": {"status": "idle", "is_afk": true, "status_change_at": "2015/12/03 06:54:57", "prev_status": "online", "games_played": [248, null], "game_id": null, "afk_at": "2015/12/03 06:54:57"}, "apple": {"status": "online", "is_afk": false, "status_change_at": "2015/12/03 07:23:35", "prev_status": "offline", "games_played": [1], "game_id": 1, "afk_at": "2015/12/03 07:23:35"}, "sheik": {"status": "idle", "is_afk": true, "status_change_at": "2015/12/03 05:57:13", "prev_status": "online", "games_played": [283, null], "game_id": null, "afk_at": "2015/12/03 05:57:13"}, "rae": {"status": "idle", "is_afk": true, "status_change_at": "2015/12/03 00:51:10", "prev_status": "online", "games_played": [], "game_id": null, "afk_at": "2015/12/03 00:51:10"}, "marion": {"status": "offline", "is_afk": false, "status_change_at": "2015/12/03 05:14:48", "prev_status": "online", "games_played": [1, null], "game_id": null, "afk_at": "2015/12/02 08:30:16"}, "shyrith": {"status": "offline", "is_afk": false, "status_change_at": "2015/12/03 08:10:52", "prev_status": "online", "games_played": [1, 644, null], "game_id": null, "afk_at": "2015/12/02 21:54:35"}, "rui": {"status": "online", "is_afk": false, "status_change_at": "2015/12/03 04:15:47", "prev_status": "offline", "games_played": [], "game_id": null, "afk_at": "2015/12/03 03:48:05"}, "goshzilla": {"status": "online", "is_afk": false, "status_change_at": "2015/12/03 08:55:14", "prev_status": "idle", "games_played": [3, null], "game_id": null, "afk_at": "2015/12/03 08:51:54"}, "scoops": {"status": "online", "is_afk": false, "status_change_at": "2015/12/03 01:50:36", "prev_status": "offline", "games_played": [347, null, 0], "game_id": null, "afk_at": "2015/12/02 08:26:41"}, "arka": {"status": "offline", "is_afk": false, "status_change_at": "2015/12/03 08:41:53", "prev_status": "online", "games_played": [1, null, 313], "game_id": null, "afk_at": "2015/12/03 01:04:59"}, "wriggle": {"status": "offline", "is_afk": false, "status_change_at": "2015/12/03 00:23:48", "prev_status": "online", "games_played": [], "game_id": null, "afk_at": "2015/12/02 15:37:49"}, "tim": {"status": "online", "is_afk": false, "status_change_at": "2015/12/03 07:56:42", "prev_status": "idle", "games_played": [], "game_id": null, "afk_at": "2015/12/03 07:37:21"}, "charisma": {"status": "online", "is_afk": false, "status_change_at": "2015/12/03 00:31:10", "prev_status": "idle", "games_played": [313, null], "game_id": null, "afk_at": "2015/12/03 00:08:06"}, "sig": {"status": "offline", "is_afk": false, "status_change_at": "2015/12/03 09:09:59", "mention": "<@104055037243707392>", "prev_status": "online", "game_id": null, "games_played": [8, null, 7, 466], "afk_at": "2015/12/03 05:32:12", "id": "104055037243707392"}, "mr. nelson": {"status": "online", "is_afk": false, "status_change_at": "2015/12/03 07:26:31", "prev_status": "idle", "games_played": [], "game_id": null, "afk_at": "2015/12/03 07:14:03"}, "skeletonhorn": {"status": "online", "is_afk": false, "status_change_at": "2015/12/03 00:36:39", "prev_status": "offline", "games_played": [], "game_id": null, "afk_at": "2015/12/03 00:36:39"}, "azia": {"status": "online", "is_afk": false, "status_change_at": "2015/12/03 09:05:37", "mention": "<@121404665727418368>", "prev_status": "idle", "game_id": null, "games_played": [], "afk_at": "2015/12/03 02:17:32", "id": "121404665727418368"}, "projectaria": {"status": "online", "is_afk": false, "status_change_at": "2015/12/03 09:09:11", "mention": "<@48146724769763328>", "prev_status": "idle", "games_played": [1, null], "game_id": null, "afk_at": "2015/12/03 09:08:48", "id": "48146724769763328"}, "moss": {"status": "idle", "is_afk": true, "status_change_at": "2015/12/03 07:54:49", "prev_status": "online", "games_played": [0, null, 1], "game_id": null, "afk_at": "2015/12/03 07:54:49"}, "yobi": {"status": "idle", "is_afk": true, "status_change_at": "2015/12/03 08:53:52", "prev_status": "online", "games_played": [3], "game_id": 3, "afk_at": "2015/12/03 08:53:52"}, "salt": {"status": "online", "is_afk": false, "status_change_at": "2015/12/03 00:55:01", "mention": "<@48140539459010560>", "prev_status": "idle", "games_played": [466, 8, null, 680], "game_id": null, "afk_at": "2015/12/03 00:54:11", "id": "48140539459010560"}, "grey": {"status": "idle", "mention": "<@48120346410221568>", "is_afk": true, "games_played": [550, null, 1], "game_id": 1, "afk_at": "2015/12/03 09:13:13", "status_change_at": "2015/12/03 09:13:13", "id": "48120346410221568", "prev_status": "online"}, "hellsbreath": {"status": "online", "is_afk": false, "status_change_at": "2015/12/03 08:59:43", "mention": "<@78767557628133376>", "prev_status": "offline", "games_played": [326, null, 660, 680], "game_id": null, "afk_at": "2015/12/03 04:34:54", "id": "78767557628133376"}, "green": {"status": "online", "is_afk": false, "status_change_at": "2015/12/03 08:47:15", "prev_status": "offline", "games_played": [4, null], "game_id": null, "afk_at": "2015/12/03 07:45:29"}, "xorfos": {"status": "idle", "is_afk": true, "status_change_at": "2015/12/03 03:16:08", "prev_status": "online", "games_played": [], "game_id": null, "afk_at": "2015/12/03 03:16:08"}, "richter": {"status": "offline", "is_afk": false, "status_change_at": "2015/12/03 02:24:25", "prev_status": "online", "games_played": [], "game_id": null, "afk_at": "2015/12/02 20:18:33"}, "cae": {"status": "idle", "is_afk": true, "status_change_at": "2015/12/03 08:27:14", "prev_status": "online", "games_played": [], "game_id": null, "afk_at": "2015/12/03 08:27:14"}}
...\ No newline at end of file ...\ No newline at end of file
......