"""Магазин: команда и обработка 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 common.config import get_settings from common.texts import system from common.texts.render import render from common.texts.store import get_text logger = logging.getLogger(__name__) router = Router(name="shop") @router.message(Command("магазин", 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 message.answer(await get_text("shop.main"), reply_markup=get_keyboard_main()) async def _render_chapter(chapter: str) -> tuple[str, object] | None: if chapter == "main": return await get_text("shop.main"), get_keyboard_main() if chapter == "title": return await get_text("shop.title"), await get_keyboard_title() if chapter == "donat": return await get_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)