51 lines
2.0 KiB
Python
51 lines
2.0 KiB
Python
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()
|