diff --git a/pyvenv.cfg b/pyvenv.cfg new file mode 100644 index 0000000..ce6234d --- /dev/null +++ b/pyvenv.cfg @@ -0,0 +1,5 @@ +home = /usr/bin +include-system-site-packages = false +version = 3.12.3 +executable = /usr/bin/python3.12 +command = /usr/bin/python3 -m venv /home/domi/vhbot diff --git a/requirements.txt b/requirements.txt new file mode 100644 index 0000000..63be9e1 --- /dev/null +++ b/requirements.txt @@ -0,0 +1,2 @@ +telegram +paramiko diff --git a/vhbot.py b/vhbot.py new file mode 100644 index 0000000..9f87dda --- /dev/null +++ b/vhbot.py @@ -0,0 +1,102 @@ +import logging +from telegram import Update +from telegram.ext import Application, CommandHandler, ContextTypes +import subprocess + +# Путь к vhserver +VHSERVER_PATH = '/home/domi/linuxgsm' + +# Настройка логирования +logging.basicConfig( + level=logging.INFO, + format='%(asctime)s - %(name)s - %(levelname)s - %(message)s', +) +logger = logging.getLogger(__name__) + +# Глобальный список для хранения ID всех сообщений бота +bot_message_ids = [] + +# Команда для управления сервером +def run_local_command(command): + try: + result = subprocess.run(command, shell=True, check=True, capture_output=True, text=True) + output = result.stdout + error = result.stderr + return output, error + except subprocess.CalledProcessError as e: + return None, str(e) + +# Функция для удаления всех предыдущих сообщений бота +async def delete_previous_messages(update: Update, context: ContextTypes.DEFAULT_TYPE): + global bot_message_ids + for message_id in bot_message_ids: + try: + await context.bot.delete_message(chat_id=update.effective_chat.id, message_id=message_id) + except Exception as e: + logger.warning(f"Не удалось удалить сообщение {message_id}: {e}") + # Очищаем список сообщений + bot_message_ids = [] + +# Команда для запуска сервера +async def start_server(update: Update, context: ContextTypes.DEFAULT_TYPE): + logger.info("Получена команда /start_server") + await delete_previous_messages(update, context) # Удаляем все предыдущие сообщения + output, error = run_local_command(f'cd {VHSERVER_PATH} && ./vhserver start') + if error: + message = await update.message.reply_text(f'Ошибка: {error}') + else: + message = await update.message.reply_text('Сервер запущен.') + # Добавляем ID нового сообщения в список + bot_message_ids.append(message.message_id) + +# Команда для остановки сервера +async def stop_server(update: Update, context: ContextTypes.DEFAULT_TYPE): + logger.info("Получена команда /stop_server") + await delete_previous_messages(update, context) # Удаляем все предыдущие сообщения + output, error = run_local_command(f'cd {VHSERVER_PATH} && ./vhserver stop') + if error: + message = await update.message.reply_text(f'Ошибка: {error}') + else: + message = await update.message.reply_text('Сервер остановлен.') + # Добавляем ID нового сообщения в список + bot_message_ids.append(message.message_id) + +# Команда для проверки статуса сервера +async def status_server(update: Update, context: ContextTypes.DEFAULT_TYPE): + logger.info("Получена команда /status_server") + await delete_previous_messages(update, context) # Удаляем все предыдущие сообщения + output, error = run_local_command(f'cd {VHSERVER_PATH} && ./vhserver details') + if error: + message = await update.message.reply_text(f'Ошибка: {error}') + else: + message = await update.message.reply_text(f'Статус сервера: {output}') + # Добавляем ID нового сообщения в список + bot_message_ids.append(message.message_id) + +# Команда для обновления сервера +async def update_server(update: Update, context: ContextTypes.DEFAULT_TYPE): + logger.info("Получена команда /update_server") + await delete_previous_messages(update, context) # Удаляем все предыдущие сообщения + output, error = run_local_command(f'cd {VHSERVER_PATH} && ./vhserver update') + if error: + message = await update.message.reply_text(f'Ошибка: {error}') + else: + message = await update.message.reply_text('Сервер обновлен.') + # Добавляем ID нового сообщения в список + bot_message_ids.append(message.message_id) + +# Основная функция +def main(): + application = Application.builder().token("6517664407:AAE9Tt-sjnU20MdrGUhdIyY-R6LU8eNznFs").build() + + # Регистрация команд + application.add_handler(CommandHandler("start_server", start_server)) + application.add_handler(CommandHandler("stop_server", stop_server)) + application.add_handler(CommandHandler("status_server", status_server)) + application.add_handler(CommandHandler("update_server", update_server)) # Добавляем новую команду + + # Запуск бота + application.run_polling() + +if __name__ == '__main__': + main()