"""Сервис экономики: очищение, яички, монетки.""" 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}, )