2023-06-19 14:20:17 +00:00
|
|
|
import json
|
2023-06-20 12:11:01 +00:00
|
|
|
from datetime import datetime, timedelta
|
|
|
|
|
|
|
|
import pytz
|
2023-06-19 14:20:17 +00:00
|
|
|
|
2024-02-28 13:01:20 +00:00
|
|
|
from services.Currency import Currency
|
2023-06-19 14:20:17 +00:00
|
|
|
from db import database
|
|
|
|
|
2023-06-21 10:19:02 +00:00
|
|
|
with open("config/economy.json") as file:
|
2023-06-19 14:20:17 +00:00
|
|
|
json_data = json.load(file)
|
|
|
|
|
|
|
|
|
|
|
|
class Dailies:
|
2023-06-20 12:11:01 +00:00
|
|
|
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
|
2023-06-20 12:11:01 +00:00
|
|
|
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)
|
2023-06-20 12:11:01 +00:00
|
|
|
|
|
|
|
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.
|
2023-06-21 09:04:31 +00:00
|
|
|
self.claimed_at = datetime.now(tz=self.tz) - timedelta(days=2)
|
2023-06-20 12:11:01 +00:00
|
|
|
|
|
|
|
self.streak = int(data[1])
|
|
|
|
|
|
|
|
def refresh(self):
|
2023-07-12 13:35:24 +00:00
|
|
|
if self.amount == 0:
|
|
|
|
self.amount = json_data["daily_reward"]
|
2023-06-19 14:20:17 +00:00
|
|
|
|
|
|
|
query = """
|
2023-06-20 12:11:01 +00:00
|
|
|
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
|
|
|
"""
|
2023-06-20 12:11:01 +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)
|
|
|
|
cash.add_cash(self.amount)
|
|
|
|
cash.push()
|
|
|
|
|
2023-06-20 12:11:01 +00:00
|
|
|
def can_be_claimed(self):
|
|
|
|
if self.claimed_at is None:
|
|
|
|
return True
|
2023-06-19 14:20:17 +00:00
|
|
|
|
2023-06-20 12:11:01 +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-06-21 09:04:31 +00:00
|
|
|
|
2023-07-12 13:35:24 +00:00
|
|
|
if self.claimed_at < self.reset_time <= self.time_now:
|
2023-06-20 12:11:01 +00:00
|
|
|
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
|
2023-06-20 12:11:01 +00:00
|
|
|
def get_data(user_id):
|
2023-06-19 14:20:17 +00:00
|
|
|
query = """
|
2023-06-20 12:11:01 +00:00
|
|
|
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
|
|
|
)
|
|
|
|
"""
|
|
|
|
|
2023-06-20 12:11:01 +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
|
|
|
|
2023-06-20 12:11:01 +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
|
|
|
|
|