From b01eabdcdafb894ba9d9a191c6a3b3d9e7825955 Mon Sep 17 00:00:00 2001 From: Vladislav Lisitsyn <114032530+Vladless@users.noreply.github.com> Date: Sun, 17 Aug 2025 16:59:45 +0300 Subject: [PATCH] Merge pull request #234 from Vladless/feat/callback-answer Callback answer middleware --- handlers/admin/management/management_handler.py | 2 -- handlers/keys/key_view.py | 1 - handlers/pay.py | 1 - middlewares/__init__.py | 2 ++ middlewares/answer.py | 17 +++++++++++++++++ 5 files changed, 19 insertions(+), 4 deletions(-) create mode 100644 middlewares/answer.py diff --git a/handlers/admin/management/management_handler.py b/handlers/admin/management/management_handler.py index 3cb12065..7d13bcb8 100644 --- a/handlers/admin/management/management_handler.py +++ b/handlers/admin/management/management_handler.py @@ -439,8 +439,6 @@ async def back_to_database_menu(callback: CallbackQuery): @router.callback_query(AdminPanelCallback.filter(F.action == "export_remnawave")) async def show_remnawave_clients(callback: CallbackQuery, session: AsyncSession): - await callback.answer() - result = await session.execute(select(Server).where(Server.panel_type == "remnawave", Server.enabled.is_(True))) servers = result.scalars().all() diff --git a/handlers/keys/key_view.py b/handlers/keys/key_view.py index f733ff9d..6cc52a51 100644 --- a/handlers/keys/key_view.py +++ b/handlers/keys/key_view.py @@ -157,7 +157,6 @@ async def handle_rename_key(callback: CallbackQuery, state: FSMContext): @router.callback_query(F.data == "cancel_and_back_to_view_keys") async def cancel_and_back(callback: CallbackQuery, state: FSMContext, session: AsyncSession): await state.clear() - await callback.answer() await process_callback_or_message_view_keys(callback, session) diff --git a/handlers/pay.py b/handlers/pay.py index 7565bf05..3f7828e2 100644 --- a/handlers/pay.py +++ b/handlers/pay.py @@ -92,7 +92,6 @@ async def handle_pay(callback_query: CallbackQuery, state: FSMContext, session: payment_handlers.append(process_callback_pay_tribute) if len(payment_handlers) == 1: - await callback_query.answer() return await payment_handlers[0](callback_query, state, session) builder = InlineKeyboardBuilder() diff --git a/middlewares/__init__.py b/middlewares/__init__.py index 827e9bb5..bf4a28b0 100644 --- a/middlewares/__init__.py +++ b/middlewares/__init__.py @@ -14,6 +14,7 @@ from .maintenance import MaintenanceModeMiddleware from .session import SessionMiddleware from .throttling import ThrottlingMiddleware from .user import UserMiddleware +from .answer import CallbackAnswerMiddleware def register_middleware( @@ -39,6 +40,7 @@ def register_middleware( "logging": LoggingMiddleware(), "throttling": ThrottlingMiddleware(), "user": UserMiddleware(), + "answer": CallbackAnswerMiddleware(), } exclude_set = set(exclude or []) diff --git a/middlewares/answer.py b/middlewares/answer.py new file mode 100644 index 00000000..41847622 --- /dev/null +++ b/middlewares/answer.py @@ -0,0 +1,17 @@ +from collections.abc import Awaitable, Callable +from typing import Any + +from aiogram import BaseMiddleware +from aiogram.types import CallbackQuery, TelegramObject + + +class CallbackAnswerMiddleware(BaseMiddleware): + async def __call__( + self, + handler: Callable[[TelegramObject, dict[str, Any]], Awaitable[Any]], + event: TelegramObject, + data: dict[str, Any], + ) -> Any: + if isinstance(event, CallbackQuery): + await event.answer() + return await handler(event, data)