86 lines
3.0 KiB
Python
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},
|
|
)
|