Основной функционал для ark

This commit is contained in:
Евгений Храмов 2023-05-21 23:11:18 +03:00
commit 5918ee50b5
5 changed files with 1077 additions and 539 deletions

82
.gitignore vendored

@ -1,4 +1,78 @@
__pycache__
# Ignore dynaconf secret files
.secrets.*
.idea
# This file is used to ignore files which are generated
# ----------------------------------------------------------------------------
*~
*.autosave
*.a
*.core
*.moc
*.o
*.obj
*.orig
*.rej
*.so
*.so.*
*_pch.h.cpp
*_resource.rc
*.qm
.#*
*.*#
core
!core/
tags
.DS_Store
.directory
*.debug
Makefile*
*.prl
*.app
moc_*.cpp
ui_*.h
qrc_*.cpp
Thumbs.db
*.res
*.rc
/.qmake.cache
/.qmake.stash
# qtcreator generated files
*.pro.user*
CMakeLists.txt.user*
# xemacs temporary files
*.flc
# Vim temporary files
.*.swp
# Visual Studio generated files
*.ib_pdb_index
*.idb
*.ilk
*.pdb
*.sln
*.suo
*.vcproj
*vcproj.*.*.user
*.ncb
*.sdf
*.opensdf
*.vcxproj
*vcxproj.*
# MinGW generated files
*.Debug
*.Release
# Python byte code
*.pyc
# Binaries
# --------
*.dll
*.exe
#pyproject
*.pyproject
*.pyproject.user
*.ui

