#!/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 list_config.remove('.directory') def print_line(text): "Добавление тире вокруг текста, потом сюда можно поместить и расскраску текста" print(Fore.YELLOW + "-"*25) print(Fore.GREEN + text) print(Fore.YELLOW + "-"*25 + Fore.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) 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): cluster_dir_override = "" cluster_id = "" count_maps = 1 count_cluster = check_int("""Укажите требуется ли кластер? 1. Да 2. Нет : """) if count_cluster == 1: cluster_server = True else: cluster_server = False if cluster_server == True: cluster_id = input("Укажите id для кластера, любое сочетание символов: \n") create_dir(dir_server + cluster_id) cluster_dir_override = (dir_server + cluster_id) if map_server != []: print("Уже установленные карты: ") for i in map_server: print(i) count_maps = check_int("Укажите количество карт: \n") 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 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") port_server = check_int("Укажите порт Сервера <7777>: \n") query_port = check_int("Укажите Query-порт Сервера <27015>: \n") password_server = input("Укажите пароль Сервера: \n") max_players = check_int("Укажите максимальное количество игроков: \n") 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(Fore.GREEN + "Конфиг создан" + Fore.RESET_ALL) @dodo.command() def start(map_server=list_config): map_choise = [] while True: "Проверка на выбор имеющихся карт" for i in range(len(map_server)): print(f"{i}) {map_server[i]}") map_list = check_int(map_server) for k in range(map_list): if 0>map_list[k]>len(map_list) and len(map_list)>len(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): print(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()