from __future__ import annotations import json import shutil import urllib.parse import urllib.request from pathlib import Path from warium_source import ROOT MODS_DIR = ROOT / "run" / "server" / "mods" REQUIRED_MODRINTH = [ ("geckolib", "4.7.5.1"), ("rpl", "2.1.2"), ] def main() -> None: MODS_DIR.mkdir(parents=True, exist_ok=True) for project, version in REQUIRED_MODRINTH: download_modrinth_version(project, version) private_dir = ROOT / "ci" / "required-mods" if private_dir.exists(): for jar in private_dir.glob("*.jar"): shutil.copy2(jar, MODS_DIR / jar.name) print(f"Runtime mods prepared in {MODS_DIR}") def download_modrinth_version(project: str, version_number: str) -> None: encoded_project = urllib.parse.quote(project) loaders = urllib.parse.quote(json.dumps(["neoforge"])) game_versions = urllib.parse.quote(json.dumps(["1.21.1"])) url = f"https://api.modrinth.com/v2/project/{encoded_project}/version?loaders={loaders}&game_versions={game_versions}" request = urllib.request.Request(url, headers={"User-Agent": "MrSphay/Warium-NeoForge-Port/1.0"}) with urllib.request.urlopen(request) as response: data = json.loads(response.read().decode("utf-8")) selected = next((entry for entry in data if entry.get("version_number") == version_number), None) if selected is None: available = ", ".join(entry.get("version_number", "?") for entry in data[:10]) raise SystemExit(f"No NeoForge 1.21.1 build found for {project} {version_number}. Available: {available}") primary = next((file for file in selected["files"] if file.get("primary")), selected["files"][0]) target = MODS_DIR / primary["filename"].replace(" ", "-") request = urllib.request.Request(primary["url"], headers={"User-Agent": "MrSphay/Warium-NeoForge-Port/1.0"}) with urllib.request.urlopen(request) as response, target.open("wb") as out: shutil.copyfileobj(response, out) if __name__ == "__main__": main()