52 lines
1.5 KiB
Python
52 lines
1.5 KiB
Python
import logging
|
|
from typing import Any
|
|
|
|
from aiogram.exceptions import TelegramAPIError, TelegramBadRequest
|
|
from aiogram.types import CallbackQuery
|
|
|
|
_EXPIRED_CALLBACK_MARKERS = (
|
|
"query is too old",
|
|
"response timeout expired",
|
|
"query id is invalid",
|
|
)
|
|
|
|
|
|
def is_expired_callback_answer_error(error: BaseException) -> bool:
|
|
if not isinstance(error, TelegramBadRequest):
|
|
return False
|
|
message = str(error).lower()
|
|
return any(marker in message for marker in _EXPIRED_CALLBACK_MARKERS)
|
|
|
|
|
|
async def safe_answer_callback(
|
|
callback: CallbackQuery,
|
|
*args: Any,
|
|
**kwargs: Any,
|
|
) -> bool:
|
|
try:
|
|
await callback.answer(*args, **kwargs)
|
|
return True
|
|
except TelegramBadRequest as error:
|
|
user_id = getattr(getattr(callback, "from_user", None), "id", "unknown")
|
|
if is_expired_callback_answer_error(error):
|
|
logging.info(
|
|
"Ignored expired callback answer for user %s: %s",
|
|
user_id,
|
|
error,
|
|
)
|
|
return False
|
|
logging.warning(
|
|
"Failed to answer callback query for user %s: %s",
|
|
user_id,
|
|
error,
|
|
)
|
|
return False
|
|
except TelegramAPIError as error:
|
|
user_id = getattr(getattr(callback, "from_user", None), "id", "unknown")
|
|
logging.warning(
|
|
"Telegram API error while answering callback query for user %s: %s",
|
|
user_id,
|
|
error,
|
|
)
|
|
return False
|