Skip to content

Commit c837720

Browse files
authored
Merge pull request #50 from profcomff/refactor/telegram-bot
refactor: исправил вызов api в боте
2 parents d00d873 + 3c8c9ec commit c837720

6 files changed

Lines changed: 352 additions & 263 deletions

File tree

.gitignore

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,3 +3,7 @@ key.json
33
.DS_Store
44
gigakey.txt
55
*.crt
6+
venv/
7+
.env
8+
git
9+
.vscode

answer/handlers/ask_bot.py

Lines changed: 5 additions & 59 deletions
Original file line numberDiff line numberDiff line change
@@ -1,74 +1,20 @@
11
import logging
22

3-
import httpx
43
from aiogram import Router
54
from aiogram.types import Message
65

6+
from answer.services.bot_service import get_bot_service
77
from answer.settings import Settings, get_settings
88
from answer.utils.validation import (
99
get_safe_user_info,
1010
validate_message,
1111
validate_question,
1212
)
1313

14-
1514
logger = logging.getLogger(__name__)
1615
router = Router()
1716
settings: Settings = get_settings()
18-
19-
20-
async def call_internal_api(text: str, chat_id: str = "", generate_ai_response: bool = False):
21-
"""Вызов внутреннего API через HTTP-запрос к эндпоинту /greet"""
22-
try:
23-
request_data = {"text": text, "generate_ai_response": generate_ai_response, "user_chat_id": chat_id}
24-
25-
base_url = f"http://{settings.HOST}:{settings.PORT}"
26-
27-
async with httpx.AsyncClient() as client:
28-
response = await client.post(
29-
f"{base_url}/greet", json=request_data, headers={"Content-Type": "application/json"}, timeout=30.0
30-
)
31-
32-
if response.status_code == 200:
33-
return response.json()
34-
else:
35-
logger.error(f"HTTP ошибка {response.status_code}: {response.text}")
36-
return None
37-
38-
except Exception as e:
39-
logger.error(f"Ошибка HTTP-запроса к внутреннему API: {e}", exc_info=True)
40-
return None
41-
42-
43-
async def save_conversation_api(user_chat_id: str, request: str, response: str, is_response_with_buttons: bool = False):
44-
"""Сохранение диалога через API"""
45-
try:
46-
base_url = f"http://{settings.HOST}:{settings.PORT}"
47-
request_data = {
48-
"user_chat_id": user_chat_id,
49-
"request": request,
50-
"response": response,
51-
"is_response_with_buttons": is_response_with_buttons,
52-
}
53-
54-
async with httpx.AsyncClient() as client:
55-
response = await client.post(
56-
f"{base_url}/conversations",
57-
json=request_data,
58-
headers={"Content-Type": "application/json"},
59-
timeout=10.0,
60-
)
61-
62-
if response.status_code == 200:
63-
logger.info(f"Диалог успешно сохранен для пользователя {user_chat_id}")
64-
return True
65-
else:
66-
logger.error(f"Ошибка сохранения диалога: {response.status_code} - {response.text}")
67-
return False
68-
69-
except Exception as e:
70-
logger.error(f"Ошибка HTTP-запроса сохранения диалога: {e}", exc_info=True)
71-
return False
17+
bot_service = get_bot_service()
7218

7319

7420
@router.message()
@@ -98,7 +44,7 @@ async def handle_any_message(message: Message):
9844

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

101-
api_result = await call_internal_api(
47+
api_result = await bot_service.generate_response(
10248
text=validated_question, chat_id=str(message.chat.id), generate_ai_response=True
10349
)
10450

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

11460
answer = api_result["ai_answer"]
11561

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

@@ -310,4 +256,4 @@ async def handle_topic_selection(callback: CallbackQuery, state: FSMContext):
310256
logger.error(f"Ошибка выбора топика: {e}", exc_info=True)
311257
await callback.answer("❌ Произошла ошибка при получении информации по топику.")
312258
await state.clear()
313-
'''
259+
'''

answer/handlers/start.py

Lines changed: 3 additions & 40 deletions
Original file line numberDiff line numberDiff line change
@@ -1,55 +1,18 @@
11
import logging
22

3-
import httpx
43
from aiogram import F, Router
54
from aiogram.filters import CommandStart
65
from aiogram.types import CallbackQuery, Message
76

87
from answer.handlers.keyboards import get_base_menu
8+
from answer.services.bot_service import get_bot_service
99
from answer.settings import Settings, get_settings
1010
from answer.utils.validation import get_safe_user_info, validate_callback_query, validate_message
1111

12-
1312
logger = logging.getLogger(__name__)
1413
start_router = Router()
1514
settings: Settings = get_settings()
16-
17-
18-
async def get_or_create_user_api(chat_id: str):
19-
"""Получение или создание пользователя через API. Возвращает (user_data, is_new_user)"""
20-
try:
21-
base_url = f"http://{settings.HOST}:{settings.PORT}"
22-
23-
async with httpx.AsyncClient() as client:
24-
get_response = await client.get(f"{base_url}/users/{chat_id}", timeout=10.0)
25-
26-
if get_response.status_code == 200:
27-
user_data = get_response.json()
28-
logger.info(f"Найден существующий пользователь: {chat_id}")
29-
return user_data, False
30-
31-
elif get_response.status_code == 404:
32-
request_data = {"chat_id": chat_id}
33-
create_response = await client.post(
34-
f"{base_url}/users", json=request_data, headers={"Content-Type": "application/json"}, timeout=10.0
35-
)
36-
37-
if create_response.status_code == 200:
38-
user_data = create_response.json()
39-
logger.info(f"Создан новый пользователь: {chat_id}")
40-
return user_data, True
41-
else:
42-
logger.error(
43-
f"Ошибка создания пользователя: {create_response.status_code} - {create_response.text}"
44-
)
45-
return None, False
46-
else:
47-
logger.error(f"Ошибка получения пользователя: {get_response.status_code} - {get_response.text}")
48-
return None, False
49-
50-
except Exception as e:
51-
logger.error(f"Ошибка HTTP-запроса пользователя: {e}", exc_info=True)
52-
return None, False
15+
bot_service = get_bot_service()
5316

5417

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

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

7134
if user_data:
7235
if is_new_user:

0 commit comments

Comments
 (0)