from aiogram import Router, F from aiogram.filters import Command from aiogram.fsm.context import FSMContext from aiogram.types import Message, CallbackQuery, InlineKeyboardButton from aiogram.utils.keyboard import InlineKeyboardBuilder from logging import getLogger from sqlmodel.ext.asyncio.session import AsyncSession from ....main import QBotApp from ....model.settings import Settings from ....model.user import UserBase from ..context import ContextData, CallbackCommand from ..common import get_send_message logger = getLogger(__name__) router = Router() @router.message(Command("menu")) async def command_menu(message: Message, **kwargs): await clear_state(state = kwargs["state"], clear_nav = True) callback_data = ContextData(command = CallbackCommand.MENU_ENTRY_MAIN) stack = await save_navigation_context(callback_data = callback_data, state = kwargs["state"]) kwargs.update({"navigation_stack": stack, "callback_data": callback_data}) await main_menu(message, **kwargs) # @router.callback_query(CallbackData.filter(F.command == CallbackCommand.MENU_ENTRY)) # async def menu_entry(query: CallbackQuery, callback_data: CallbackData, user: UserBase, db_session: AsyncSession, app: QBotApp): # pass @router.callback_query(ContextData.filter(F.command == CallbackCommand.MENU_ENTRY_MAIN)) async def menu_entry_main(message: CallbackQuery, **kwargs): stack = await save_navigation_context(callback_data = kwargs["callback_data"], state = kwargs["state"]) await main_menu(message, navigation_stack = stack, **kwargs) async def main_menu(message: Message | CallbackQuery, navigation_stack: list[ContextData], **kwargs): keyboard_builder = InlineKeyboardBuilder() keyboard_builder.row( InlineKeyboardButton( text = (await Settings.get(Settings.APP_STRINGS_REFERENCES_BTN)), callback_data = ContextData(command = CallbackCommand.MENU_ENTRY_ENTITIES).pack())) keyboard_builder.row( InlineKeyboardButton( text = (await Settings.get(Settings.APP_STRINGS_SETTINGS_BTN)), callback_data = ContextData(command = CallbackCommand.MENU_ENTRY_SETTINGS).pack())) context = pop_navigation_context(navigation_stack) if context: keyboard_builder.row( InlineKeyboardButton( text = (await Settings.get(Settings.APP_STRINGS_BACK_BTN)), callback_data = context.pack())) send_message = get_send_message(message) await send_message(text = (await Settings.get(Settings.APP_STRINGS_MAIN_NENU)), reply_markup = keyboard_builder.as_markup()) from .entities import router as entities_router from .settings import router as settings_router from .parameters import router as parameters_router from .language import router as language_router from ..editors import router as editors_router from ..forms.entity_list import router as entity_list_router from ..forms.entity_form import router as entity_form_router router.include_routers( entities_router, settings_router, parameters_router, language_router, editors_router, entity_list_router, entity_form_router ) from ..navigation import save_navigation_context, pop_navigation_context, clear_state