1
Fork 0
mirror of https://github.com/wlinator/luminara.git synced 2024-10-02 18:03:12 +00:00
Lumi/services/currency_service.py

87 lines
2.5 KiB
Python
Raw Permalink Normal View History

2024-08-28 19:29:30 +00:00
import locale
from db import database
class Currency:
2024-08-29 08:48:14 +00:00
def __init__(self, user_id: int) -> None:
self.user_id: int = user_id
self.balance: int = Currency.fetch_or_create_balance(self.user_id)
2024-08-28 19:29:30 +00:00
2024-08-29 08:48:14 +00:00
def add_balance(self, amount: int) -> None:
2024-08-28 19:29:30 +00:00
self.balance += abs(amount)
2024-08-29 08:48:14 +00:00
def take_balance(self, amount: int) -> None:
2024-08-28 19:29:30 +00:00
self.balance -= abs(amount)
self.balance = max(self.balance, 0)
2024-08-29 08:48:14 +00:00
def push(self) -> None:
query: str = """
2024-08-28 19:29:30 +00:00
UPDATE currency
SET balance = %s
WHERE user_id = %s
"""
database.execute_query(query, (round(self.balance), self.user_id))
@staticmethod
2024-08-29 08:48:14 +00:00
def fetch_or_create_balance(user_id: int) -> int:
query: str = """
2024-08-28 19:29:30 +00:00
SELECT balance
FROM currency
WHERE user_id = %s
"""
try:
2024-08-29 08:48:14 +00:00
balance: int | None = database.select_query_one(query, (user_id,))
2024-08-28 19:29:30 +00:00
except (IndexError, TypeError):
balance = None
# if the user doesn't have a balance yet -> create one
# additionally if for some reason a balance becomes Null
# re-generate the user's balance as fallback.
if balance is None:
query = """
INSERT INTO currency (user_id, balance)
VALUES (%s, 50)
"""
database.execute_query(query, (user_id,))
return 50
return balance
@staticmethod
2024-08-29 08:48:14 +00:00
def load_leaderboard() -> list[tuple[int, int, int]]:
query: str = "SELECT user_id, balance FROM currency ORDER BY balance DESC"
data: list[tuple[int, int]] = database.select_query(query)
2024-08-28 19:29:30 +00:00
return [(row[0], row[1], rank) for rank, row in enumerate(data, start=1)]
@staticmethod
2024-08-29 08:48:14 +00:00
def format(num: int) -> str:
2024-08-28 19:29:30 +00:00
locale.setlocale(locale.LC_ALL, "en_US.UTF-8")
return locale.format_string("%d", num, grouping=True)
@staticmethod
2024-08-29 08:48:14 +00:00
def format_human(num: int) -> str:
num_float: float = float(f"{num:.3g}")
magnitude: int = 0
while abs(num_float) >= 1000:
2024-08-28 19:29:30 +00:00
magnitude += 1
2024-08-29 08:48:14 +00:00
num_float /= 1000.0
suffixes: list[str] = ["", "K", "M", "B", "T", "Q", "Qi", "Sx", "Sp", "Oc", "No", "Dc"]
return f'{f"{num_float:f}".rstrip("0").rstrip(".")}{suffixes[magnitude]}'
2024-08-28 19:29:30 +00:00
# A Thousand = K
# Million = M
# Billion = B
# Trillion = T
# Quadrillion: Q
# Quintillion: Qi
# Sextillion: Sx
# Septillion: Sp
# Octillion: Oc
# Nonillion: No
# Decillion: Dc