1
Fork 0
mirror of https://github.com/wlinator/luminara.git synced 2024-10-02 22:23:13 +00:00
Lumi/services/daily_service.py

114 lines
3.3 KiB
Python
Raw Normal View History

from datetime import datetime, timedelta
import pytz
2023-06-19 14:20:17 +00:00
from config.parser import JsonCache
2024-03-29 17:17:51 +00:00
from db import database
2024-06-20 10:34:03 +00:00
from services.currency_service import Currency
2023-06-19 14:20:17 +00:00
resources = JsonCache.read_json("resources")
2023-06-19 14:20:17 +00:00
class Dailies:
def __init__(self, user_id):
2023-06-19 14:20:17 +00:00
self.user_id = user_id
2023-07-12 13:35:24 +00:00
self.amount = 0
self.tz = pytz.timezone('US/Eastern')
2023-07-12 13:35:24 +00:00
self.time_now = datetime.now(tz=self.tz)
self.reset_time = self.time_now.replace(hour=7, minute=0, second=0, microsecond=0)
data = Dailies.get_data(user_id)
if data[0] is not None:
self.claimed_at = datetime.fromisoformat(data[0])
else:
# set date as yesterday to pretend as a valid claimed_at.
self.claimed_at = datetime.now(tz=self.tz) - timedelta(days=2)
self.streak = int(data[1])
def refresh(self):
2023-07-12 13:35:24 +00:00
if self.amount == 0:
self.amount = resources["daily_reward"]
2023-06-19 14:20:17 +00:00
query = """
INSERT INTO dailies (user_id, amount, claimed_at, streak)
2023-10-23 12:49:46 +00:00
VALUES (%s, %s, %s, %s)
2023-06-19 14:20:17 +00:00
"""
values = (self.user_id, self.amount, self.claimed_at, self.streak)
database.execute_query(query, values)
2023-06-19 14:20:17 +00:00
2023-06-20 19:44:22 +00:00
cash = Currency(self.user_id)
2024-03-14 20:30:58 +00:00
cash.add_balance(self.amount)
2023-06-20 19:44:22 +00:00
cash.push()
def can_be_claimed(self):
if self.claimed_at is None:
return True
2023-06-19 14:20:17 +00:00
else:
2023-07-12 13:35:24 +00:00
if self.time_now < self.reset_time:
self.reset_time -= timedelta(days=1)
2023-07-12 13:35:24 +00:00
if self.claimed_at < self.reset_time <= self.time_now:
return True
return False
def streak_check(self):
2023-07-27 09:50:14 +00:00
"""
Three checks are performed, only one has to return True.
1. the daily was claimed yesterday
2. the daily was claimed the day before yesterday (users no longer lose their dailies as fast)
3. the daily was claimed today but before the reset time (see __init__)
:return:
"""
check_1 = self.claimed_at.date() == (self.time_now - timedelta(days=1)).date()
check_2 = self.claimed_at.date() == (self.time_now - timedelta(days=2)).date()
check_3 = self.claimed_at.date() == self.time_now.date() and self.claimed_at < self.reset_time
2023-07-12 13:35:24 +00:00
2023-07-27 09:50:14 +00:00
return check_1 or check_2 or check_3
2023-06-19 14:20:17 +00:00
@staticmethod
def get_data(user_id):
2023-06-19 14:20:17 +00:00
query = """
SELECT claimed_at, streak
FROM dailies
2023-06-19 14:20:17 +00:00
WHERE id = (
SELECT MAX(id)
FROM dailies
2023-10-23 12:49:46 +00:00
WHERE user_id = %s
2023-06-19 14:20:17 +00:00
)
"""
try:
(claimed_at, streak) = database.select_query(query, (user_id,))[0]
except (IndexError, TypeError):
(claimed_at, streak) = None, 0
2023-06-19 14:20:17 +00:00
return claimed_at, streak
2023-10-27 13:18:59 +00:00
@staticmethod
def load_leaderboard():
query = """
SELECT user_id, MAX(streak), claimed_at
FROM dailies
GROUP BY user_id
ORDER BY MAX(streak) DESC;
"""
data = database.select_query(query)
leaderboard = []
rank = 1
for row in data:
row_user_id = row[0]
streak = row[1]
claimed_at = row[2]
leaderboard.append((row_user_id, streak, claimed_at, rank))
rank += 1
return leaderboard