DispelEvilBot/bot/handlers/shop.py

94 lines
3.4 KiB
Python

"""Магазин: команда и обработка callback-кнопок."""
from __future__ import annotations
import logging
from aiogram import Router
from aiogram.filters import Command
from aiogram.types import CallbackQuery, Message
from bot.keyboards import get_keyboard_donat, get_keyboard_main, get_keyboard_title
from bot.services import access
from bot.services import shop as shop_service
from bot.services.sequences import send_template, template_text
from common.config import get_settings
from common.texts import system
from common.texts.render import render
logger = logging.getLogger(__name__)
router = Router(name="shop")
@router.message(Command("магазин", "shop", ignore_case=True))
async def shop_handler(message: Message) -> None:
if not await access.check_user(message):
return
if message.chat.type != "private":
await message.answer(system.MSG_SHOP_PRIVATE_ONLY)
return
await send_template(message.bot, message.chat.id, "shop.main", reply_markup=get_keyboard_main())
async def _render_chapter(chapter: str) -> tuple[str, object] | None:
if chapter == "main":
return await template_text("shop.main"), get_keyboard_main()
if chapter == "title":
return await template_text("shop.title"), await get_keyboard_title()
if chapter == "donat":
return await template_text("shop.donat"), await get_keyboard_donat()
return None
@router.callback_query()
async def callbacks_handler(callback: CallbackQuery) -> None:
settings = get_settings()
if (
callback.message is not None
and callback.message.chat.type != "private"
and callback.message.chat.id != settings.chat_id
):
await callback.answer()
return
answer_text = ""
args = (callback.data or "").split("_")
action = args[0] if args else ""
if action == "go" and len(args) > 1:
chapter = await _render_chapter(args[1])
if chapter is not None and callback.message is not None:
text, markup = chapter
await callback.bot.edit_message_text(
chat_id=callback.message.chat.id,
message_id=callback.message.message_id,
text=text,
reply_markup=markup,
)
elif action == "buy" and len(args) > 2:
product, id_product = args[1], int(args[2])
if product == "title":
ok = await shop_service.buy_title(callback.from_user.id, id_product)
if not ok:
answer_text = system.MSG_PURCHASE_FAIL
elif callback.message is not None:
await callback.bot.edit_message_text(
chat_id=callback.message.chat.id,
message_id=callback.message.message_id,
text=system.MSG_PURCHASE_OK,
)
elif product == "donat":
promo = await shop_service.buy_donat(callback.from_user.id, id_product)
if promo is None:
answer_text = system.MSG_PURCHASE_FAIL
elif callback.message is not None:
await callback.bot.edit_message_text(
chat_id=callback.message.chat.id,
message_id=callback.message.message_id,
text=render(system.MSG_DONAT_PROMO, {"promo": promo}),
parse_mode="MARKDOWN",
)
await callback.answer(answer_text)