Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 4 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -3,3 +3,7 @@ key.json
.DS_Store
gigakey.txt
*.crt
venv/
.env
git
.vscode
64 changes: 5 additions & 59 deletions answer/handlers/ask_bot.py
Original file line number Diff line number Diff line change
@@ -1,74 +1,20 @@
import logging

import httpx
from aiogram import Router
from aiogram.types import Message

from answer.services.bot_service import get_bot_service
from answer.settings import Settings, get_settings
from answer.utils.validation import (
get_safe_user_info,
validate_message,
validate_question,
)


logger = logging.getLogger(__name__)
router = Router()
settings: Settings = get_settings()


async def call_internal_api(text: str, chat_id: str = "", generate_ai_response: bool = False):
"""Вызов внутреннего API через HTTP-запрос к эндпоинту /greet"""
try:
request_data = {"text": text, "generate_ai_response": generate_ai_response, "user_chat_id": chat_id}

base_url = f"http://{settings.HOST}:{settings.PORT}"

async with httpx.AsyncClient() as client:
response = await client.post(
f"{base_url}/greet", json=request_data, headers={"Content-Type": "application/json"}, timeout=30.0
)

if response.status_code == 200:
return response.json()
else:
logger.error(f"HTTP ошибка {response.status_code}: {response.text}")
return None

except Exception as e:
logger.error(f"Ошибка HTTP-запроса к внутреннему API: {e}", exc_info=True)
return None


async def save_conversation_api(user_chat_id: str, request: str, response: str, is_response_with_buttons: bool = False):
"""Сохранение диалога через API"""
try:
base_url = f"http://{settings.HOST}:{settings.PORT}"
request_data = {
"user_chat_id": user_chat_id,
"request": request,
"response": response,
"is_response_with_buttons": is_response_with_buttons,
}

async with httpx.AsyncClient() as client:
response = await client.post(
f"{base_url}/conversations",
json=request_data,
headers={"Content-Type": "application/json"},
timeout=10.0,
)

if response.status_code == 200:
logger.info(f"Диалог успешно сохранен для пользователя {user_chat_id}")
return True
else:
logger.error(f"Ошибка сохранения диалога: {response.status_code} - {response.text}")
return False

except Exception as e:
logger.error(f"Ошибка HTTP-запроса сохранения диалога: {e}", exc_info=True)
return False
bot_service = get_bot_service()


@router.message()
Expand Down Expand Up @@ -98,7 +44,7 @@ async def handle_any_message(message: Message):

search_message = await message.answer("🔍 Ищу информацию и готовлю развернутый ответ...")

api_result = await call_internal_api(
api_result = await bot_service.generate_response(
text=validated_question, chat_id=str(message.chat.id), generate_ai_response=True
)

Expand All @@ -113,7 +59,7 @@ async def handle_any_message(message: Message):

answer = api_result["ai_answer"]

await save_conversation_api(str(message.chat.id), validated_question, answer, is_response_with_buttons=False)
bot_service.save_conversation(str(message.chat.id), validated_question, answer, is_response_with_buttons=False)
await search_message.delete()
await message.answer(f"💡 <b>Ответ:</b>\n\n{answer}\n\n{settings.warning_message}")

Expand Down Expand Up @@ -310,4 +256,4 @@ async def handle_topic_selection(callback: CallbackQuery, state: FSMContext):
logger.error(f"Ошибка выбора топика: {e}", exc_info=True)
await callback.answer("❌ Произошла ошибка при получении информации по топику.")
await state.clear()
'''
'''
43 changes: 3 additions & 40 deletions answer/handlers/start.py
Original file line number Diff line number Diff line change
@@ -1,55 +1,18 @@
import logging

import httpx
from aiogram import F, Router
from aiogram.filters import CommandStart
from aiogram.types import CallbackQuery, Message

from answer.handlers.keyboards import get_base_menu
from answer.services.bot_service import get_bot_service
from answer.settings import Settings, get_settings
from answer.utils.validation import get_safe_user_info, validate_callback_query, validate_message


logger = logging.getLogger(__name__)
start_router = Router()
settings: Settings = get_settings()


async def get_or_create_user_api(chat_id: str):
"""Получение или создание пользователя через API. Возвращает (user_data, is_new_user)"""
try:
base_url = f"http://{settings.HOST}:{settings.PORT}"

async with httpx.AsyncClient() as client:
get_response = await client.get(f"{base_url}/users/{chat_id}", timeout=10.0)

if get_response.status_code == 200:
user_data = get_response.json()
logger.info(f"Найден существующий пользователь: {chat_id}")
return user_data, False

elif get_response.status_code == 404:
request_data = {"chat_id": chat_id}
create_response = await client.post(
f"{base_url}/users", json=request_data, headers={"Content-Type": "application/json"}, timeout=10.0
)

if create_response.status_code == 200:
user_data = create_response.json()
logger.info(f"Создан новый пользователь: {chat_id}")
return user_data, True
else:
logger.error(
f"Ошибка создания пользователя: {create_response.status_code} - {create_response.text}"
)
return None, False
else:
logger.error(f"Ошибка получения пользователя: {get_response.status_code} - {get_response.text}")
return None, False

except Exception as e:
logger.error(f"Ошибка HTTP-запроса пользователя: {e}", exc_info=True)
return None, False
bot_service = get_bot_service()


@start_router.message(CommandStart())
Expand All @@ -66,7 +29,7 @@ async def command_start_handler(message: Message) -> None:

logger.info(f"Received /start command from user {message.from_user.id}")
chat_id = str(message.chat.id)
user_data, is_new_user = await get_or_create_user_api(chat_id)
user_data, is_new_user = bot_service.get_or_create_user(chat_id)

if user_data:
if is_new_user:
Expand Down
Loading