diff --git a/bot/handlers/common/routing.py b/bot/handlers/common/routing.py index f3949c1..59298f9 100644 --- a/bot/handlers/common/routing.py +++ b/bot/handlers/common/routing.py @@ -1,4 +1,9 @@ from aiogram.types import Message, CallbackQuery +from typing import TYPE_CHECKING + +if TYPE_CHECKING: + from qbot.main import QBotApp + from ..context import CallbackCommand from ....utils.navigation import ( @@ -44,8 +49,11 @@ async def route_callback(message: Message | CallbackQuery, back: bool = True, ** elif context.command == CallbackCommand.USER_COMMAND: import qbot.bot.handlers.user_handlers.main as user_handler + app: "QBotApp" = kwargs["app"] + cmd = app.bot_commands.get(context.user_command.split("&")[0]) + await user_handler.cammand_handler( - message, from_callback_query=True, **kwargs + message=message, cmd=cmd, **kwargs ) else: raise ValueError(f"Unknown command {context.command}") diff --git a/bot/handlers/editors/main_callbacks.py b/bot/handlers/editors/main_callbacks.py index 8fe7e80..60290a4 100644 --- a/bot/handlers/editors/main_callbacks.py +++ b/bot/handlers/editors/main_callbacks.py @@ -335,12 +335,13 @@ async def process_field_edit_callback(message: Message | CallbackQuery, **kwargs "callback_data": ContextData( command=CallbackCommand.USER_COMMAND, user_command=callback_data.user_command, - data=callback_data.data, ) } ) - return await cammand_handler(message=message, **kwargs) + cmd=app.bot_commands.get(callback_data.user_command.split("&")[0]) + + return await cammand_handler(message=message, cmd=cmd, **kwargs) clear_state(state_data=state_data) diff --git a/bot/handlers/user_handlers/main.py b/bot/handlers/user_handlers/main.py index c8f2d89..be76459 100644 --- a/bot/handlers/user_handlers/main.py +++ b/bot/handlers/user_handlers/main.py @@ -14,7 +14,7 @@ from qbot.bot.handlers.editors.main import field_editor from qbot.bot.handlers.common.routing import route_callback from qbot.utils.serialization import deserialize from qbot.utils.main import get_send_message -from qbot.model.descriptors import CommandCallbackContext +from qbot.model.descriptors import BotCommand, CommandCallbackContext from qbot.model.settings import Settings if TYPE_CHECKING: @@ -37,7 +37,7 @@ async def command_text(message: Message, **kwargs): state_data = await state.get_data() kwargs["state_data"] = state_data - await cammand_handler(message=message, callback_data=callback_data, **kwargs) + await process_command_handler(message=message, callback_data=callback_data, **kwargs) @router.callback_query(ContextData.filter(F.command == CallbackCommand.USER_COMMAND)) @@ -46,19 +46,36 @@ async def command_callback(message: CallbackQuery, **kwargs): state_data = await state.get_data() kwargs["state_data"] = state_data - await cammand_handler(message=message, **kwargs) + await process_command_handler(message=message, **kwargs) -async def cammand_handler(message: Message | CallbackQuery, **kwargs): - callback_data: ContextData = kwargs["callback_data"] - state: FSMContext = kwargs["state"] +async def process_command_handler(message: Message | CallbackQuery, **kwargs): + state_data: dict = kwargs["state_data"] + callback_data: ContextData = kwargs["callback_data"] app: "QBotApp" = kwargs["app"] cmd = app.bot_commands.get(callback_data.user_command.split("&")[0]) if cmd is None: return + if cmd.clear_navigation: + state_data.pop("navigation_stack", None) + state_data.pop("navigation_context", None) + + if cmd.register_navigation: + clear_state(state_data=state_data) + save_navigation_context(callback_data=callback_data, state_data=state_data) + + await cammand_handler(message=message, cmd=cmd, **kwargs) + + +async def cammand_handler(message: Message | CallbackQuery, cmd: BotCommand, **kwargs): + callback_data: ContextData = kwargs["callback_data"] + state: FSMContext = kwargs["state"] + state_data: dict = kwargs["state_data"] + app: "QBotApp" = kwargs["app"] + entity_data_dict: dict = state_data.get("entity_data") form_data = ( { @@ -106,20 +123,11 @@ async def cammand_handler(message: Message | CallbackQuery, **kwargs): return await field_editor(message=message, **kwargs) - if cmd.clear_navigation: - state_data.pop("navigation_stack", None) - state_data.pop("navigation_context", None) - - if cmd.register_navigation: - clear_state(state_data=state_data) - save_navigation_context(callback_data=callback_data, state_data=state_data) - await cmd.handler(callback_context) if callback_context.register_navigation: await state.set_data(state_data) - # if command.register_navigation: stack, navigation_context = get_navigation_context(state_data=state_data) back_callback_data = pop_navigation_context(stack=stack) if back_callback_data: