diff --git a/app/utils/message_patch.py b/app/utils/message_patch.py index 134ff1ea..39acd8ad 100644 --- a/app/utils/message_patch.py +++ b/app/utils/message_patch.py @@ -2,7 +2,7 @@ from pathlib import Path from typing import Any, Dict from aiogram.exceptions import TelegramBadRequest -from aiogram.types import FSInputFile, InputMediaPhoto, Message +from aiogram.types import FSInputFile, InaccessibleMessage, InputMediaPhoto, Message from app.config import settings from app.localization.texts import get_texts @@ -12,6 +12,8 @@ _PRIVACY_RESTRICTED_CODE = "BUTTON_USER_PRIVACY_RESTRICTED" def is_qr_message(message: Message) -> bool: + if isinstance(message, InaccessibleMessage): + return False return bool(message.caption and message.caption.startswith("\U0001F517 Ваша реферальная ссылка")) diff --git a/app/utils/photo_message.py b/app/utils/photo_message.py index 48ed85b0..41aaa758 100644 --- a/app/utils/photo_message.py +++ b/app/utils/photo_message.py @@ -3,7 +3,7 @@ import logging from aiogram import types from aiogram.exceptions import TelegramBadRequest, TelegramNetworkError -from aiogram.types import FSInputFile, InputMediaPhoto +from aiogram.types import FSInputFile, InaccessibleMessage, InputMediaPhoto from app.config import settings from .message_patch import ( @@ -21,6 +21,9 @@ RETRY_DELAY = 0.5 def _resolve_media(message: types.Message): + # Если сообщение недоступно, возвращаем логотип по умолчанию + if isinstance(message, InaccessibleMessage): + return FSInputFile(LOGO_PATH) # Всегда используем логотип если включен режим логотипа, # кроме специальных случаев (QR сообщения) if settings.ENABLE_LOGO_MODE and not is_qr_message(message): @@ -81,6 +84,35 @@ async def edit_or_answer_photo( force_text: bool = False, ) -> None: resolved_parse_mode = parse_mode or "HTML" + + # Если сообщение недоступно, отправляем новое сообщение + if isinstance(callback.message, InaccessibleMessage): + try: + if settings.ENABLE_LOGO_MODE and LOGO_PATH.exists(): + await callback.message.answer_photo( + photo=FSInputFile(LOGO_PATH), + caption=caption, + reply_markup=keyboard, + parse_mode=resolved_parse_mode, + ) + else: + await callback.message.answer( + caption, + reply_markup=keyboard, + parse_mode=resolved_parse_mode, + ) + except Exception as e: + logger.warning("Не удалось отправить новое сообщение для InaccessibleMessage: %s", e) + try: + await callback.message.answer( + caption, + reply_markup=keyboard, + parse_mode=resolved_parse_mode, + ) + except Exception: + pass + return + # Если режим логотипа выключен или требуется текстовое сообщение — работаем текстом if force_text or not settings.ENABLE_LOGO_MODE: try: