#!/usr/bin/env python3 import os import yaml import threading from pathlib import Path import click import colorama home_dir = Path.home() dir_server = f"{home_dir}/ARK_Servers/" config_dodo = f"{home_dir}/.config/dodo/" mods_id = "" listen_server = True @click.group() def dodo(): pass list_config = next(os.walk(config_dodo), (None, None, []))[2] # [] if no file x = list_config.count('.directory') if x>0: list_config.remove('.directory') def print_line(text): "Добавление тире вокруг текста, покраска" print(colorama.Fore.YELLOW + "-"*25) print(colorama.Fore.GREEN + text) print(colorama.Fore.YELLOW + "-"*25 + 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_dodo) @dodo.command() def config(map_server=list_config): query_p = [] port_s = [] for i in map_server: 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']) 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: \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: 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 == "": 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_dodo = [ { '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_dodo[0]['clusterid'] = cluster_id settings_dodo[0]['clusterdir'] = cluster_dir_override with open(config_dodo + f"{map_server[-1]}", 'w') as yamlfile: data = yaml.dump(settings_dodo, yamlfile) print(colorama.Fore.GREEN + "Конфиг создан" + colorama.Style.RESET_ALL) @dodo.command() def servers(map_servers=list_config): if map_servers==[]: print("Сервера не установлены") else: for i in map_servers: 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") @dodo.command() def start(map_server=list_config): map_choise = [] while True: "Проверка на выбор имеющихся карт" for i in range(len(map_server)): print(f"{i+1}) {map_server[i]}") map_list = check_int("\n") #for k in range(map_list): # if 0>int(map_list[k])>map_list and len(str(map_list))>len(str(map_server)): # print("Укажите карты для установки в формате 1,3,5 или 145 или 1 2 3") # else: break for j in str(map_list): 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() def read_yaml(map_server): with open(f"{home_dir}/.config/dodo/{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'] print(cluster_id) print(cluster_dir_ovverride) 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__': dodo()