Simplify: any text message is now a CLI command

Co-authored-by: Qwen-Coder <qwen-coder@alibabacloud.com>
This commit is contained in:
mirivlad 2026-02-23 15:57:03 +08:00
parent 2506d8c00c
commit c852b09148
1 changed files with 50 additions and 41 deletions

91
bot.py
View File

@ -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")
@ -479,17 +488,6 @@ async def menu_callback(update: Update, context: ContextTypes.DEFAULT_TYPE):
)
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):
"""Выполнение CLI команды."""
@ -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()))