94 lines
3.4 KiB
Python
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)
|