hln-a/hlna.py
xpamych d1f06e7695 Revert "match заменил на if else"
This reverts commit 41d833baa5ecde91fddd6dbe1925e1ff29975d24.
2023-02-22 11:10:08 +03:00

414 lines
18 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 re
import yaml
import threading
from pathlib import Path
import click
import colorama
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')
y = list_config.count('logs')
if x>0:
list_config.remove('.directory')
if y>0:
list_config.remove('logs')
delist_config = next(os.walk(config_hlna+"deactivated"), (None, None, []))[2] # [] if no file
x = list_config.count('.directory')
y = list_config.count('logs')
if x>0:
list_config.remove('.directory')
if y>0:
list_config.remove('logs')
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):
"Проверка и создание директории"
if not os.path.exists(directory):
os.mkdir(directory)
def check_int(number=""):
"Проверка на ввод числа"
while True:
try:
x = input(number)
if x == "":
return 0
x = x.replace(' ', '')
x = x.replace(',', '')
x = int(x)
return x
except ValueError:
print("Введите число")
create_dir(dir_server)
create_dir(config_hlna)
@hlna.command(help='Для конфигурирования параметров запускаемого сервера или кластера серверов')
def config(map_server=list_config):
query_p = []
port_s = []
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
print
for i in range(count_maps):
while True:
"Проверка на выбор карты из списка"
for k in map_server:
with open(f"{home_dir}/.config/hlna/{k}", "r") as yamlfile:
data = yaml.load(yamlfile, Loader=yaml.FullLoader)
data = data[0]
port_s.append(data['Port'])
query_p.append(data['QueryPort'])
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]
while True:
port_server = check_int("Укажите порт Сервера <7777>: \n")
if port_server == 0:
if port_s == []:
port_server = 7777
else:
port_server = max(port_s) + 2
if port_server is port_s: # если веденный порт есть в списке портов
print("Этот порт уже занят")
else:
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:
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
}
]
print(cluster_id)
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)
@hlna.command()
@click.option("-m", required=True, help="Название карты")
@click.option("-e/-d", default=True, help="-e активировать карты, -d деактивировать")
def enablemap(m,e):
m = m.split(",")
m = check_name_map(m, False)
create_dir(config_hlna + "deactivated")
if e == True:
port_s = []
query_p = []
for k in list_config:
with open(f"{home_dir}/.config/hlna/{k}", "r") as yamlfile:
data = yaml.load(yamlfile, Loader=yaml.FullLoader)
data = data[0]
port_s.append(data['Port'])
query_p.append(data['QueryPort'])
for i in m:
try:
if i in list_config:
print(f"Карта {i} уже есть в активных")
continue
with open(f"{home_dir}/.config/hlna/deactivated/{i}", "r") as yamlfile:
data = yaml.load(yamlfile, Loader=yaml.FullLoader)
data = data[0]
if data['Port'] in port_s:
print("Предлагаем заменить")
if data['QueryPort'] in query_p:
print("Заменить query port?")
x = os.system(f"mv {config_hlna}deactivated/{i} {config_hlna + i} 2>> {config_hlna}logs")
if x == 0:
print(f"Карта активирована - {i}")
else:
print(f"{i} либо уже активирована, либо такой карты нет")
except:
print("ошибка")
pass
else:
for i in m:
try:
if i in delist_config:
print(f"Карта {i} уже есть в деактивированных")
continue
x = os.system(f"mv {config_hlna + i} {config_hlna}deactivated/{i} 2>> {config_hlna}logs")
if x == 0:
print(f"Карта деактивирована - {i}")
else:
print(f"{i} либо деактивирована, либо такой карты нет")
except:
pass
@hlna.command()
def servers(map_server=list_config):
if map_server==[] and delist_config==[]:
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)
x = os.system(f"lsof -w -i :{port_server}")
if x == 0:
print(colorama.Fore.GREEN + "Сервер запущен" + colorama.Style.RESET_ALL)
else:
print(colorama.Fore.RED + "Сервер не запущен" + colorama.Style.RESET_ALL)
print(f"""
Сервер: {i}
Имя сервера: {name_server}
Кластер: {cluster_server}
Порт сервера: {port_server}
Query порт: {query_port}
Пароль: {password_server}
Максимальное кол-во игроков: {max_players}
Моды: {mods_id}
Кластер id: {cluster_id}""")
print("-" * 40)
print("\n")
if delist_config!=[]:
x = input("Есть неактивные сервера, показать Y/n: ")
if x!="n":
for i in delist_config:
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, False)
print(f"""
Сервер: {i}
Имя сервера: {name_server}
Кластер: {cluster_server}
Порт сервера: {port_server}
Query порт: {query_port}
Пароль: {password_server}
Максимальное кол-во игроков: {max_players}
Моды: {mods_id}
Кластер id: {cluster_id}""")
print("-" * 40)
print("\n")
@hlna.command(help='Для запуска, сконфигурированного сервера или кластера')
@click.option('-m', default='all', help="Название карты для запуска или all для запуска все карт")
def start(m, map_server=list_config):
if map_server!=[]:
if m == "all":
print("Запускаем все активные карты")
else:
m = m.split(",")
m = check_name_map(m)
map_server = m
else:
print("Ни одной карты не установлено")
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(f"Карта {i} не установлена")
def read_yaml(map_server, flag=True):
if flag == True:
dirs=f"{home_dir}/.config/hlna/{map_server}"
else:
dirs=f"{home_dir}/.config/hlna/deactivated/{map_server}"
with open(dirs, "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
def check_name_map(maps, flag=True):
map_choise = []
for i in maps:
if (i.lower() =="theisland" or i.lower() =="the island" or i.lower() =="island" or i.lower() =="остров" or i.lower() =="the_island"):
map_choise.append("TheIsland")
elif (i.lower() =="thecenter" or i.lower() =="the center" or i.lower() =="center" or i.lower() =="центр" or i.lower() =="the_center"):
map_choise.append("TheCenter")
elif (i.lower() =="scorchedearth_p" or i.lower() =="scorchedearth" or i.lower() =="scorched" or i.lower() =="scorch" or i.lower() =="выжженные" or i.lower() =="пустыня" or i.lower() =="scorched_earth" or i.lower() =="скорч"):
map_choise.append("ScorchedEarth_P")
elif (i.lower() =="ragnarok" or i.lower() =="рагнарек" or i.lower() =="рагнарёк" or i.lower() =="рагнарок"):
map_choise.append("Ragnarok")
elif (i.lower() =="aberration_p" or i.lower() =="aberration" or i.lower() =="aberation" or i.lower() =="аберация" or i.lower() =="аберрация" or i.lower() =="абберация" or i.lower() =="theaberration"):
map_choise.append("Aberration_P")
elif (i.lower() =="extinction" or i.lower() =="theextinction" or i.lower() =="вымирание"):
map_choise.append("Extinction")
elif (i.lower() =="valguero_p" or i.lower() =="valguero" or i.lower() =="thevalguero" or i.lower() =="валгуеро" or i.lower() =="валгуэро"):
map_choise.append("Valguero_P")
elif (i.lower() =="genesis" or i.lower() =="thegenesis" or i.lower() =="genesis1" or i.lower() =="gen" or i.lower() =="gen1" or i.lower() =="gen_1" or i.lower() =="gen-1" or i.lower() =="genesis_1" or i.lower() =="генезис"):
map_choise.append("Genesis")
elif (i.lower() =="crystalisles" or i.lower() =="crystal_isles" or i.lower() =="crystal" or i.lower() =="кристальныеострова" or i.lower() =="кристальные_острова" or i.lower() =="кристальные-острова" \
or i.lower() =="crystal-isles"):
map_choise.append("CrystalIsles")
elif (i.lower() =="gen2" or i.lower() =="gen_2" or i.lower() =="gen-2" or i.lower() =="genesis2" or i.lower() =="genesis_2" or i.lower() =="genesis-2" or i.lower() =="генезис2"):
map_choise.append("Gen2")
elif (i.lower() =="lostisland" or i.lower() =="lost_island" or i.lower() =="lost-island"):
map_choise.append("LostIsland")
elif (i.lower() =="fjordur" or i.lower() =="fjord" or i.lower() =="фьордур" or i.lower() =="фьорд") :
map_choise.append("Fjordur")
else:
print("Карта-", i, "не распознана")
continue
if flag == True:
if map_choise[-1] in list_config:
print_line(f"{i} - Подготавливаем карту {map_choise[-1]}")
else:
map_choise.pop()
print("Карта-", i, "не установлена")
else:
if map_choise[-1] in delist_config or map_choise[-1] in list_config:
print_line(f"{i} - Подготавливаем карту {map_choise[-1]}")
else:
map_choise.pop()
print("Карта -", i, "не установлена")
return map_choise
if __name__ == '__main__':
hlna()