#!/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_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 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_dodo) @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): 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: 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_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 } ] 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(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") 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("Неправильный ввод") for j in str(map_list): map_choise.append(map_server[int(j) - 1]) map_server = map_choise return map_server 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'] 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()