diff --git a/bot.py b/bot.py index c8e7ec0..f5fc0e6 100644 --- a/bot.py +++ b/bot.py @@ -185,7 +185,6 @@ def init_menus(): # Главное меню main_menu = [ - MenuItem("🖥️ Выполнить команду", "exec_cmd", icon="🖥️", is_command=True), MenuItem("📋 Предустановленные команды", "preset_menu", icon="📋"), MenuItem("⚙️ Настройки бота", "settings_menu", icon="⚙️"), MenuItem("ℹ️ О боте", "about", icon="ℹ️"), @@ -275,7 +274,9 @@ async def start_command(update: Update, context: ContextTypes.DEFAULT_TYPE): f"👋 Привет, {user.first_name}!\n\n" f"{config.icon} *{config.name}*\n" f"_{config.description}_\n\n" - f"Используйте меню для навигации или команду /help для справки.", + f"*Просто отправьте CLI команду в чат* — я её выполню!\n\n" + f"Или используйте кнопки меню для быстрых команд.\n" + f"Команда /help покажет справку.", parse_mode="Markdown", reply_markup=menu_builder.get_keyboard("main") ) @@ -286,19 +287,27 @@ async def help_command(update: Update, context: ContextTypes.DEFAULT_TYPE): help_text = f""" 📖 *Справка по боту {config.name}* -*Основные возможности:* -• Выполнение CLI команд на вашем ПК -• Предустановленные команды в меню -• Гибкая настройка бота +*Как использовать:* +Просто отправьте любую CLI команду в чат — бот выполнит её! -*Команды:* -/start - Запустить бота -/help - Эта справка -/settings - Настройки бота -/commands - Список доступных команд +*Примеры:* +• `ls -la` — список файлов +• `pwd` — текущая директория +• `df -h` — свободное место на диске +• `git status` — статус git + +*Кнопки меню:* +• 📋 Предустановленные команды — быстрые команды по категориям +• ⚙️ Настройки бота — изменение имени, описания, иконки +• ℹ️ О боте — информация + +*Команды управления:* +/start — Главное меню +/help — Эта справка +/settings — Настройки *Безопасность:* -Команды выполняются от имени пользователя. +Команды выполняются от вашего имени. Будьте осторожны с деструктивными командами! """ await update.message.reply_text(help_text, parse_mode="Markdown") @@ -478,17 +487,6 @@ async def menu_callback(update: Update, context: ContextTypes.DEFAULT_TYPE): reply_markup=menu_builder.get_keyboard("main") ) state.current_menu = "main" - - elif callback == "exec_cmd": - state.waiting_for_input = True - state.input_type = "command" - await query.edit_message_text( - "🖥️ *Выполнение команды*\n\n" - "Отправьте команду для выполнения:\n\n" - "⚠️ _Будьте осторожны с деструктивными командами!_", - parse_mode="Markdown", - reply_markup=menu_builder.get_keyboard("main") - ) async def execute_cli_command(query, command: str): @@ -549,46 +547,36 @@ async def execute_cli_command(query, command: str): ) -async def handle_text_message(update: Update, context: ContextTypes.DEFAULT_TYPE): - """Обработка текстовых сообщений (для ввода настроек и команд).""" +async def handle_settings_input(update: Update, context: ContextTypes.DEFAULT_TYPE, text: str): + """Обработка ввода в режиме настройки.""" user_id = update.effective_user.id state = state_manager.get(user_id) - text = update.message.text.strip() - - if not state.waiting_for_input: - return - input_type = state.input_type if input_type == "name": config.set("bot_name", text) await update.message.reply_text( - f"✅ Имя бота изменено на: `{text}`", + f"✅ Имя бота изменено на: `{text}`\n\n" + f"Используйте /start для возврата в главное меню", parse_mode="Markdown" ) elif input_type == "description": config.set("bot_description", text) await update.message.reply_text( - f"✅ Описание изменено на: `{text}`", + f"✅ Описание изменено на: `{text}`\n\n" + f"Используйте /start для возврата в главное меню", parse_mode="Markdown" ) elif input_type == "icon": config.set("bot_icon_emoji", text[0] if text else "🤖") await update.message.reply_text( - f"✅ Иконка изменена на: `{text[0] if text else '🤖'}`", + f"✅ Иконка изменена на: `{text[0] if text else '🤖'}`\n\n" + f"Используйте /start для возврата в главное меню", parse_mode="Markdown" ) - elif input_type == "command": - # Выполнение произвольной команды - await update.message.reply_text( - f"⏳ *Выполнение...*\n\n`{text}`", - parse_mode="Markdown" - ) - await execute_cli_command_from_message(update, text) - elif input_type == "add_access": try: uid = int(text) @@ -620,6 +608,27 @@ async def handle_text_message(update: Update, context: ContextTypes.DEFAULT_TYPE state.input_type = None +async def handle_text_message(update: Update, context: ContextTypes.DEFAULT_TYPE): + """Обработка текстовых сообщений как CLI команд.""" + user_id = update.effective_user.id + text = update.message.text.strip() + state = state_manager.get(user_id) + + # Проверка: не в режиме настройки ли мы + if state.waiting_for_input: + await handle_settings_input(update, context, text) + return + + # Любое текстовое сообщение = CLI команда + logger.info(f"Пользователь {user_id} отправил команду: {text}") + + await update.message.reply_text( + f"⏳ *Выполнение...*\n\n`{text}`", + parse_mode="Markdown" + ) + await execute_cli_command_from_message(update, text) + + async def execute_cli_command_from_message(update: Update, command: str): """Выполнение CLI команды из сообщения.""" working_dir = config.get("working_directory", str(Path.home()))