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

93 lines
2.4 KiB
Python
Raw Normal View History

2023-07-18 19:00:21 +00:00
import locale
2023-06-19 14:20:17 +00:00
from db import database
class Currency:
def __init__(self, user_id):
self.user_id = user_id
2024-03-14 20:30:58 +00:00
self.balance = Currency.fetch_or_create_balance(self.user_id)
2023-06-19 14:20:17 +00:00
2024-03-14 20:30:58 +00:00
def add_balance(self, amount):
self.balance += abs(amount)
2023-06-19 14:20:17 +00:00
2024-03-14 20:30:58 +00:00
def take_balance(self, amount):
self.balance -= abs(amount)
2023-06-19 14:20:17 +00:00
2024-03-14 20:30:58 +00:00
if self.balance < 0:
self.balance = 0
2023-06-19 14:20:17 +00:00
def push(self):
query = """
UPDATE currency
2024-03-14 20:30:58 +00:00
SET balance = %s
2023-10-23 12:49:46 +00:00
WHERE user_id = %s
"""
2023-06-19 14:20:17 +00:00
2024-03-14 20:30:58 +00:00
database.execute_query(query, (round(self.balance), self.user_id))
2023-06-19 14:20:17 +00:00
@staticmethod
def fetch_or_create_balance(user_id):
query = """
2024-03-14 20:30:58 +00:00
SELECT balance
FROM currency
2023-10-23 12:49:46 +00:00
WHERE user_id = %s
"""
2023-06-19 18:18:23 +00:00
try:
2024-03-14 20:30:58 +00:00
balance = database.select_query_one(query, (user_id,))
2023-06-19 18:18:23 +00:00
except (IndexError, TypeError):
2024-03-14 20:30:58 +00:00
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.
2024-03-14 20:30:58 +00:00
if balance is None:
query = """
2024-03-14 20:30:58 +00:00
INSERT INTO currency (user_id, balance)
VALUES (%s, 50)
"""
database.execute_query(query, (user_id,))
2024-03-14 20:30:58 +00:00
return 50
2024-03-14 20:30:58 +00:00
return balance
2023-07-12 14:06:15 +00:00
@staticmethod
def load_leaderboard():
2024-03-14 20:30:58 +00:00
query = "SELECT user_id, balance FROM currency ORDER BY balance DESC"
2023-07-12 14:06:15 +00:00
data = database.select_query(query)
2024-07-20 11:40:43 +00:00
return [(row[0], row[1], rank) for rank, row in enumerate(data, start=1)]
2023-07-18 19:00:21 +00:00
@staticmethod
def format(num):
locale.setlocale(locale.LC_ALL, "en_US.UTF-8")
return locale.format_string("%d", num, grouping=True)
@staticmethod
def format_human(num):
2024-07-17 11:47:26 +00:00
num = float("{:.3g}".format(num))
2023-07-18 19:00:21 +00:00
magnitude = 0
while abs(num) >= 1000:
magnitude += 1
num /= 1000.0
2024-07-17 11:47:26 +00:00
return "{}{}".format(
"{:f}".format(num).rstrip("0").rstrip("."),
["", "K", "M", "B", "T", "Q", "Qi", "Sx", "Sp", "Oc", "No", "Dc"][
magnitude
],
)
2023-07-20 19:43:29 +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