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 = [
|
main_menu = [
|
||||||
MenuItem("🖥️ Выполнить команду", "exec_cmd", icon="🖥️", is_command=True),
|
|
||||||
MenuItem("📋 Предустановленные команды", "preset_menu", icon="📋"),
|
MenuItem("📋 Предустановленные команды", "preset_menu", icon="📋"),
|
||||||
MenuItem("⚙️ Настройки бота", "settings_menu", icon="⚙️"),
|
MenuItem("⚙️ Настройки бота", "settings_menu", icon="⚙️"),
|
||||||
MenuItem("ℹ️ О боте", "about", 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"👋 Привет, {user.first_name}!\n\n"
|
||||||
f"{config.icon} *{config.name}*\n"
|
f"{config.icon} *{config.name}*\n"
|
||||||
f"_{config.description}_\n\n"
|
f"_{config.description}_\n\n"
|
||||||
f"Используйте меню для навигации или команду /help для справки.",
|
f"*Просто отправьте CLI команду в чат* — я её выполню!\n\n"
|
||||||
|
f"Или используйте кнопки меню для быстрых команд.\n"
|
||||||
|
f"Команда /help покажет справку.",
|
||||||
parse_mode="Markdown",
|
parse_mode="Markdown",
|
||||||
reply_markup=menu_builder.get_keyboard("main")
|
reply_markup=menu_builder.get_keyboard("main")
|
||||||
)
|
)
|
||||||
|
|
@ -286,19 +287,27 @@ async def help_command(update: Update, context: ContextTypes.DEFAULT_TYPE):
|
||||||
help_text = f"""
|
help_text = f"""
|
||||||
📖 *Справка по боту {config.name}*
|
📖 *Справка по боту {config.name}*
|
||||||
|
|
||||||
*Основные возможности:*
|
*Как использовать:*
|
||||||
• Выполнение CLI команд на вашем ПК
|
Просто отправьте любую CLI команду в чат — бот выполнит её!
|
||||||
• Предустановленные команды в меню
|
|
||||||
• Гибкая настройка бота
|
|
||||||
|
|
||||||
*Команды:*
|
*Примеры:*
|
||||||
/start - Запустить бота
|
• `ls -la` — список файлов
|
||||||
/help - Эта справка
|
• `pwd` — текущая директория
|
||||||
/settings - Настройки бота
|
• `df -h` — свободное место на диске
|
||||||
/commands - Список доступных команд
|
• `git status` — статус git
|
||||||
|
|
||||||
|
*Кнопки меню:*
|
||||||
|
• 📋 Предустановленные команды — быстрые команды по категориям
|
||||||
|
• ⚙️ Настройки бота — изменение имени, описания, иконки
|
||||||
|
• ℹ️ О боте — информация
|
||||||
|
|
||||||
|
*Команды управления:*
|
||||||
|
/start — Главное меню
|
||||||
|
/help — Эта справка
|
||||||
|
/settings — Настройки
|
||||||
|
|
||||||
*Безопасность:*
|
*Безопасность:*
|
||||||
Команды выполняются от имени пользователя.
|
Команды выполняются от вашего имени.
|
||||||
Будьте осторожны с деструктивными командами!
|
Будьте осторожны с деструктивными командами!
|
||||||
"""
|
"""
|
||||||
await update.message.reply_text(help_text, parse_mode="Markdown")
|
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"
|
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):
|
async def execute_cli_command(query, command: str):
|
||||||
"""Выполнение CLI команды."""
|
"""Выполнение 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
|
user_id = update.effective_user.id
|
||||||
state = state_manager.get(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
|
input_type = state.input_type
|
||||||
|
|
||||||
if input_type == "name":
|
if input_type == "name":
|
||||||
config.set("bot_name", text)
|
config.set("bot_name", text)
|
||||||
await update.message.reply_text(
|
await update.message.reply_text(
|
||||||
f"✅ Имя бота изменено на: `{text}`",
|
f"✅ Имя бота изменено на: `{text}`\n\n"
|
||||||
|
f"Используйте /start для возврата в главное меню",
|
||||||
parse_mode="Markdown"
|
parse_mode="Markdown"
|
||||||
)
|
)
|
||||||
|
|
||||||
elif input_type == "description":
|
elif input_type == "description":
|
||||||
config.set("bot_description", text)
|
config.set("bot_description", text)
|
||||||
await update.message.reply_text(
|
await update.message.reply_text(
|
||||||
f"✅ Описание изменено на: `{text}`",
|
f"✅ Описание изменено на: `{text}`\n\n"
|
||||||
|
f"Используйте /start для возврата в главное меню",
|
||||||
parse_mode="Markdown"
|
parse_mode="Markdown"
|
||||||
)
|
)
|
||||||
|
|
||||||
elif input_type == "icon":
|
elif input_type == "icon":
|
||||||
config.set("bot_icon_emoji", text[0] if text else "🤖")
|
config.set("bot_icon_emoji", text[0] if text else "🤖")
|
||||||
await update.message.reply_text(
|
await update.message.reply_text(
|
||||||
f"✅ Иконка изменена на: `{text[0] if text else '🤖'}`",
|
f"✅ Иконка изменена на: `{text[0] if text else '🤖'}`\n\n"
|
||||||
|
f"Используйте /start для возврата в главное меню",
|
||||||
parse_mode="Markdown"
|
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":
|
elif input_type == "add_access":
|
||||||
try:
|
try:
|
||||||
uid = int(text)
|
uid = int(text)
|
||||||
|
|
@ -620,6 +608,27 @@ async def handle_text_message(update: Update, context: ContextTypes.DEFAULT_TYPE
|
||||||
state.input_type = None
|
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):
|
async def execute_cli_command_from_message(update: Update, command: str):
|
||||||
"""Выполнение CLI команды из сообщения."""
|
"""Выполнение CLI команды из сообщения."""
|
||||||
working_dir = config.get("working_directory", str(Path.home()))
|
working_dir = config.get("working_directory", str(Path.home()))
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue