Initial modpack installation implementation
This commit is contained in:
parent
1e923dacb9
commit
983d0f9e21
4 changed files with 117 additions and 52 deletions
95
mc-get.py
95
mc-get.py
|
@ -6,41 +6,71 @@ import npyscreen
|
|||
import os
|
||||
from colorama import Fore, Style
|
||||
|
||||
def validate():
|
||||
pass
|
||||
|
||||
def version_selector_GUI(vers:list, project:str):
|
||||
def validate():
|
||||
raise NotImplementedError
|
||||
|
||||
|
||||
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=[0,], name="versions:",\
|
||||
values=[ver.version_number + " for " +\
|
||||
", ".join(ver.game_versions)\
|
||||
f = npyscreen.Form(name=f"Select {project} version")
|
||||
sel = f.add(npyscreen.TitleSelectOne, value=[0, ], name="versions:",
|
||||
values=[ver.version_number + " for " +
|
||||
", ".join(ver.game_versions)
|
||||
for ver in vers[::-1]], scroll_exit=True)
|
||||
F.edit()
|
||||
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):
|
||||
|
||||
def download_cache(url: str, filename: str, size: int):
|
||||
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(url, size, cache_file_path)
|
||||
else:
|
||||
print(f"{filename} is in cache.")
|
||||
return filename
|
||||
|
||||
|
||||
def modpack_install(filename: str):
|
||||
modpack = mcfs.get_modpack_info(filename)
|
||||
print(f"{Fore.YELLOW}Installing {modpack.name} modpack...{Style.RESET_ALL}")
|
||||
for file in modpack.files:
|
||||
path = file["path"].split("/")
|
||||
downloads = file["downloads"]
|
||||
print(file["path"])
|
||||
download_cache(downloads[0], path[1], file["fileSize"])
|
||||
mcfs.install(path[1], path[0])
|
||||
print(f"{Fore.YELLOW}Overriding...{Style.RESET_ALL}")
|
||||
mcfs.install_modpacks_override(filename)
|
||||
|
||||
|
||||
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])
|
||||
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.")
|
||||
download_cache(file.url, filename, file.size)
|
||||
# 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.")
|
||||
|
||||
subdir = ""
|
||||
match project.project_type:
|
||||
|
@ -50,22 +80,26 @@ def install(projects:list):
|
|||
subdir = "mods"
|
||||
case "shader":
|
||||
subdir = "shaderpacks"
|
||||
case "modpack":
|
||||
modpack_install(filename)
|
||||
continue
|
||||
case _:
|
||||
raise NotImplementedError
|
||||
|
||||
mcfs.install(filename, subdir)
|
||||
|
||||
def search(query:list):
|
||||
|
||||
results = api.search(query=' '.join(query))
|
||||
|
||||
def search(query: list):
|
||||
results = api.search(query=' '.join(query))
|
||||
|
||||
for result in results.hits:
|
||||
print(Fore.GREEN, end="")
|
||||
print(result.get("slug", "error"), end="")
|
||||
print(Style.RESET_ALL, end="")
|
||||
print(f' [{result.get("project_type", "error")}] ', end="")
|
||||
print(f' : {Fore.GREEN}{result.get("title", "error")}{Style.RESET_ALL} --- {result.get("description", "error")}')
|
||||
print(
|
||||
f' : {Fore.GREEN}{result.get("title", "error")}{Style.RESET_ALL} --- {result.get("description", "error")}')
|
||||
|
||||
|
||||
def clean():
|
||||
if mcfs.is_path_exist(mcfs.cache_dir):
|
||||
|
@ -78,11 +112,13 @@ def clean():
|
|||
|
||||
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 = 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="+")
|
||||
|
@ -94,6 +130,7 @@ if __name__ == "__main__":
|
|||
|
||||
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, заодно вытаскивая название метода из списка аргументов,
|
||||
kwargs = vars(parser.parse_args()) # Получаем все поля получившегося Namespace и пихаем в словарь
|
||||
globals()[kwargs.pop("method")](**kwargs) # Из глобального контекста получаем функцию с названием как в method,
|
||||
# заодно вытаскивая название метода из списка аргументов,
|
||||
# затем вызываем функцию с распакованным словарём в качестве аргумента
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue