Skip to content

Commit 817423c

Browse files
authored
Merge pull request #346 from Seluj78/rework/superlikes
Reworked superlikes
2 parents 5de6d70 + 84d176f commit 817423c

File tree

5 files changed

+49
-19
lines changed

5 files changed

+49
-19
lines changed

backend/PyMatcha/models/user.py

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -65,6 +65,8 @@ class User(Model):
6565
confirmed_on = Field(datetime.datetime, fmt="%Y-%m-%d %H:%M:%S")
6666
previous_reset_token = Field(str)
6767
skip_recommendations = Field(bool)
68+
superlikes_counter = Field(int)
69+
superlikes_reset_dt = Field(datetime.datetime, fmt="%Y-%m-%d %H:%M:%S")
6870

6971
@staticmethod
7072
def create(
@@ -86,6 +88,8 @@ def create(
8688
is_confirmed: bool = False,
8789
confirmed_on: datetime.datetime = None,
8890
skip_recommendations: bool = False,
91+
superlikes_counter: int = 5,
92+
superlikes_reset_dt: Optional[datetime.datetime] = None,
8993
) -> User:
9094
# Check email availability
9195
if User.get(email=email):
@@ -140,6 +144,8 @@ def create(
140144
confirmed_on=confirmed_on,
141145
previous_reset_token=None,
142146
skip_recommendations=skip_recommendations,
147+
superlikes_counter=superlikes_counter,
148+
superlikes_reset_dt=superlikes_reset_dt,
143149
)
144150
new_user.save()
145151
logging.debug("New user {} created".format(new_user.email))
@@ -180,6 +186,8 @@ def register(email: str, username: str, password: str, first_name: str, last_nam
180186
confirmed_on=None,
181187
previous_reset_token=None,
182188
skip_recommendations=False,
189+
superlikes_counter=5,
190+
superlikes_reset_dt=None,
183191
)
184192
new_user.save()
185193
logging.debug("New user {} created".format(new_user.email))

backend/PyMatcha/routes/api/like.py

Lines changed: 17 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,10 @@
1+
from datetime import datetime
2+
from datetime import timedelta
3+
14
from flask import Blueprint
25
from flask import request
36
from flask_jwt_extended import current_user
47
from flask_jwt_extended import jwt_required
5-
from PyMatcha import redis
68
from PyMatcha.models.like import Like
79
from PyMatcha.models.match import Match
810
from PyMatcha.models.user import get_user
@@ -11,7 +13,6 @@
1113
from PyMatcha.utils.errors import NotFoundError
1214
from PyMatcha.utils.success import Success
1315
from PyMatcha.utils.success import SuccessOutput
14-
from PyMatcha.utils.tasks import set_user_superlikes
1516

1617
like_bp = Blueprint("like", __name__)
1718

@@ -33,12 +34,21 @@ def like_profile(uid):
3334
raise BadRequestError("You already liked this person.")
3435

3536
if is_superlike:
36-
superlike_counter = int(redis.get(f"superlikes:{current_user.id}"))
37-
if superlike_counter <= 0:
38-
set_user_superlikes.apply_async(current_user.id, amount=5, eta=86400)
39-
raise BadRequestError("No more superlikes today !", "Try later")
37+
if current_user.superlikes_counter <= 0:
38+
if current_user.superlikes_reset_dt < datetime.utcnow():
39+
raise BadRequestError("Your superlikes are being restored, try again in a second")
40+
else:
41+
next_reset_delta = current_user.superlikes_reset_dt - datetime.utcnow()
42+
seconds = next_reset_delta.total_seconds()
43+
hours = int(seconds // 3600)
44+
minutes = int((seconds % 3600) // 60)
45+
seconds = int(seconds % 60)
46+
raise BadRequestError(f"No more superlikes today, come back in {hours}h:{minutes}m:{seconds}s")
4047
else:
41-
redis.decr(f"superlikes:{current_user.id}")
48+
current_user.superlikes_counter -= 1
49+
if current_user.superlikes_counter <= 0:
50+
current_user.superlikes_reset_dt = datetime.utcnow() + timedelta(hours=12)
51+
current_user.save()
4252

4353
Like.create(liker_id=current_user.id, liked_id=u.id, is_superlike=is_superlike)
4454

backend/PyMatcha/utils/tables.py

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -49,7 +49,9 @@ def _create_user_table(db):
4949
is_profile_completed BOOLEAN DEFAULT (FALSE),
5050
is_confirmed BOOLEAN DEFAULT (FALSE),
5151
confirmed_on DATETIME DEFAULT NULL,
52-
skip_recommendations BOOLEAN DEFAULT (FALSE)
52+
skip_recommendations BOOLEAN DEFAULT (FALSE),
53+
superlikes_counter INT DEFAULT 5,
54+
superlikes_reset_dt DATETIME DEFAULT NULL
5355
) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci ;
5456
"""
5557
)

backend/PyMatcha/utils/tasks.py

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@ def setup_periodic_tasks(sender, **kwargs):
2222
sender.add_periodic_task(60, take_users_offline.s(), name="Update online users every minute")
2323
sender.add_periodic_task(3600, update_heat_scores.s(), name="Update heat scores every hour")
2424
sender.add_periodic_task(60, update_user_recommendations.s(), name="Update user recommendations every minute")
25+
sender.add_periodic_task(60, reset_superlikes.s(), name="Update user recommendations every minute")
2526
sender.add_periodic_task(30, take_random_users_online.s(), name="Set 100 random users online every 30 seconds")
2627
sender.add_periodic_task(
2728
600, calc_search_min_max.s(), name="Update Minimum and Maximum scores and ages for search every 10 minutes"
@@ -86,8 +87,15 @@ def update_user_recommendations():
8687

8788

8889
@celery.task
89-
def set_user_superlikes(user_id, amount=5):
90-
redis.set(f"superlikes:{user_id}", amount)
90+
def reset_superlikes():
91+
count = 0
92+
for user in User.select_all():
93+
if user.superlikes_counter <= 0 and user.superlikes_reset_dt <= datetime.datetime.utcnow():
94+
user.superlikes_counter = 5
95+
user.superlikes_reset_dt = None
96+
user.save()
97+
count += 1
98+
return f"Reset superlikes for {count} users"
9199

92100

93101
@celery.task

mysql_dump/users-dump.sql

Lines changed: 11 additions & 9 deletions
Large diffs are not rendered by default.

0 commit comments

Comments
 (0)