diff --git a/telegram-application/src/core/tg_service/utils.py b/telegram-application/src/core/tg_service/utils.py index 498f4e7..bed35eb 100644 --- a/telegram-application/src/core/tg_service/utils.py +++ b/telegram-application/src/core/tg_service/utils.py @@ -31,14 +31,25 @@ def create_and_format_message( user_model: User, ) -> str: def escape_markdown_v2(text: str) -> str: + if not text: + return "" escape_chars = '_*[]()~`>#+-=|{}.!' return ''.join('\\' + char if char in escape_chars else char for char in text) - # Формирование информации о пользователе + def validate_markdown(text: str) -> str: + """Ensure all markdown entities are properly closed""" + # Count backticks to ensure pairs + backtick_count = text.count('`') + if backtick_count % 3 != 0: # Code blocks use triple backticks + # Remove unpaired backticks + text = text.replace('`', 'ʻ') # Replace with similar-looking character + return text + + # User info username = escape_markdown_v2(user_model.username) if user_model.username else f"ID: {user_model.id}" user_link = f"[{username}](tg://user?id={user_model.id})" if user_model.username else f"ID: {user_model.id}" - # Формирование информации о чате + # Chat info chat_title = escape_markdown_v2(chat.title) chat_link = ( f"https://t.me/c/{str(chat.id)[4:]}" @@ -47,10 +58,10 @@ def create_and_format_message( else f"Chat ID: {chat.id}" ) - # Экранирование причины + # Escape reason reason_escaped = escape_markdown_v2(reason) - # Базовый заголовок сообщения + # Header header = ( f"🔥 *Найдена успешка!*\n" f"👤 *Пользователь:* {user_link}\n" @@ -59,24 +70,27 @@ def create_and_format_message( f"📝 *Диалог:*\n" ) - # Расчет доступной длины для контента MAX_LENGTH = 4096 header_length = len(header) - available_length = MAX_LENGTH - header_length + available_length = MAX_LENGTH - header_length - 50 # Extra buffer for safety - # Формирование блоков сообщений message_blocks = [] current_length = 0 for msg in messages: - # Очистка и подготовка текста - clean_text = msg.text.replace('```', 'ʻʻʻ') # Заменяем опасные символы + if not msg.text: + continue + + # Clean and escape text + clean_text = msg.text.replace('```', 'ʻʻʻ') # Replace triple backticks escaped_text = escape_markdown_v2(clean_text) + escaped_text = validate_markdown(escaped_text) sender_username = escape_markdown_v2( - msg.user_relationship.username or str(msg.user_id) + msg.user_relationship.username or f"ID:{msg.user_id}" ) - # Формирование блока сообщения + + # Create message block with proper code block formatting block = ( f"**{sender_username}:**\n" f"```\n" @@ -85,17 +99,16 @@ def create_and_format_message( ) block_length = len(block) - # Проверка на превышение длины if current_length + block_length > available_length: remaining_space = available_length - current_length - if remaining_space > 20: # Минимальный значимый блок - truncated_text = escaped_text[:remaining_space - 20] + "..." + if remaining_space > 30: # Enough space for a truncated message + truncated_text = escaped_text[:remaining_space - 30].rsplit(' ', 1)[0] + "..." block = ( - f"**Пользователь:**\n" + f"**{sender_username}:**\n" f"```\n" f"{truncated_text}\n" f"```\n\n" - f"_... сообщение обрезано ..._" + f"_... сообщение обрезано ..._\n" ) message_blocks.append(block) break @@ -103,12 +116,12 @@ def create_and_format_message( message_blocks.append(block) current_length += block_length - # Сборка финального сообщения content = ''.join(message_blocks).strip() full_message = header + content - # Финальная проверка длины + # Final validation and truncation if needed + full_message = validate_markdown(full_message) if len(full_message) > MAX_LENGTH: - full_message = full_message[:MAX_LENGTH - 17] + "\n```\n...\n```\n_... сообщение обрезано ..._" + full_message = full_message[:MAX_LENGTH - 30].rsplit('\n', 2)[0] + "\n```\n...\n```\n_... сообщение обрезано ..._" return full_message \ No newline at end of file diff --git a/telegram-application/src/tg_account.session b/telegram-application/src/tg_account.session index d708e59..72747b0 100644 Binary files a/telegram-application/src/tg_account.session and b/telegram-application/src/tg_account.session differ