@ -1,11 +1,14 @@
![](https://gitflic.ru/project/xpamych/hln-a/blob/raw?file=logo.png&commit=cd31f5b44ee0cafa0ee7c0e683d48f2c70ad4b90)
![](https://gitflic.ru/project/plemyakh/hln-a/blob/raw?file=logo.png&commit=cd31f5b44ee0cafa0ee7c0e683d48f2c70ad4b90)
![](https://img.shields.io/badge/Python-3.11-blue?style=flat&logo=python)![](https://img.shields.io/badge/Qt-6.0-green?style=flat&logo=qt)[![](https://img.shields.io/discord/817759634105827358?label=%D0%9F%D0%BB%D0%B5%D0%BC%D1%8F-%D0%A5&logo=discord)](https://discord.gg/3cFebGvPQt)[![](https://img.shields.io/badge/Telegram-%D0%9F%D0%BB%D0%B5%D0%BC%D1%8F-%D0%A5?style=flat&logo=telegram)](https://t.me/plemyakh)[![](https://img.shields.io/badge/Boosty-Boosty-blue?style=flat&color=orange&logo=boosty)](https://boosty.to/xpamych/donate)
# Описание
Этот инструмент позволяет управлять выделенным сервером (dedicated server) ARK Survival Evolved на Linux.
Этот инструмент позволяет управлять выделенным сервером (dedicated server) ARK Survival Evolved и\или 7Days to Die на Linux.
Он предоставляет множество функций, чтобы получить полный список, ознакомьтесь с разделом использования. (находится в разработке и может содержать ошибки)
# Установка
```shell
curl https://www.arsenm.dev/lure.sh | bash & lure ar -n xpamych-repo -u https://gitflic.ru/project/xpamych/xpamych-lure-repo.git & lure in hlna-git
curl https://www.elara.ws/lure.sh | bash & lure ar -n xpamych-repo -u https://gitflic.ru/project/xpamych/xpamych-lure-repo.git & lure in hlna-git
```
# Использование
@ -16,9 +19,9 @@ hlna config
Для запуска, сконфигурированного сервера или кластера
```bash
hlna start
hlna start -g ark
```
Подробнее в [WIKI](https://gitflic.ru/project/xpamych/hln-a/wiki)
# Спасибы
Сей софт написан при активном участии Sitisll, Xpamych, Vano, а так же при моральной поддержке Nezrimka и Vajka))
Сей софт написан при активном участии [Sitisll](https://gitflic.ru/user/sitisll), [Xpamych](https://gitflic.ru/user/xpamych), Vano, ChatGPT, а так же при моральной поддержке Nezrimka и [Vajka](https://gitflic.ru/user/vajka))

917
hlna.py

File diff suppressed because it is too large Load Diff

@ -1,167 +0,0 @@
#!/usr/bin/env python3
import errno
import time
import sys
import os
import telebot
from telebot import types
import subprocess
import yaml
import colorama
import hlna
list_config = hlna.list_config
def start():
if not os.path.exists(f"{hlna.home_dir}/.config/hlna/bot/hlna_bot"):
key_api = input("Укажите ключ бота\n")
os.chdir(f"{hlna.home_dir}/.config/hlna/")
try:
os.mkdir("bot")
except OSError as e:
if e.errno == errno.EEXIST:
print('Каталог создан')
else:
raise
create_config(key_api)
else:
x = input("Уже есть запомненный ключа api. Запустить его? Y/n \n")
if x == "" or x.lower == 'y':
read_config()
elif x == "n":
os.remove(f"{hlna.home_dir}/.config/hlna/bot/hlna_bot")
start()
def check_status(m):
for i in list_config:
data = hlna.read_yaml(i)
hlna.print_line(data)
x = os.system(f"lsof -w -i :{data['Port']}")
n_srv = data['SessionName']
if x != 0:
hlna_bot.send_message(m.chat.id, text=f"Сервер {n_srv} не работает 🛑")
elif x == 0:
hlna_bot.send_message(m.chat.id, text=f"Сервер {n_srv} запустился 🟢")
def read_config():
with open(f"{hlna.home_dir}/.config/hlna/bot/hlna_bot", "r") as yamlfile:
data = yaml.load(yamlfile, Loader=yaml.FullLoader)
return data[0]
def create_config(key_api):
config_hlna_bot = [
{
'key_api': key_api,
}
]
with open(f"{hlna.home_dir}/.config/hlna/bot/hlna_bot", 'w') as yamlfile:
yaml.dump(config_hlna_bot, yamlfile)
print(colorama.Fore.GREEN + "Конфиг бота создан" + colorama.Style.RESET_ALL)
start()
data = read_config()
k_api = data['key_api']
hlna_bot = telebot.TeleBot(f"{k_api}", parse_mode=None)
@hlna_bot.message_handler(commands=["start"])
def m_mainmenu(m):
menu = types.ReplyKeyboardMarkup(resize_keyboard=True)
k_start = types.KeyboardButton("🦖 Старт")
k_stop = types.KeyboardButton("🦇 Выключить")
menu.add(k_start, k_stop)
k_restart = types.KeyboardButton("🦕 Перезагрузить")
k_update = types.KeyboardButton("🔸 Обновить")
menu.add(k_restart, k_update)
k_status = types.KeyboardButton("🧾 Статус")
menu.add(k_status)
k_mods = types.KeyboardButton("⏬ Установка модов")
menu.add(k_mods)
hlna_bot.send_message(m.chat.id, text="Привет, {0.first_name}! Это панель управления сервером".format(m.from_user),
reply_markup=menu)
@hlna_bot.message_handler(content_types=["text"])
def m_chose(m):
if m.text.strip() == '🦖 Старт':
if list_config == []:
menu_install = types.ReplyKeyboardMarkup(resize_keyboard=True)
k_install = types.KeyboardButton("Установить")
k_back = types.KeyboardButton("Назад")
menu_install.add(k_back, k_install)
hlna_bot.send_message(m.chat.id, text="{0.first_name}, ниодна карта не установлена".format(m.from_user),
reply_markup=menu_install)
hlna_bot.register_next_step_handler(m, m_install)
else:
hlna.read_yaml(list_config[-1], flag=True)
menu_start = types.ReplyKeyboardMarkup(resize_keyboard=True)
for i in list_config:
k_mapname = types.KeyboardButton(i)
menu_start.add(k_mapname)
k_back = types.KeyboardButton("Назад")
menu_start.add(k_back)
hlna_bot.send_message(m.chat.id, text="{0.first_name}, выбери карту".format(m.from_user), reply_markup=menu_start)
elif m.text.strip() == '🧾 Статус':
check_status(m)
elif m.text.strip() == 'Назад':
m_mainmenu(m)
for i in list_config:
if m.text.strip() == f'{i}':
hlna.print_line(f"Старт карты {i}")
hlna.start()
# @hlna_bot.message_handler(content_types=["text"])
# def m_mapstart(m):
# hlna.print_line("Старт карты")
# for i in list_config:
# if m.text.strip() == f'{i}':
# hlna.print_line(f"Старт карты {i}")
# hlna.start()
def m_install(m):
if m.text.strip() == 'Установить':
hlna_bot.send_message(m.chat.id, subprocess.check_output(hlna.config(), shell=True))
print("Бот запущен")
hlna_bot.polling(none_stop=True, interval=0, timeout=999)
# subprocess.run(["arkmanager", "start", "--alwaysrestart", "@all"])
# elif m.text.strip() == '🦇 Выключить':
# subprocess.run(["arkmanager", "stop", "@all"])
# elif m.text.strip() == '🦕 Перезагрузить':
# subprocess.run(["arkmanager","restart", "--alwaysrestart", "--warn", "@all"])
# elif (m.text.strip() == '🔸 Обновить'):
# subprocess.run(["arkmanager", "update", "--update-mods", "@all"])
#
#
# elif (m.text.strip() == '⏬ Установка модов'):
# bot.send_message(m.from_user.id, "Введите id модификации")
# bot.register_next_step_handler(m, mods)
# else:
# pass
# else:
# if m.text.strip() == 'Zxx843Aj':
# th = Thread(target=check, args=(m,))
# th.start()
# id.append(m.chat.id)
# bot.send_message(m.chat.id, text="{0.first_name} вы авторизованы, нажмите /start для работы с ботом".format(m.from_user))
# return id
# def mods(m):
# id = m.text.strip()
# subprocess.run(["arkmanager", "installmods", id, "@all"])
# subprocess.run(["arkmanager", "enablemod", id, "@all"])

203
hlnaui.py Normal file

@ -0,0 +1,203 @@
# Form implementation generated from reading ui file './hlna.ui'
#
# Created by: PyQt6 UI code generator 6.5.0
#
# WARNING: Any manual changes made to this file will be lost when pyuic6 is
# run again. Do not edit this file unless you know what you are doing.
from PyQt6 import QtCore, QtGui, QtWidgets
class Ui_MainWindow(object):
def setupUi(self, MainWindow):
MainWindow.setObjectName("MainWindow")
MainWindow.resize(1552, 1000)
self.centralwidget = QtWidgets.QWidget(parent=MainWindow)
self.centralwidget.setObjectName("centralwidget")
self.horizontalLayout = QtWidgets.QHBoxLayout(self.centralwidget)
self.horizontalLayout.setObjectName("horizontalLayout")
self.tabWidget = QtWidgets.QTabWidget(parent=self.centralwidget)
self.tabWidget.setMaximumSize(QtCore.QSize(1551, 941))
self.tabWidget.setObjectName("tabWidget")
self.tab = QtWidgets.QWidget()
self.tab.setObjectName("tab")
self.gridLayout_2 = QtWidgets.QGridLayout(self.tab)
self.gridLayout_2.setObjectName("gridLayout_2")
self.tabWidget_2 = QtWidgets.QTabWidget(parent=self.tab)
self.tabWidget_2.setTabsClosable(True)
self.tabWidget_2.setTabBarAutoHide(True)
self.tabWidget_2.setObjectName("tabWidget_2")
self.tab_5 = QtWidgets.QWidget()
self.tab_5.setObjectName("tab_5")
self.gridLayout_3 = QtWidgets.QGridLayout(self.tab_5)
self.gridLayout_3.setObjectName("gridLayout_3")
self.groupBox = QtWidgets.QGroupBox(parent=self.tab_5)
self.groupBox.setTitle("")
self.groupBox.setObjectName("groupBox")
self.textEdit = QtWidgets.QTextEdit(parent=self.groupBox)
self.textEdit.setGeometry(QtCore.QRect(10, 30, 441, 31))
self.textEdit.setObjectName("textEdit")
self.label = QtWidgets.QLabel(parent=self.groupBox)
self.label.setGeometry(QtCore.QRect(10, 10, 81, 18))
self.label.setScaledContents(True)
self.label.setObjectName("label")
self.textEdit_2 = QtWidgets.QTextEdit(parent=self.groupBox)
self.textEdit_2.setGeometry(QtCore.QRect(10, 80, 131, 31))
self.textEdit_2.setObjectName("textEdit_2")
self.label_2 = QtWidgets.QLabel(parent=self.groupBox)
self.label_2.setGeometry(QtCore.QRect(10, 60, 81, 18))
self.label_2.setScaledContents(True)
self.label_2.setObjectName("label_2")
self.label_3 = QtWidgets.QLabel(parent=self.groupBox)
self.label_3.setGeometry(QtCore.QRect(170, 60, 81, 18))
self.label_3.setScaledContents(True)
self.label_3.setObjectName("label_3")
self.textEdit_3 = QtWidgets.QTextEdit(parent=self.groupBox)
self.textEdit_3.setGeometry(QtCore.QRect(170, 80, 131, 31))
self.textEdit_3.setObjectName("textEdit_3")
self.textEdit_4 = QtWidgets.QTextEdit(parent=self.groupBox)
self.textEdit_4.setGeometry(QtCore.QRect(330, 80, 121, 31))
self.textEdit_4.setObjectName("textEdit_4")
self.label_4 = QtWidgets.QLabel(parent=self.groupBox)
self.label_4.setGeometry(QtCore.QRect(330, 60, 81, 18))
self.label_4.setScaledContents(True)
self.label_4.setObjectName("label_4")
self.textEdit_5 = QtWidgets.QTextEdit(parent=self.groupBox)
self.textEdit_5.setGeometry(QtCore.QRect(10, 140, 221, 31))
self.textEdit_5.setObjectName("textEdit_5")
self.label_5 = QtWidgets.QLabel(parent=self.groupBox)
self.label_5.setGeometry(QtCore.QRect(10, 120, 101, 18))
self.label_5.setScaledContents(True)
self.label_5.setObjectName("label_5")
self.label_6 = QtWidgets.QLabel(parent=self.groupBox)
self.label_6.setGeometry(QtCore.QRect(240, 120, 161, 18))
self.label_6.setScaledContents(True)
self.label_6.setObjectName("label_6")
self.textEdit_6 = QtWidgets.QTextEdit(parent=self.groupBox)
self.textEdit_6.setGeometry(QtCore.QRect(230, 140, 221, 31))
self.textEdit_6.setObjectName("textEdit_6")
self.textEdit_7 = QtWidgets.QTextEdit(parent=self.groupBox)
self.textEdit_7.setGeometry(QtCore.QRect(10, 200, 71, 31))
self.textEdit_7.setObjectName("textEdit_7")
self.label_7 = QtWidgets.QLabel(parent=self.groupBox)
self.label_7.setGeometry(QtCore.QRect(10, 180, 131, 18))
self.label_7.setScaledContents(True)
self.label_7.setObjectName("label_7")
self.checkBox = QtWidgets.QCheckBox(parent=self.groupBox)
self.checkBox.setGeometry(QtCore.QRect(140, 200, 301, 31))
self.checkBox.setObjectName("checkBox")
self.gridLayout_3.addWidget(self.groupBox, 0, 0, 1, 1)
self.groupBox_2 = QtWidgets.QGroupBox(parent=self.tab_5)
self.groupBox_2.setObjectName("groupBox_2")
self.gridLayout_3.addWidget(self.groupBox_2, 0, 1, 1, 1)
self.tabWidget_2.addTab(self.tab_5, "")
self.tab_6 = QtWidgets.QWidget()
self.tab_6.setObjectName("tab_6")
self.tabWidget_2.addTab(self.tab_6, "")
self.gridLayout_2.addWidget(self.tabWidget_2, 0, 0, 1, 1)
self.tabWidget.addTab(self.tab, "")
self.tab_2 = QtWidgets.QWidget()
self.tab_2.setObjectName("tab_2")
self.gridLayout = QtWidgets.QGridLayout(self.tab_2)
self.gridLayout.setObjectName("gridLayout")
self.groupBox_3 = QtWidgets.QGroupBox(parent=self.tab_2)
self.groupBox_3.setTitle("")
self.groupBox_3.setObjectName("groupBox_3")
self.textEdit_8 = QtWidgets.QTextEdit(parent=self.groupBox_3)
self.textEdit_8.setGeometry(QtCore.QRect(10, 30, 441, 31))
self.textEdit_8.setObjectName("textEdit_8")
self.label_8 = QtWidgets.QLabel(parent=self.groupBox_3)
self.label_8.setGeometry(QtCore.QRect(10, 10, 81, 18))
self.label_8.setScaledContents(True)
self.label_8.setObjectName("label_8")
self.textEdit_9 = QtWidgets.QTextEdit(parent=self.groupBox_3)
self.textEdit_9.setGeometry(QtCore.QRect(10, 80, 131, 31))
self.textEdit_9.setObjectName("textEdit_9")
self.label_9 = QtWidgets.QLabel(parent=self.groupBox_3)
self.label_9.setGeometry(QtCore.QRect(10, 60, 81, 18))
self.label_9.setScaledContents(True)
self.label_9.setObjectName("label_9")
self.textEdit_12 = QtWidgets.QTextEdit(parent=self.groupBox_3)
self.textEdit_12.setGeometry(QtCore.QRect(10, 140, 221, 31))
self.textEdit_12.setObjectName("textEdit_12")
self.label_12 = QtWidgets.QLabel(parent=self.groupBox_3)
self.label_12.setGeometry(QtCore.QRect(10, 120, 101, 18))
self.label_12.setScaledContents(True)
self.label_12.setObjectName("label_12")
self.label_13 = QtWidgets.QLabel(parent=self.groupBox_3)
self.label_13.setGeometry(QtCore.QRect(240, 120, 161, 18))
self.label_13.setScaledContents(True)
self.label_13.setObjectName("label_13")
self.textEdit_13 = QtWidgets.QTextEdit(parent=self.groupBox_3)
self.textEdit_13.setGeometry(QtCore.QRect(230, 140, 221, 31))
self.textEdit_13.setObjectName("textEdit_13")
self.textEdit_14 = QtWidgets.QTextEdit(parent=self.groupBox_3)
self.textEdit_14.setGeometry(QtCore.QRect(10, 200, 71, 31))
self.textEdit_14.setObjectName("textEdit_14")
self.label_14 = QtWidgets.QLabel(parent=self.groupBox_3)
self.label_14.setGeometry(QtCore.QRect(10, 180, 131, 18))
self.label_14.setScaledContents(True)
self.label_14.setObjectName("label_14")
self.gridLayout.addWidget(self.groupBox_3, 0, 0, 1, 1)
self.groupBox_4 = QtWidgets.QGroupBox(parent=self.tab_2)
self.groupBox_4.setObjectName("groupBox_4")
self.gridLayout.addWidget(self.groupBox_4, 0, 1, 1, 1)
self.tabWidget.addTab(self.tab_2, "")
self.horizontalLayout.addWidget(self.tabWidget)
MainWindow.setCentralWidget(self.centralwidget)
self.menubar = QtWidgets.QMenuBar(parent=MainWindow)
self.menubar.setGeometry(QtCore.QRect(0, 0, 1552, 30))
self.menubar.setObjectName("menubar")
MainWindow.setMenuBar(self.menubar)
self.statusbar = QtWidgets.QStatusBar(parent=MainWindow)
self.statusbar.setObjectName("statusbar")
MainWindow.setStatusBar(self.statusbar)
self.retranslateUi(MainWindow)
self.tabWidget.setCurrentIndex(1)
self.tabWidget_2.setCurrentIndex(0)
QtCore.QMetaObject.connectSlotsByName(MainWindow)
def retranslateUi(self, MainWindow):
_translate = QtCore.QCoreApplication.translate
MainWindow.setWindowTitle(_translate("MainWindow", "MainWindow"))
self.label.setText(_translate("MainWindow", "Имя сессии"))
self.textEdit_2.setHtml(_translate("MainWindow", "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.0//EN\" \"http://www.w3.org/TR/REC-html40/strict.dtd\">\n"
"<html><head><meta name=\"qrichtext\" content=\"1\" /><style type=\"text/css\">\n"
"p, li { white-space: pre-wrap; }\n"
"</style></head><body style=\" font-family:\'Noto Sans\'; font-size:10pt; font-weight:400; font-style:normal;\">\n"
"<p style=\" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;\">7777</p></body></html>"))
self.label_2.setText(_translate("MainWindow", "Порт"))
self.label_3.setText(_translate("MainWindow", "Querry порт"))
self.textEdit_3.setHtml(_translate("MainWindow", "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.0//EN\" \"http://www.w3.org/TR/REC-html40/strict.dtd\">\n"
"<html><head><meta name=\"qrichtext\" content=\"1\" /><style type=\"text/css\">\n"
"p, li { white-space: pre-wrap; }\n"
"</style></head><body style=\" font-family:\'Noto Sans\'; font-size:10pt; font-weight:400; font-style:normal;\">\n"
"<p style=\" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;\">27015</p></body></html>"))
self.textEdit_4.setHtml(_translate("MainWindow", "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.0//EN\" \"http://www.w3.org/TR/REC-html40/strict.dtd\">\n"
"<html><head><meta name=\"qrichtext\" content=\"1\" /><style type=\"text/css\">\n"
"p, li { white-space: pre-wrap; }\n"
"</style></head><body style=\" font-family:\'Noto Sans\'; font-size:10pt; font-weight:400; font-style:normal;\">\n"
"<p style=\" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;\">27042</p></body></html>"))
self.label_4.setText(_translate("MainWindow", "Rcon порт"))
self.label_5.setText(_translate("MainWindow", "Пароль сессии"))
self.label_6.setText(_translate("MainWindow", "Пароль администратора"))
self.label_7.setText(_translate("MainWindow", "Количество игроков"))
self.checkBox.setText(_translate("MainWindow", "Передавать в глобальный список серверов"))
self.groupBox_2.setTitle(_translate("MainWindow", "ini"))
self.tabWidget_2.setTabText(self.tabWidget_2.indexOf(self.tab_5), _translate("MainWindow", "Tab 1"))
self.tabWidget_2.setTabText(self.tabWidget_2.indexOf(self.tab_6), _translate("MainWindow", "Tab 2"))
self.tabWidget.setTabText(self.tabWidget.indexOf(self.tab), _translate("MainWindow", "ARK"))
self.label_8.setText(_translate("MainWindow", "Имя сессии"))
self.textEdit_9.setHtml(_translate("MainWindow", "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.0//EN\" \"http://www.w3.org/TR/REC-html40/strict.dtd\">\n"
"<html><head><meta name=\"qrichtext\" content=\"1\" /><style type=\"text/css\">\n"
"p, li { white-space: pre-wrap; }\n"
"</style></head><body style=\" font-family:\'Noto Sans\'; font-size:10pt; font-weight:400; font-style:normal;\">\n"
"<p style=\"-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;\"><br /></p></body></html>"))
self.label_9.setText(_translate("MainWindow", "Порт"))
self.label_12.setText(_translate("MainWindow", "Пароль сессии"))
self.label_13.setText(_translate("MainWindow", "Пароль администратора"))
self.label_14.setText(_translate("MainWindow", "Количество игроков"))
self.groupBox_4.setTitle(_translate("MainWindow", "xml"))
self.tabWidget.setTabText(self.tabWidget.indexOf(self.tab_2), _translate("MainWindow", "7 Days to Die"))