60 lines
2.2 KiB
Python
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)
|