-
Notifications
You must be signed in to change notification settings - Fork 4
/
Copy pathuser_created.py
77 lines (65 loc) · 2.08 KB
/
user_created.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
import datetime
import json
import sys
import time
import ddb
import configuration
import utils
class UserCreated(object):
table_name = "UserCreated"
def __init__(self, fake=False):
self.ddb = ddb.DDB(self.table_name, [('slack_uid', 'S')])
self.table = self.ddb.get_table()
self.users = {}
self.new = []
self.fake = fake
def date(self, ts):
"""
return yyyy-mm-dd for ts
"""
localtime = time.localtime(ts)
return time.strftime("%Y-%m-%d", localtime)
def days(self, ts):
"""
return date difference between today and the ts
"""
then = datetime.datetime.fromtimestamp(ts).date()
now = datetime.date.today()
diff = now - then
return diff.days
def load(self):
"""
Loads the entirety of the table into memory; this is both way faster than
doing per-user gets() and saves us money (since we're using bulk gets)
"""
start = time.time()
for item in self.ddb.items(self.table):
self.users[item['slack_uid']] = item
end = time.time()
diff = end - start
print("Loaded {} table in {:.1f} seconds".format(self.table_name, diff))
def get(self, key):
if key in self.users:
return self.users[key]
response = self.table.get_item(Key={'slack_uid': key})
item = response.get("Item")
if item:
item['ts'] = int(item['ts'])
item['days'] = self.days(item['ts'])
item['date'] = self.date(item['ts'])
self.users[key] = item
return item
def set(self, slack_uid, ts=None):
if not ts:
ts = time.time()
ts = int(ts)
item = self.get(slack_uid)
if item: # We already know about this person -- ignore
return
item = {'slack_uid': slack_uid, 'ts': ts}
self.new.append(item)
def save(self):
with self.table.batch_writer() as batch:
for item in self.new:
batch.put_item(item)
self.new = []