fix: suppress web page preview when logo mode is disabled
When ENABLE_LOGO_MODE is on, messages are sent as photos which naturally don't show URL previews. When off, messages are sent as text but disable_web_page_preview was never set, causing link previews in menu, welcome, and other messages. Always patch Message.answer/edit_text and inject disable_web_page_preview=True for all text message paths.
This commit is contained in:
+25
-11
@@ -50,6 +50,18 @@ _original_answer = Message.answer
|
||||
_original_edit_text = Message.edit_text
|
||||
|
||||
|
||||
async def _text_answer(self: Message, text: str = None, **kwargs):
|
||||
"""Обёртка над оригинальным Message.answer с подавлением web page preview."""
|
||||
kwargs.setdefault('disable_web_page_preview', True)
|
||||
return await _original_answer(self, text, **kwargs)
|
||||
|
||||
|
||||
async def _text_edit(self: Message, text: str, **kwargs):
|
||||
"""Обёртка над оригинальным Message.edit_text с подавлением web page preview."""
|
||||
kwargs.setdefault('disable_web_page_preview', True)
|
||||
return await _original_edit_text(self, text, **kwargs)
|
||||
|
||||
|
||||
def _get_language(message: Message) -> str | None:
|
||||
try:
|
||||
user = message.from_user
|
||||
@@ -121,11 +133,14 @@ def is_topic_required_error(error: Exception) -> bool:
|
||||
async def _answer_with_photo(self: Message, text: str = None, **kwargs):
|
||||
# Уважаем флаг в рантайме: если логотип выключен — не подменяем ответ
|
||||
if not settings.ENABLE_LOGO_MODE:
|
||||
# Фото-сообщения не показывают web page preview, текстовые — показывают.
|
||||
# Подавляем превью чтобы поведение не менялось при переключении режима логотипа.
|
||||
kwargs.setdefault('disable_web_page_preview', True)
|
||||
return await _original_answer(self, text, **kwargs)
|
||||
# Если caption слишком длинный для фото — отправим как текст
|
||||
try:
|
||||
if text is not None and len(text) > 900:
|
||||
return await _original_answer(self, text, **kwargs)
|
||||
return await _text_answer(self, text, **kwargs)
|
||||
except Exception:
|
||||
pass
|
||||
language = _get_language(self)
|
||||
@@ -143,27 +158,27 @@ async def _answer_with_photo(self: Message, text: str = None, **kwargs):
|
||||
fallback_text = append_privacy_hint(text, language)
|
||||
safe_kwargs = prepare_privacy_safe_kwargs(kwargs)
|
||||
try:
|
||||
return await _original_answer(self, fallback_text, **safe_kwargs)
|
||||
return await _text_answer(self, fallback_text, **safe_kwargs)
|
||||
except TelegramBadRequest as inner_error:
|
||||
if is_topic_required_error(inner_error):
|
||||
return None
|
||||
raise
|
||||
# Фоллбек, если Telegram ругается на caption или другое ограничение: отправим как текст
|
||||
try:
|
||||
return await _original_answer(self, text, **kwargs)
|
||||
return await _text_answer(self, text, **kwargs)
|
||||
except TelegramBadRequest as inner_error:
|
||||
if is_topic_required_error(inner_error):
|
||||
return None
|
||||
raise
|
||||
except Exception:
|
||||
try:
|
||||
return await _original_answer(self, text, **kwargs)
|
||||
return await _text_answer(self, text, **kwargs)
|
||||
except TelegramBadRequest as inner_error:
|
||||
if is_topic_required_error(inner_error):
|
||||
return None
|
||||
raise
|
||||
try:
|
||||
return await _original_answer(self, text, **kwargs)
|
||||
return await _text_answer(self, text, **kwargs)
|
||||
except TelegramBadRequest as error:
|
||||
if is_topic_required_error(error):
|
||||
return None
|
||||
@@ -173,6 +188,7 @@ async def _answer_with_photo(self: Message, text: str = None, **kwargs):
|
||||
async def _edit_with_photo(self: Message, text: str, **kwargs):
|
||||
# Уважаем флаг в рантайме: если логотип выключен — не подменяем редактирование
|
||||
if not settings.ENABLE_LOGO_MODE:
|
||||
kwargs.setdefault('disable_web_page_preview', True)
|
||||
return await _original_edit_text(self, text, **kwargs)
|
||||
if self.photo:
|
||||
language = _get_language(self)
|
||||
@@ -183,7 +199,7 @@ async def _edit_with_photo(self: Message, text: str, **kwargs):
|
||||
await self.delete()
|
||||
except Exception:
|
||||
pass
|
||||
return await _original_answer(self, text, **kwargs)
|
||||
return await _text_answer(self, text, **kwargs)
|
||||
except Exception:
|
||||
pass
|
||||
if LOGO_PATH.exists():
|
||||
@@ -210,7 +226,7 @@ async def _edit_with_photo(self: Message, text: str, **kwargs):
|
||||
except Exception:
|
||||
pass
|
||||
try:
|
||||
return await _original_answer(self, fallback_text, **safe_kwargs)
|
||||
return await _text_answer(self, fallback_text, **safe_kwargs)
|
||||
except TelegramBadRequest as inner_error:
|
||||
if is_topic_required_error(inner_error):
|
||||
return None
|
||||
@@ -221,14 +237,14 @@ async def _edit_with_photo(self: Message, text: str, **kwargs):
|
||||
except Exception:
|
||||
pass
|
||||
try:
|
||||
return await _original_answer(self, text, **kwargs)
|
||||
return await _text_answer(self, text, **kwargs)
|
||||
except TelegramBadRequest as inner_error:
|
||||
if is_topic_required_error(inner_error):
|
||||
return None
|
||||
raise
|
||||
# Обработка ошибок MESSAGE_ID_INVALID для сообщений без фото
|
||||
try:
|
||||
return await _original_edit_text(self, text, **kwargs)
|
||||
return await _text_edit(self, text, **kwargs)
|
||||
except TelegramBadRequest as error:
|
||||
if is_topic_required_error(error):
|
||||
return None
|
||||
@@ -239,7 +255,5 @@ async def _edit_with_photo(self: Message, text: str, **kwargs):
|
||||
|
||||
|
||||
def patch_message_methods():
|
||||
if not settings.ENABLE_LOGO_MODE:
|
||||
return
|
||||
Message.answer = _answer_with_photo
|
||||
Message.edit_text = _edit_with_photo
|
||||
|
||||
Reference in New Issue
Block a user