184 lines
7.0 KiB
Python
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

from aiogram import Router
from aiogram.types import Message, InlineKeyboardMarkup, InlineKeyboardButton, CallbackQuery
from aiogram.filters import Command
import aiohttp
router = Router()
BACKEND_URL = "http://localhost:8001/api/v1"
async def get_user_collections(telegram_id: str):
try:
async with aiohttp.ClientSession() as session:
async with session.get(
f"{BACKEND_URL}/collections/",
headers={"X-Telegram-ID": telegram_id}
) as response:
if response.status == 200:
return await response.json()
return []
except Exception as e:
print(f"Error getting collections: {e}")
return []
async def get_collection_documents(collection_id: str, telegram_id: str):
try:
async with aiohttp.ClientSession() as session:
async with session.get(
f"{BACKEND_URL}/documents/collection/{collection_id}",
headers={"X-Telegram-ID": telegram_id}
) as response:
if response.status == 200:
return await response.json()
return []
except Exception as e:
print(f"Error getting documents: {e}")
return []
async def search_in_collection(collection_id: str, query: str, telegram_id: str):
try:
async with aiohttp.ClientSession() as session:
async with session.get(
f"{BACKEND_URL}/documents/collection/{collection_id}",
params={"search": query},
headers={"X-Telegram-ID": telegram_id}
) as response:
if response.status == 200:
return await response.json()
return []
except Exception as e:
print(f"Error searching: {e}")
return []
@router.message(Command("mycollections"))
async def cmd_mycollections(message: Message):
telegram_id = str(message.from_user.id)
collections = await get_user_collections(telegram_id)
if not collections:
await message.answer(
"<b>У вас пока нет коллекций</b>\n\n"
"Обратитесь к администратору для создания коллекций и добавления документов.",
parse_mode="HTML"
)
return
response = "<b>Ваши коллекции документов:</b>\n\n"
keyboard_buttons = []
for i, collection in enumerate(collections[:10], 1):
name = collection.get("name", "Без названия")
description = collection.get("description", "")
collection_id = collection.get("collection_id")
response += f"{i}. <b>{name}</b>\n"
if description:
response += f" <i>{description[:50]}...</i>\n"
response += f" ID: <code>{collection_id}</code>\n\n"
keyboard_buttons.append([
InlineKeyboardButton(
text=f"{name}",
callback_data=f"collection:{collection_id}"
)
])
keyboard = InlineKeyboardMarkup(inline_keyboard=keyboard_buttons)
response += "<i>Нажмите на коллекцию, чтобы посмотреть документы</i>"
await message.answer(response, parse_mode="HTML", reply_markup=keyboard)
@router.message(Command("search"))
async def cmd_search(message: Message):
parts = message.text.split(maxsplit=2)
if len(parts) < 3:
telegram_id = str(message.from_user.id)
collections = await get_user_collections(telegram_id)
if not collections:
await message.answer(
"<b>Использование:</b> /search &lt;collection_id&gt; &lt;запрос&gt;\n\n"
"У вас пока нет коллекций. Обратитесь к администратору.",
parse_mode="HTML"
)
return
response = "<b>Выберите коллекцию для поиска:</b>\n\n"
response += "Использование: /search &lt;collection_id&gt; &lt;запрос&gt;\n\n"
response += "<b>Доступные коллекции:</b>\n"
for collection in collections[:5]:
name = collection.get("name", "Без названия")
collection_id = collection.get("collection_id")
response += f"• <b>{name}</b>\n <code>{collection_id}</code>\n\n"
response += "Пример: /search " + collections[0].get("collection_id", "")[:8] + "... Как оформить договор?"
await message.answer(response, parse_mode="HTML")
return
collection_id = parts[1]
query = parts[2]
telegram_id = str(message.from_user.id)
await message.bot.send_chat_action(message.chat.id, "typing")
results = await search_in_collection(collection_id, query, telegram_id)
if not results:
await message.answer(
f"<b>Ничего не найдено</b>\n\n"
f"По запросу <i>\"{query}\"</i> в коллекции ничего не найдено.\n\n"
f"Попробуйте другой запрос или используйте /mycollections для просмотра доступных коллекций.",
parse_mode="HTML"
)
return
response = f"<b>Результаты поиска:</b> \"{query}\"\n\n"
for i, doc in enumerate(results[:5], 1):
title = doc.get("title", "Без названия")
content = doc.get("content", "")[:200]
response += f"{i}. <b>{title}</b>\n"
response += f" <i>{content}...</i>\n\n"
await message.answer(response, parse_mode="HTML")
@router.callback_query(lambda c: c.data.startswith("collection:"))
async def show_collection_documents(callback: CallbackQuery):
collection_id = callback.data.split(":")[1]
telegram_id = str(callback.from_user.id)
await callback.answer("Загружаю документы...")
documents = await get_collection_documents(collection_id, telegram_id)
if not documents:
await callback.message.answer(
f"<b>Коллекция пуста</b>\n\n"
f"В этой коллекции пока нет документов.\n"
f"Обратитесь к администратору для добавления документов.",
parse_mode="HTML"
)
return
response = f"<b>Документы в коллекции:</b>\n\n"
for i, doc in enumerate(documents[:10], 1):
title = doc.get("title", "Без названия")
content_preview = doc.get("content", "")[:100]
response += f"{i}. <b>{title}</b>\n"
if content_preview:
response += f" <i>{content_preview}...</i>\n"
response += "\n"
if len(documents) > 10:
response += f"\n<i>Показано 10 из {len(documents)} документов</i>"
await callback.message.answer(response, parse_mode="HTML")