Files
2026-04-14 07:19:14 +00:00

60 lines
2.2 KiB
Python

from collections.abc import Awaitable, Callable
from typing import Any
from aiogram import BaseMiddleware, Bot
from aiogram.exceptions import TelegramBadRequest
from aiogram.types import CallbackQuery, InaccessibleMessage, TelegramObject
from bot import bot
class EarlyCallbackAnswerMiddleware(BaseMiddleware):
"""
Регистрируется первым в цепочке update. Для CallbackQuery сразу вызывает
answer_callback_query.
"""
async def __call__(
self,
handler: Callable[[TelegramObject, dict[str, Any]], Awaitable[Any]],
event: TelegramObject,
data: dict[str, Any],
) -> Any:
if isinstance(event, CallbackQuery):
bot_instance: Bot | None = data.get("bot")
if bot_instance:
try:
await bot_instance.answer_callback_query(event.id, show_alert=False)
data["callback_answered_early"] = True
except TelegramBadRequest as e:
msg = str(e).lower()
if "query is too old" in msg or "response timeout expired" in msg or "query id is invalid" in msg:
pass
else:
raise
except Exception:
pass
return await handler(event, data)
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):
if not data.get("callback_answered_by_concurrency") and not data.get("callback_answered_early"):
try:
await event.answer()
except Exception:
pass
if isinstance(event.message, InaccessibleMessage):
try:
new_message = await bot.send_message(event.message.chat.id, "")
object.__setattr__(event, "message", new_message)
except Exception:
pass
return await handler(event, data)