#!/usr/bin/env python3 import argparse import api import mcfs import npyscreen import os def validate(): pass def version_selector_GUI(vers:list, project:str): def form(*args): F = npyscreen.Form(name=f"Select {project} version") sel = F.add(npyscreen.TitleSelectOne, value=[1,], name="versions:",\ values=[ver.version_number + " for " +\ ", ".join(ver.game_versions)\ for ver in vers[::-1]], scroll_exit=True) F.edit() for ver in vers: if ver.version_number == sel.get_selected_objects()[0].split()[0]: return ver return vers[0] return form def install(projects:list): to_install = [] for project in projects: project_data = api.project(project=project) to_install.append(project_data) for project in to_install: versions = api.versions(ids=str(project.versions).replace("'", '"')) #i hate this version = npyscreen.wrapper_basic(version_selector_GUI(versions,\ project.slug)) file = type("mc_file", (object, ), version.files[0]) filename = file.url.split("/")[-1] cache_file_path = os.path.join(mcfs.cache_dir, filename) if not mcfs.is_path_exist(mcfs.cache_dir): os.mkdir(mcfs.cache_dir) if not mcfs.is_path_exist(cache_file_path): api.download(file.url, file.size, cache_file_path) else: print(f"{filename} is in cache.") mcfs.install(filename) def search(): pass def clean(): if mcfs.is_path_exist(mcfs.cache_dir): files = os.listdir(mcfs.cache_dir) if len(files) > 0: for file in files: os.remove(os.path.join(mcfs.cache_dir, file)) print("Cache cleared successfully.") return print("Nothing to clear.") if __name__ == "__main__": desc = "Minecraft mods packet manager based on Modrinth API" parser = argparse.ArgumentParser(description=desc,\ formatter_class=argparse.RawTextHelpFormatter) subparsers = parser.add_subparsers(dest="method", required=True) # Переменная, в которую будет записано имя подкоманды parser_install = subparsers.add_parser("install", help="Install one or more mods or resources") parser_install.add_argument("projects", nargs="+") parser_search = subparsers.add_parser("search", help="Find a mod or a resource") parser_validate = subparsers.add_parser("validate", help="Validate the installation") parser_clean = subparsers.add_parser("clean", help="Clean the cache of this program") kwargs = vars(parser.parse_args()) # Получаем все поля получившегося Namespace и пихаем в словарь globals()[kwargs.pop("method")](**kwargs) # Из глобального контекста получаем функцию с названием как в method, заодно вытаскивая название метода из списка аргументов, # затем вызываем функцию с распакованным словарём в качестве аргумента