DispelEvilBot/bot/services/economy.py

86 lines
3.0 KiB
Python

"""Сервис экономики: очищение, яички, монетки."""
from __future__ import annotations
from common.analytics import EventType, record
from common.models import EggsResult, PurificationResult
from common.repositories import economy_repo
#: id действия для начисления монеток.
ACTION_COIN = 1
#: id действия для награды за очищение.
ACTION_PURIFICATION = 4
#: id действия для обнуления баланса при удалении пользователя.
ACTION_USER_DELETED = 5
async def purify(id_user: int) -> PurificationResult:
"""Выполнить ежедневное очищение и записать события аналитики."""
row = await economy_repo.purification(id_user)
if not row:
return PurificationResult(success=False)
result = PurificationResult(
success=int(row.get("res") or 0) != 0,
exp_add=int(row.get("expr_add") or 0),
money_add=int(row.get("mny_add") or 0),
hours=int(row.get("h") or 0),
minutes=int(row.get("m") or 0),
seconds=int(row.get("s") or 0),
level_before=int(row.get("lvl_before") or 0),
level=int(row.get("lvl_after") or 0),
streak=int(row.get("streak") or 0),
)
record(
EventType.PURIFICATION,
user_id=id_user,
payload={"success": result.success, "exp_add": result.exp_add, "money_add": result.money_add},
)
if not result.success:
return result
if result.exp_add:
record(EventType.EXP_ACCRUAL, user_id=id_user, payload={"amount": result.exp_add, "streak": result.streak})
if result.level_up:
record(
EventType.LEVEL_UP,
user_id=id_user,
payload={"level_from": result.level_before, "level_to": result.level},
)
if result.money_add:
record(
EventType.MONEY_ACCRUAL,
user_id=id_user,
payload={"amount": result.money_add, "reason": "purification", "action_id": ACTION_PURIFICATION},
)
return result
async def collect_eggs(id_user: int) -> EggsResult:
"""Получить ежедневные яички."""
row = await economy_repo.add_eggs(id_user)
if not row:
return EggsResult(success=False)
result = EggsResult(
success=int(row.get("res") or 0) != 0,
eggs=int(row.get("eggs_add") or 0),
hours=int(row.get("h") or 0),
minutes=int(row.get("m") or 0),
seconds=int(row.get("s") or 0),
)
if result.success:
record(EventType.EGGS, user_id=id_user, payload={"amount": result.eggs})
return result
async def add_coins(id_user: int, amount: int) -> None:
"""Начислить монеты (монетка за активность)."""
await economy_repo.money_action(id_user, amount, ACTION_COIN)
record(
EventType.MONEY_ACCRUAL,
user_id=id_user,
payload={"amount": amount, "reason": "coin", "action_id": ACTION_COIN},
)