diff --git a/handlers/admin.py b/handlers/admin.py index 40aac2e..bc02acb 100644 --- a/handlers/admin.py +++ b/handlers/admin.py @@ -38,6 +38,9 @@ class BroadcastState(StatesGroup): class SwarmTaskState(StatesGroup): waiting_for_task = State() +class JuristState(StatesGroup): + waiting_for_question = State() + # ============================================================================= # SWARM COMMAND CENTER # ============================================================================= @@ -55,6 +58,87 @@ async def process_swarm_task(message: Message, state: FSMContext): # ... (код остается прежним) pass +# ============================================================================= +# ЮРИДИЧЕСКИЙ ПОМОЩНИК (NotebookLM) +# ============================================================================= + +@router.message(Command('jurist')) +@router.message(F.text == '⚖️ Юрист (ЖК РФ)') +@admin_only +async def cmd_jurist(message: Message, state: FSMContext): + """Активация юридического помощника""" + await message.answer( + "⚖️ ЮРИДИЧЕСКИЙ ПОМОЩНИК (ЖК РФ)\n\n" + "Напишите ваш вопрос для анализа на основе судебных дел и ЖК РФ.\n\n" + "Я проанализирую ваш запрос через NotebookLM.", + parse_mode='HTML' + ) + await state.set_state(JuristState.waiting_for_question) + +@router.callback_query(F.data == 'admin_jurist') +@admin_callback_only +async def cb_admin_jurist(callback: CallbackQuery, state: FSMContext): + """Callback-активация юридического помощника""" + await callback.answer() + await callback.message.answer( + "⚖️ ЮРИДИЧЕСКИЙ ПОМОЩНИК (ЖК РФ)\n\n" + "Напишите ваш вопрос для анализа на основе судебных дел и ЖК РФ.\n\n" + "Я проанализирую ваш запрос через NotebookLM.", + parse_mode='HTML' + ) + await state.set_state(JuristState.waiting_for_question) + +@router.message(JuristState.waiting_for_question) +@admin_only +async def process_jurist_question(message: Message, state: FSMContext): + """Обработка вопроса к юристу через NotebookLM""" + status_msg = await message.answer( + "⏳ Отправляю запрос в NotebookLM, анализирую судебные материалы и законы (это займет около 10-15 секунд)...", + parse_mode='HTML' + ) + + import asyncio + import os + + cmd = [ + "/home/matrixhasyou/.local/bin/nlm", "query", "notebook", + "00ed7d92-1ab2-4159-ac72-1d0c4be21377", + message.text + ] + env = os.environ.copy() + + try: + proc = await asyncio.create_subprocess_exec( + *cmd, + stdout=asyncio.subprocess.PIPE, + stderr=asyncio.subprocess.PIPE, + env=env + ) + stdout, stderr = await proc.communicate() + + output = stdout.decode('utf-8').strip() + error = stderr.decode('utf-8').strip() + + # Убираем предупреждения о новой версии из вывода nlm + if "Update available:" in output: + output = output.split("Update available:")[0].strip() + + if proc.returncode == 0: + if len(output) > 4000: + parts = [output[i:i+4000] for i in range(0, len(output), 4000)] + await status_msg.edit_text(f"⚖️ Анализ NotebookLM (часть 1):\n\n{parts[0]}", parse_mode='HTML') + for part in parts[1:]: + await message.answer(part, parse_mode='HTML') + else: + await status_msg.edit_text(f"⚖️ Анализ NotebookLM:\n\n{output}", parse_mode='HTML') + else: + await status_msg.edit_text(f"❌ Ошибка запроса к NotebookLM:\n{error or output}") + except Exception as e: + await status_msg.edit_text(f"❌ Внутренняя ошибка бота: {str(e)}") + finally: + await state.clear() + + @router.message(F.text & ~F.text.startswith('/') & F.chat.type == 'private') @admin_only async def neural_proxy_handler(message: Message): diff --git a/keyboards/admin_menu.py b/keyboards/admin_menu.py index 1f2fdc3..b7c6566 100644 --- a/keyboards/admin_menu.py +++ b/keyboards/admin_menu.py @@ -45,6 +45,7 @@ def get_admin_main_menu() -> InlineKeyboardMarkup: ) builder.row( InlineKeyboardButton(text='⚡ Автоверификация', callback_data='admin_auto_verify'), + InlineKeyboardButton(text='⚖️ Юрист (ЖК РФ)', callback_data='admin_jurist'), ) builder.row( InlineKeyboardButton(text='❓ Помощь', callback_data='admin_help'), @@ -75,6 +76,7 @@ def get_admin_reply_menu() -> ReplyKeyboardMarkup: ) builder.row( KeyboardButton(text='📤 Рассылка'), + KeyboardButton(text='⚖️ Юрист (ЖК РФ)'), ) builder.row( KeyboardButton(text='🚫 Отозвать вериф.'),