mirror of
https://github.com/wlinator/luminara.git
synced 2024-10-02 18:03:12 +00:00
Add currency service
This commit is contained in:
parent
b8b6880169
commit
09ab8db099
1 changed files with 91 additions and 0 deletions
91
services/currency_service.py
Normal file
91
services/currency_service.py
Normal file
|
@ -0,0 +1,91 @@
|
|||
import locale
|
||||
|
||||
from db import database
|
||||
|
||||
|
||||
class Currency:
|
||||
def __init__(self, user_id):
|
||||
self.user_id = user_id
|
||||
self.balance = Currency.fetch_or_create_balance(self.user_id)
|
||||
|
||||
def add_balance(self, amount):
|
||||
self.balance += abs(amount)
|
||||
|
||||
def take_balance(self, amount):
|
||||
self.balance -= abs(amount)
|
||||
|
||||
self.balance = max(self.balance, 0)
|
||||
|
||||
def push(self):
|
||||
query = """
|
||||
UPDATE currency
|
||||
SET balance = %s
|
||||
WHERE user_id = %s
|
||||
"""
|
||||
|
||||
database.execute_query(query, (round(self.balance), self.user_id))
|
||||
|
||||
@staticmethod
|
||||
def fetch_or_create_balance(user_id):
|
||||
query = """
|
||||
SELECT balance
|
||||
FROM currency
|
||||
WHERE user_id = %s
|
||||
"""
|
||||
|
||||
try:
|
||||
balance = database.select_query_one(query, (user_id,))
|
||||
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
|
||||
def load_leaderboard():
|
||||
query = "SELECT user_id, balance FROM currency ORDER BY balance DESC"
|
||||
data = database.select_query(query)
|
||||
|
||||
return [(row[0], row[1], rank) for rank, row in enumerate(data, start=1)]
|
||||
|
||||
@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):
|
||||
num = float("{:.3g}".format(num))
|
||||
magnitude = 0
|
||||
while abs(num) >= 1000:
|
||||
magnitude += 1
|
||||
num /= 1000.0
|
||||
|
||||
return "{}{}".format(
|
||||
"{:f}".format(num).rstrip("0").rstrip("."),
|
||||
["", "K", "M", "B", "T", "Q", "Qi", "Sx", "Sp", "Oc", "No", "Dc"][
|
||||
magnitude
|
||||
],
|
||||
)
|
||||
|
||||
# A Thousand = K
|
||||
# Million = M
|
||||
# Billion = B
|
||||
# Trillion = T
|
||||
# Quadrillion: Q
|
||||
# Quintillion: Qi
|
||||
# Sextillion: Sx
|
||||
# Septillion: Sp
|
||||
# Octillion: Oc
|
||||
# Nonillion: No
|
||||
# Decillion: Dc
|
Loading…
Reference in a new issue