|
1 | 1 | import datetime |
2 | 2 | import json |
3 | | -import logging |
4 | 3 | from math import ceil |
5 | 4 |
|
6 | 5 | from PyMatcha import celery |
|
20 | 19 |
|
21 | 20 | @celery.on_after_configure.connect |
22 | 21 | def setup_periodic_tasks(sender, **kwargs): |
23 | | - sender.add_periodic_task(60, update_offline_users.s(), name="Update online users every minute") |
| 22 | + sender.add_periodic_task(60, take_users_offline.s(), name="Update online users every minute") |
24 | 23 | sender.add_periodic_task(3600, update_heat_scores.s(), name="Update heat scores every hour") |
25 | 24 | sender.add_periodic_task(60, update_user_recommendations.s(), name="Update user recommendations every minute") |
26 | 25 | sender.add_periodic_task(30, take_random_users_online.s(), name="Set 100 random users online every 30 seconds") |
@@ -61,47 +60,19 @@ def update_heat_scores(): |
61 | 60 |
|
62 | 61 |
|
63 | 62 | @celery.task |
64 | | -def update_offline_users(): |
65 | | - logging.debug("Updating offline users") |
66 | | - # Get the last login deadline |
67 | | - login_deadline_timestamp = float(datetime.datetime.utcnow().timestamp()) - 120 |
68 | | - count = 0 |
69 | | - online_count = 0 |
70 | | - offline_count = 0 |
71 | | - # For all user keys |
72 | | - for key in redis.scan_iter("online_user:*"): |
73 | | - # Get the user id |
74 | | - user_id = str(key).split(":")[1] |
75 | | - date_lastseen = float(redis.get(key)) |
76 | | - # If the user has passed the deadline |
77 | | - if date_lastseen < login_deadline_timestamp: |
78 | | - u = User.get(id=user_id) |
79 | | - if u: |
80 | | - u.date_lastseen = datetime.datetime.fromtimestamp(date_lastseen) |
81 | | - u.is_online = False |
82 | | - u.save() |
83 | | - offline_count += 1 |
84 | | - # delete the key in redis, setting the user as offline in redis |
85 | | - redis.delete(key) |
86 | | - count += 1 |
| 63 | +def take_users_offline(): |
| 64 | + went_offline_count = 0 |
| 65 | + stayed_online_count = 0 |
| 66 | + for user in User.get_multis(is_online=True): |
| 67 | + if user.date_lastseen + datetime.timedelta(minutes=2) < datetime.datetime.utcnow(): |
| 68 | + user.is_online = False |
| 69 | + user.save() |
| 70 | + went_offline_count += 1 |
87 | 71 | else: |
88 | | - u = User.get(id=user_id) |
89 | | - if not u: |
90 | | - # Edge case where the user has been deleted from DB while he was still online |
91 | | - redis.delete(key) |
92 | | - else: |
93 | | - u.date_lastseen = datetime.datetime.fromtimestamp(date_lastseen) |
94 | | - u.is_online = True |
95 | | - u.save() |
96 | | - online_count += 1 |
97 | | - count += 1 |
98 | | - logging.debug( |
99 | | - "Updated online status for {} users. {} passed offline and {} passed or stayed online.".format( |
100 | | - count, offline_count, online_count |
101 | | - ) |
102 | | - ) |
103 | | - return "Updated online status for {} users. {} passed offline and {} passed or stayed online.".format( |
104 | | - count, offline_count, online_count |
| 72 | + stayed_online_count += 1 |
| 73 | + return ( |
| 74 | + f"{stayed_online_count} stayed online and " |
| 75 | + f"{went_offline_count} went offline for {went_offline_count + stayed_online_count} users" |
105 | 76 | ) |
106 | 77 |
|
107 | 78 |
|
|
0 commit comments