Simplify: any text message is now a CLI command
Co-authored-by: Qwen-Coder <qwen-coder@alibabacloud.com>
This commit is contained in:
parent
2506d8c00c
commit
c852b09148
91
bot.py
91
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()))
|
||||
|
|
|
|||
Loading…
Reference in New Issue