#!/usr/bin/env python3 """Обработчики команд бота (/start, /menu, /help, /settings).""" import logging from telegram import Update from telegram.ext import ContextTypes # Импорты из модулей bot/ from bot.config import config, state_manager, server_manager, menu_builder from bot.utils.decorators import check_access logger = logging.getLogger(__name__) @check_access async def start_command(update: Update, context: ContextTypes.DEFAULT_TYPE): """Обработка команды /start.""" user = update.effective_user logger.info(f"Пользователь {user.username} ({user.id}) запустил бота") state_manager.reset(user.id) # Показать текущую директорию и сервер working_dir = config.working_directory server = server_manager.get("local") server_desc = server.description if server else "localhost" await update.message.reply_text( f"👋 Привет, {user.first_name}!\n\n" f"{config.icon} *{config.name}*\n" f"_{config.description}_\n\n" f"*Просто отправьте CLI команду в чат* — я её выполню!\n\n" f"🖥️ *Текущий сервер:* `{server_desc}`\n" f"📁 *Рабочая директория:* `{working_dir}`\n\n" f"Используйте `cd путь` для смены директории.\n" f"Или выберите сервер в меню.\n" f"Команда /help покажет справку.", parse_mode="Markdown", reply_markup=menu_builder.get_keyboard("main", user_id=update.effective_user.id) ) @check_access async def menu_command(update: Update, context: ContextTypes.DEFAULT_TYPE): """Обработка команды /menu - показывает главное меню.""" user = update.effective_user state = state_manager.get(user.id) # Не сбрасываем состояние - сохраняем ai_chat_mode и другие настройки state.current_menu = "main" # Показать текущую директорию и сервер working_dir = state.working_directory or config.working_directory server = server_manager.get(state.current_server) server_desc = server.description if server else state.current_server await update.message.reply_text( f"🏠 *Главное меню*\n\n" f"🖥️ *Сервер:* `{server_desc}`\n" f"📁 *Директория:* `{working_dir}`\n\n" f"Выберите действие:", parse_mode="Markdown", reply_markup=menu_builder.get_keyboard("main", user_id=update.effective_user.id, state=state) ) @check_access async def help_command(update: Update, context: ContextTypes.DEFAULT_TYPE): """Обработка команды /help.""" help_text = f""" 📖 *Справка по боту {config.name}* *Как использовать:* Просто отправьте любую CLI команду в чат — бот выполнит её! *Примеры:* • `ls -la` — список файлов • `pwd` — текущая директория • `df -h` — свободное место на диске • `git status` — статус git *Навигация по директориям:* • `cd путь` — сменить директорию (например, `cd git/project`) • `cd ..` — на уровень вверх • `cd ~` — в домашнюю директорию • `pwd` — показать текущую директорию *Кнопки меню:* • 📋 Предустановленные команды — быстрые команды по категориям • ⚙️ Настройки бота — изменение имени, описания, иконки • ℹ️ О боте — информация *Команды управления:* /start — Запустить бота, главное меню /menu — Показать главное меню с кнопками /help — Эта справка /settings — Настройки *Безопасность:* Команды выполняются от вашего имени. Будьте осторожны с деструктивными командами! """ await update.message.reply_text(help_text, parse_mode="Markdown") @check_access async def settings_command(update: Update, context: ContextTypes.DEFAULT_TYPE): """Обработка команды /settings.""" state = state_manager.get(update.effective_user.id) state.current_menu = "settings" await update.message.reply_text( "⚙️ *Настройки бота*", parse_mode="Markdown", reply_markup=menu_builder.get_keyboard("settings") )