DispelEvilBot/bot/handlers/economy.py

78 lines
2.8 KiB
Python

"""Команды экономики: очищение, яички и реакция на сообщения."""
from __future__ import annotations
import random
from datetime import datetime
from aiogram import Router
from aiogram.filters import Command
from aiogram.types import Message
from bot.services import access, alerts
from bot.services import economy as economy_service
from common.config import get_settings
from common.eggs import egg_event_period, is_egg_event_active
from common.texts import system
from common.texts.render import render
from common.texts.store import get_text
router = Router(name="economy")
#: Шанс выпадения монетки на сообщение.
COIN_CHANCE = 27 # из 100
@router.message(Command("очищение", "purify", ignore_case=True))
async def purification_handler(message: Message) -> None:
if not await access.check_user(message):
return
result = await economy_service.purify(message.from_user.id)
if not result.success:
context = {"h": result.hours, "m": result.minutes, "s": result.seconds}
await message.answer(render(await get_text("economy.no_purification"), context))
else:
context = {"money_add": result.money_add, "exp_add": result.exp_add}
await message.answer(render(await get_text("economy.purification"), context))
await alerts.notify_purification(
message.bot,
username=message.from_user.username,
user_id=message.from_user.id,
result=result,
)
@router.message(Command("яички", "eggs", ignore_case=True))
async def eggs_handler(message: Message) -> None:
settings = get_settings()
if not is_egg_event_active(settings):
today = datetime.now(settings.tzinfo).date()
start, _ = egg_event_period(settings, today)
await message.answer(system.MSG_EGGS_TOO_EARLY if today < start else system.MSG_EGGS_EVENT_OVER)
return
if not await access.check_user(message):
return
result = await economy_service.collect_eggs(message.from_user.id)
if not result.success:
context = {"h": result.hours, "m": result.minutes, "s": result.seconds}
await message.answer(render(await get_text("economy.no_eggs"), context))
else:
await message.answer(render(await get_text("economy.eggs"), {"eggs": result.eggs}))
@router.message()
async def message_handler(message: Message) -> None:
"""Случайная монетка за активность в основном чате."""
if not await access.check_user(message):
return
if message.chat.id != get_settings().chat_id:
return
if random.randrange(1, 100) == COIN_CHANCE:
await message.reply(system.MSG_COIN)
await economy_service.add_coins(message.from_user.id, 1)