hln-a/hlna.py
2023-02-20 10:41:22 +03:00

367 lines
14 KiB
Python
Executable File
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#!/usr/bin/env python3
"Модуль для создания и управления серверами Арк"
import os
import traceback
import yaml
import threading
from pathlib import Path
import click
import colorama
import datetime
home_dir = Path.home()
dir_server = f"{home_dir}/ARK_Servers/"
config_hlna = f"{home_dir}/.config/hlna/"
mods_id = ""
listen_server = True
@click.group()
def hlna():
pass
list_config = next(os.walk(config_hlna), (None, None, []))[2] # [] if no file
x = list_config.count('.directory')
if x > 0:
list_config.remove('.directory')
def logging(l):
"Записываем логи в файл"
with open(dir_server + "logs", "a") as filelog:
now1 = datetime.datetime.today()
now1 = now1.strftime("%d-%m %H:%M | ")
filelog.write(now1 + l)
def print_line(text):
"Добавление тире вокруг текста, покраска"
print(colorama.Fore.YELLOW + "-"*30)
print(colorama.Fore.GREEN + text)
print(colorama.Fore.YELLOW + "-"*30 + colorama.Style.RESET_ALL)
def create_dir(directory):
"Проверка и создание директории"
try:
if not os.path.exists(directory):
os.mkdir(directory)
except:
logging(traceback.format_exc())
logging(f"Не удалось создать директорию - {directory}")
def check_int(number=""):
"Проверка на ввод числа"
x=""
while True:
try:
x = input(number)
if bool(x) == True:
x = x.replace(' ', '')
x = x.replace(',', '')
x = int(x)
return x
else:
return 0
except ValueError:
logging(traceback.format_exc())
logging(f"Не прошла проверка на ввод числа, func(check_int) ввод пользователя {x}")
print("Введите число")
create_dir(dir_server)
create_dir(config_hlna)
<<<<<<< HEAD:dodo.py
@dodo.command(help='Установка модов, укажите через запятую id модов')
@click.option('--id', default="", help='id модификаций из мастерской steam')
def modinstall(id, map_server=list_config):
print(id)
print(type(id))
print("Выберите карты, которым добавить моды")
map_server=choose_map(map_server)
print("map_server=",map_server)
print("Перезагрузите сервера для установки модов")
@dodo.command(help='Для конфигурирования параметров запускаемого сервера или кластера серверов')
def config(map_server=list_config):
=======
@hlna.command(help='Для конфигурирования параметров запускаемого сервера или кластера серверов')
def config(map_server=list_config):
query_p = []
port_s = []
for i in map_server:
with open(f"{home_dir}/.config/hlna/{i}", "r") as yamlfile:
data = yaml.load(yamlfile, Loader=yaml.FullLoader)
data = data[0]
port_s.append(data['Port'])
query_p.append(data['QueryPort'])
>>>>>>> master:hlna.py
cluster_dir_override = ""
cluster_id = ""
count_cluster = check_int("""Укажите требуется ли кластер?
1. Да
2. Нет
: """)
if count_cluster == 0: # 0 возвращает функция chek_int, если ничего не было введено
count_cluster = 2
if count_cluster == 1:
cluster_server = True
cluster_id = input("Укажите id для кластера, любое сочетание символов: \n")
create_dir(dir_server + cluster_id)
cluster_dir_override = (dir_server + cluster_id)
else:
cluster_server = False
if map_server != []:
print("Уже установленные карты: ")
for i in map_server:
print(i)
count_maps = check_int("Укажите количество карт: \n")
if count_maps == 0: # 0 возрвращает check_int когда, ничего не было введено
count_maps = 1
for i in range(count_maps):
while True:
"Проверка на выбор карты из списка"
os.system("clear")
amount_map = check_int("""Выберите карту из списка указав номер
1. The Island
2. The Center
3. Scorched Earth
4. Ragnarok
5. Aberration
6. Extinction
7. Valguero
8. Genesis: Part 1
9. Crystal Isles
10. Genesis: Part 2
11. Lost Island
12. Fjordur
: """)
if amount_map == 0: # 0 возрвращает check_int когда, ничего не было введено
amount_map = i + 1
if 0<amount_map<=12:
break
match amount_map:
case 1:
map_server.append("TheIsland")
case 2:
map_server.append("TheCenter")
case 3:
map_server.append("ScorchedEarth_P")
case 4:
map_server.append("Ragnarok")
case 5:
map_server.append("Aberration_P")
case 6:
map_server.append("Extinction")
case 7:
map_server.append("Valguero_P")
case 8:
map_server.append("Genesis")
case 9:
map_server.append("CrystalIsles")
case 10:
map_server.append("Gen2")
case 11:
map_server.append("LostIsland")
case 12:
map_server.append("Fjordur")
name_server = input("Укажите название Сервера: \n")
if name_server == "":
name_server = map_server[-1]
query_p = []
port_s = []
for i in map_server:
try:
with open(f"{home_dir}/.config/dodo/{i}", "r") as yamlfile:
data = yaml.load(yamlfile, Loader=yaml.FullLoader)
data = data[0]
port_s.append(data['Port'])
query_p.append(data['QueryPort'])
except:
pass
while True:
port_server = check_int("Укажите порт Сервера <7777>: \n")
if port_server == 0:
if port_s == []:
port_server = 7777
else:
print()
port_server = max(port_s) + 2
if port_server is port_s: # если веденный порт есть в списке портов
print("Этот порт уже занят")
else:
port_s.append(port_server)
break
while True:
query_port = check_int("Укажите Query-порт Сервера <27015>: \n")
if query_port == 0:
if query_p == []:
query_port = 27015
else:
query_port = max(query_p) + 2
if query_port is query_p: # если веденный порт есть в списке портов
print("Этот порт уже занят")
else:
port_s.append(query_p)
break
password_server = input("Укажите пароль Сервера: \n")
max_players = check_int("Укажите максимальное количество игроков: \n")
if max_players == 0:
max_players = 70
yaml_create(cluster_server, map_server, name_server, port_server, query_port, password_server, max_players, cluster_id, cluster_dir_override)
def yaml_create(cluster_server, map_server, name_server, port_server, query_port, password_server, max_players, cluster_id, cluster_dir_override):
settings_hlna = [
{
'Cluster' : cluster_server,
'SessionName' : name_server,
'Port' : port_server,
'QueryPort' : query_port,
'ServerPassword' : password_server,
'MaxPlayers' : max_players,
'ModsId' : mods_id,
'Listen' : listen_server,
'ServerPath' : dir_server
}
]
if cluster_id != None:
settings_hlna[0]['clusterid'] = cluster_id
settings_hlna[0]['clusterdir'] = cluster_dir_override
with open(config_hlna + f"{map_server[-1]}", 'w') as yamlfile:
data = yaml.dump(settings_hlna, yamlfile)
print(colorama.Fore.GREEN + "Конфиг создан" + colorama.Style.RESET_ALL)
<<<<<<< HEAD:dodo.py
@dodo.command()
def servers(map_servers=list_config):
if map_servers==[]:
=======
@hlna.command()
def servers(map_server=list_config):
if map_server==[]:
>>>>>>> master:hlna.py
print("Сервера не установлены")
else:
for i in map_server:
cluster_server, name_server, port_server, query_port, password_server, max_players, dir_server, mods_id, listen_server, cluster_id, cluster_dir_ovverride = read_yaml(i)
print(f"""
Сервер: {i}
Имя сервера: {name_server}
Кластер: {cluster_server}
Порт сервера: {port_server}
Query порт: {query_port}
Пароль: {password_server}
Максимальное кол-во игроков: {max_players}
Моды: {mods_id}
Кластер id: {cluster_id}""")
print("\n")
@hlna.command(help='Для запуска, сконфигурированного сервера или кластера')
def start(map_server=list_config):
if map_server == []:
return print("Нет карт для запуска")
print("Выберите карты для запуска")
map_server = choose_map(map_server)
for i in map_server:
cluster_server, name_server, port_server, query_port, password_server, max_players, dir_server, mods_id, listen_server, cluster_id, cluster_dir_ovverride = read_yaml(i)
create_dir(dir_server + i)
print_line("Качаем карту: " + i)
os.system(f"steamcmd +force_install_dir {dir_server + i} +login anonymous +app_update 376030 +quit")
print_line("Карта скачана: " + i)
def start(i):
os.chdir(dir_server + i + "/ShooterGame/Binaries/Linux/")
os.system(f"./ShooterGameServer {i}?SessionName={name_server}?Port={port_server}?QueryPort={query_port}?MaxPlayers={max_players}?GameModIds={mods_id}?listen={listen_server} -clusterid={cluster_id} -ClusterDirOverride={cluster_dir_ovverride}")
if os.path.exists(dir_server + i + "/ShooterGame/Binaries/Linux/"):
threads = threading.Thread(target=start, args=(i,))
threads.start()
else:
print("Сервер не установлен, проверьте, достаточно ли места на диске для установки карты")
def choose_map(map_server):
map_choise = []
while True:
"Проверка на выбор имеющихся карт"
check = True
for i in range(len(map_server)):
print(f"{i + 1}) {map_server[i]}")
map_list = input("Выбери карты в формате 1 2 3 или 1,2,3\n")
map_list = map_list.replace(',', ' ')
map_list = list(set(map_list.split()))
try:
for s in map_list:
if int(s) > len(map_server):
check = False
if len(map_list) <= len(map_server) and check == True:
break
except:
logging(traceback.format_exc())
logging(f"Ошибка при выборе карт для запуска, пользователь ввел - {map_list}")
print("Неправильный ввод")
<<<<<<< HEAD:dodo.py
for j in str(map_list):
map_choise.append(map_server[int(j) - 1])
map_server = map_choise
return map_server
=======
print_line(map_list)
for j in map_list:
print_line(j)
map_choise.append(map_server[int(j) - 1])
map_server = map_choise
for i in map_server:
cluster_server, name_server, port_server, query_port, password_server, max_players, dir_server, mods_id, listen_server, cluster_id, cluster_dir_ovverride = read_yaml(i)
create_dir(dir_server + i)
print_line("Качаем карту: " + i)
os.system(f"steamcmd +force_install_dir {dir_server + i} +login anonymous +app_update 376030 +quit")
print_line("Карта скачана: " + i)
def start(i):
os.chdir(dir_server + i + "/ShooterGame/Binaries/Linux/")
os.system(f"./ShooterGameServer {i}?SessionName={name_server}?Port={port_server}?QueryPort={query_port}?MaxPlayers={max_players}?GameModIds={mods_id}?listen={listen_server} -clusterid={cluster_id} -ClusterDirOverride={cluster_dir_ovverride}")
threads = threading.Thread(target=start, args=(i,))
threads.start()
>>>>>>> master:hlna.py
def read_yaml(map_server):
with open(f"{home_dir}/.config/hlna/{map_server}", "r") as yamlfile:
data = yaml.load(yamlfile, Loader=yaml.FullLoader)
data = data[0]
dir_server = data['ServerPath']
name_server = data['SessionName']
port_server = data['Port']
query_port = data['QueryPort']
password_server = data['ServerPassword']
max_players = data['MaxPlayers']
mods_id = data['ModsId']
listen_server = data['Listen']
cluster_server = data['Cluster']
cluster_id = data['clusterid']
cluster_dir_ovverride = data['clusterdir']
return cluster_server, name_server, port_server, query_port, password_server, max_players, dir_server, mods_id, listen_server, cluster_id, cluster_dir_ovverride
if __name__ == '__main__':
hlna()