From ef71c67683d94491127a93055699a96a57e73ebb Mon Sep 17 00:00:00 2001 From: Arxip222 Date: Wed, 24 Dec 2025 15:49:39 +0300 Subject: [PATCH] styling add --- .../use_cases/document_use_cases.py | 14 ++-- .../telegram/handlers/question_handler.py | 82 +++++++++++++------ 2 files changed, 68 insertions(+), 28 deletions(-) diff --git a/backend/src/application/use_cases/document_use_cases.py b/backend/src/application/use_cases/document_use_cases.py index f5356c2..536b7a6 100644 --- a/backend/src/application/use_cases/document_use_cases.py +++ b/backend/src/application/use_cases/document_use_cases.py @@ -115,8 +115,9 @@ class DocumentUseCases: await self._send_telegram_notification( telegram_id, "🔄 Начинаю индексацию документа...\n\n" - f"Документ: {title}\n" - "Это может занять некоторое время." + f"📄 Документ: {title}\n\n" + f"Это может занять некоторое время.\n" + f"Вы получите уведомление по завершении." ) chunks = await self.rag_service.index_document(document) @@ -124,9 +125,12 @@ class DocumentUseCases: await self._send_telegram_notification( telegram_id, "✅ Индексация завершена!\n\n" - f"Документ: {title}\n" - f"Проиндексировано чанков: {len(chunks)}\n\n" - "Теперь вы можете задавать вопросы по этому документу." + f"━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n\n" + f"📄 Документ: {title}\n" + f"📊 Проиндексировано чанков: {len(chunks)}\n\n" + f"━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n\n" + f"💡 Теперь вы можете задавать вопросы по этому документу!\n" + f"Просто напишите ваш вопрос, и я найду ответ на основе загруженного документа." ) except Exception as e: print(f"Ошибка при автоматической индексации документа {document.document_id}: {e}") diff --git a/tg_bot/infrastructure/telegram/handlers/question_handler.py b/tg_bot/infrastructure/telegram/handlers/question_handler.py index ab1a1c7..b775e86 100644 --- a/tg_bot/infrastructure/telegram/handlers/question_handler.py +++ b/tg_bot/infrastructure/telegram/handlers/question_handler.py @@ -3,6 +3,8 @@ from aiogram.types import Message from tg_bot.config.settings import settings from tg_bot.domain.user_service import UserService, User from tg_bot.application.services.rag_service import RAGService +import re + router = Router() rag_service = RAGService() @@ -60,22 +62,37 @@ async def process_premium_question(message: Message, user: User, question_text: # Беседа уже сохранена в бэкенде через API /rag/question + import re + formatted_answer = answer + formatted_answer = re.sub(r'\*\*(.+?)\*\*', r'\1', formatted_answer) + formatted_answer = re.sub(r'^(\d+)\.\s+', r'\1. ', formatted_answer, flags=re.MULTILINE) + formatted_answer = formatted_answer.replace("- ", "• ") + response = ( f"Ваш вопрос:\n" f"{question_text[:200]}\n\n" - f"Ответ:\n{answer}\n\n" + f"━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n\n" + f"💬 Ответ:\n\n" + f"{formatted_answer}\n\n" ) if sources: - response += f"Источники:\n" + response += f"━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n\n" + response += f"📚 Источники:\n" for idx, source in enumerate(sources[:5], 1): title = source.get('title', 'Без названия') - response += f"{idx}. {title}\n" - response += "\nИспользуйте /mycollections для просмотра всех коллекций\n\n" + try: + from urllib.parse import unquote + title = unquote(title) + except: + pass + response += f" {idx}. {title}\n" + response += "\n💡 Используйте /mycollections для просмотра всех коллекций\n\n" response += ( - f"Статус: Premium (вопросов безлимитно)\n" - f"Всего вопросов: {user.questions_used}" + f"━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n\n" + f"✨ Статус: Premium (вопросов безлимитно)\n" + f"📊 Всего вопросов: {user.questions_used}" ) except Exception as e: @@ -83,9 +100,12 @@ async def process_premium_question(message: Message, user: User, question_text: response = ( f"Ваш вопрос:\n" f"{question_text[:200]}\n\n" - f"Ошибка при генерации ответа. Попробуйте позже.\n\n" - f"Статус: Premium\n" - f"Всего вопросов: {user.questions_used}" + f"━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n\n" + f"❌ Ошибка при генерации ответа.\n" + f"Попробуйте позже.\n\n" + f"━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n\n" + f"✨ Статус: Premium\n" + f"📊 Всего вопросов: {user.questions_used}" ) await message.answer(response, parse_mode="HTML") @@ -109,40 +129,56 @@ async def process_free_question(message: Message, user: User, question_text: str # Уже все сохранили через /rag/question + formatted_answer = answer + formatted_answer = re.sub(r'\*\*(.+?)\*\*', r'\1', formatted_answer) + formatted_answer = re.sub(r'^(\d+)\.\s+', r'\1. ', formatted_answer, flags=re.MULTILINE) + formatted_answer = formatted_answer.replace("- ", "• ") response = ( f"Ваш вопрос:\n" f"{question_text[:200]}\n\n" - f"Ответ:\n{answer}\n\n" + f"━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n\n" + f"💬 Ответ:\n\n" + f"{formatted_answer}\n\n" ) if sources: - response += f"Источники:\n" + response += f"━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n\n" + response += f"📚 Источники:\n" for idx, source in enumerate(sources[:5], 1): title = source.get('title', 'Без названия') - response += f"{idx}. {title}\n" - response += "\nИспользуйте /mycollections для просмотра всех коллекций\n\n" + try: + from urllib.parse import unquote + title = unquote(title) + except: + pass + response += f" {idx}. {title}\n" + response += "\n💡 Используйте /mycollections для просмотра всех коллекций\n\n" response += ( - f"Статус: Бесплатный доступ\n" - f"Использовано вопросов: {user.questions_used}/{settings.FREE_QUESTIONS_LIMIT}\n" - f"Осталось бесплатных: {remaining}\n\n" + f"━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n\n" + f"📊 Статус: Бесплатный доступ\n" + f"📈 Использовано вопросов: {user.questions_used}/{settings.FREE_QUESTIONS_LIMIT}\n" + f"🎯 Осталось бесплатных: {remaining}\n\n" ) if remaining <= 3 and remaining > 0: - response += f"Осталось мало вопросов! Для продолжения используйте /buy\n\n" + response += f"⚠️ Осталось мало вопросов! Для продолжения используйте /buy\n\n" - response += f"Для безлимитного доступа: /buy" + response += f"💎 Для безлимитного доступа: /buy" except Exception as e: print(f"Error generating answer: {e}") response = ( f"Ваш вопрос:\n" f"{question_text[:200]}\n\n" - f"Ошибка при генерации ответа. Попробуйте позже.\n\n" - f"Статус: Бесплатный доступ\n" - f"Использовано вопросов: {user.questions_used}/{settings.FREE_QUESTIONS_LIMIT}\n" - f"Осталось бесплатных: {remaining}\n\n" - f"Для безлимитного доступа: /buy" + f"━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n\n" + f"❌ Ошибка при генерации ответа.\n" + f"Попробуйте позже.\n\n" + f"━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n\n" + f"📊 Статус: Бесплатный доступ\n" + f"📈 Использовано вопросов: {user.questions_used}/{settings.FREE_QUESTIONS_LIMIT}\n" + f"🎯 Осталось бесплатных: {remaining}\n\n" + f"💎 Для безлимитного доступа: /buy" ) await message.answer(response, parse_mode="HTML")