feat: package all minecraft jars ever
This commit is contained in:
parent
623d112dbd
commit
87c213f004
6 changed files with 4223 additions and 1173 deletions
|
@ -16,7 +16,7 @@
|
||||||
, libraries
|
, libraries
|
||||||
|
|
||||||
, extraJvmArgs ? []
|
, extraJvmArgs ? []
|
||||||
, mods ? []
|
, fabricMods ? []
|
||||||
}:
|
}:
|
||||||
|
|
||||||
let
|
let
|
||||||
|
@ -34,7 +34,7 @@ let
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
classPath = lib.concatStringsSep ":" (map fetchLib libraries);
|
classPath = lib.concatStringsSep ":" (map fetchLib libraries);
|
||||||
modList = lib.concatStringsSep ":" mods;
|
modList = lib.concatStringsSep ":" fabricMods;
|
||||||
in
|
in
|
||||||
|
|
||||||
writeShellApplication {
|
writeShellApplication {
|
||||||
|
|
|
@ -16,13 +16,13 @@ let
|
||||||
value = callPackage ./fabric-server.nix {
|
value = callPackage ./fabric-server.nix {
|
||||||
inherit (value) mainClass libraries;
|
inherit (value) mainClass libraries;
|
||||||
inherit (versions) fabricLoaderVersion;
|
inherit (versions) fabricLoaderVersion;
|
||||||
|
|
||||||
minecraftVersion = version;
|
minecraftVersion = version;
|
||||||
|
|
||||||
jdk_headless = getJavaVersion value.vanillaJar.javaVersion;
|
jdk_headless = getJavaVersion value.vanilla.javaVersion;
|
||||||
|
|
||||||
serverJarUrl = value.vanillaJar.url;
|
serverJarUrl = value.vanilla.serverJar.url;
|
||||||
serverJarSha1 = value.vanillaJar.sha1;
|
serverJarSha1 = value.vanilla.serverJar.sha1;
|
||||||
};
|
};
|
||||||
})
|
})
|
||||||
versions.versions;
|
versions.versions;
|
||||||
|
|
|
@ -21,7 +21,10 @@
|
||||||
];
|
];
|
||||||
in
|
in
|
||||||
{
|
{
|
||||||
packages.fabric-servers = pkgs.callPackage ./fabric-servers.nix {};
|
packages = {
|
||||||
|
minecraft-jars = pkgs.callPackage ./minecraft-jars.nix {};
|
||||||
|
fabric-servers = pkgs.callPackage ./fabric-servers.nix {};
|
||||||
|
};
|
||||||
devShells.default = pkgs.mkShell {
|
devShells.default = pkgs.mkShell {
|
||||||
nativeBuildInputs = with pkgs; [
|
nativeBuildInputs = with pkgs; [
|
||||||
(python3.withPackages scriptDeps)
|
(python3.withPackages scriptDeps)
|
||||||
|
|
|
@ -12,6 +12,23 @@ EXPERIMENTAL_LAUNCHER_MANIFEST = 'https://maven.fabricmc.net/net/minecraft/exper
|
||||||
|
|
||||||
LOADER_VERSION = '0.16.7'
|
LOADER_VERSION = '0.16.7'
|
||||||
|
|
||||||
|
def fetch_launcher_manifest(manifest: str):
|
||||||
|
resp = requests.get(manifest)
|
||||||
|
resp.raise_for_status()
|
||||||
|
return resp.json()
|
||||||
|
|
||||||
|
def merge_launcher_manifests():
|
||||||
|
launcher_manifest = fetch_launcher_manifest(LAUNCHER_MANIFEST)
|
||||||
|
experimental_launcher_manifest = fetch_launcher_manifest(EXPERIMENTAL_LAUNCHER_MANIFEST)
|
||||||
|
full_launcher_manifest = {}
|
||||||
|
for version in launcher_manifest['versions']:
|
||||||
|
full_launcher_manifest[version['id']] = version
|
||||||
|
for version in experimental_launcher_manifest['versions']:
|
||||||
|
full_launcher_manifest[version['id']] = version
|
||||||
|
return full_launcher_manifest
|
||||||
|
|
||||||
|
LAUNCHER_MANIFEST = merge_launcher_manifests()
|
||||||
|
|
||||||
def fetch_game_versions():
|
def fetch_game_versions():
|
||||||
print('Fetching game versions...')
|
print('Fetching game versions...')
|
||||||
resp = requests.get(V2_VERSIONS_GAME)
|
resp = requests.get(V2_VERSIONS_GAME)
|
||||||
|
@ -36,21 +53,6 @@ def format_maven_url(base: str, name: str, extension: str='jar') -> str:
|
||||||
version = urllib.parse.quote(version)
|
version = urllib.parse.quote(version)
|
||||||
return base + group + '/' + name + '/' + version + '/' + filename
|
return base + group + '/' + name + '/' + version + '/' + filename
|
||||||
|
|
||||||
def fetch_launcher_manifest(manifest: str):
|
|
||||||
resp = requests.get(manifest)
|
|
||||||
resp.raise_for_status()
|
|
||||||
return resp.json()
|
|
||||||
|
|
||||||
def merge_launcher_manifests():
|
|
||||||
launcher_manifest = fetch_launcher_manifest(LAUNCHER_MANIFEST)
|
|
||||||
experimental_launcher_manifest = fetch_launcher_manifest(EXPERIMENTAL_LAUNCHER_MANIFEST)
|
|
||||||
full_launcher_manifest = {}
|
|
||||||
for version in launcher_manifest['versions']:
|
|
||||||
full_launcher_manifest[version['id']] = version
|
|
||||||
for version in experimental_launcher_manifest['versions']:
|
|
||||||
full_launcher_manifest[version['id']] = version
|
|
||||||
return full_launcher_manifest
|
|
||||||
|
|
||||||
def create_jar_name(maven_url: str) -> str:
|
def create_jar_name(maven_url: str) -> str:
|
||||||
return re.sub(r'[^a-zA-Z0-9-_.]', '__', maven_url)
|
return re.sub(r'[^a-zA-Z0-9-_.]', '__', maven_url)
|
||||||
|
|
||||||
|
@ -81,38 +83,39 @@ def library_info(baseUrl: str, mavenName: str, sha256: str):
|
||||||
'sha256': make_nix_hash('sha256', resp.text),
|
'sha256': make_nix_hash('sha256', resp.text),
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@functools.cache
|
||||||
|
def get_vanilla_details(version: str):
|
||||||
|
print(f' Fetching JAR information for {version}...')
|
||||||
|
resp = requests.get(LAUNCHER_MANIFEST[version]['url'])
|
||||||
|
resp.raise_for_status()
|
||||||
|
resp = resp.json()
|
||||||
|
server = resp['downloads']['server']
|
||||||
|
client = resp['downloads']['client']
|
||||||
|
javaVersion = '8'
|
||||||
|
if 'javaVersion' in resp and 'majorVersion' in resp['javaVersion']:
|
||||||
|
javaVersion = resp['javaVersion']['majorVersion']
|
||||||
|
return {
|
||||||
|
'serverJar': server,
|
||||||
|
'clientJar': client,
|
||||||
|
'javaVersion': javaVersion,
|
||||||
|
}
|
||||||
|
|
||||||
def get_libraries(libraries):
|
def get_libraries(libraries):
|
||||||
return list(map(lambda lib: library_info(lib['url'], lib['name'], lib['sha256'] if 'sha256' in lib else None), libraries))
|
return list(map(lambda lib: library_info(lib['url'], lib['name'], lib['sha256'] if 'sha256' in lib else None), libraries))
|
||||||
|
|
||||||
def generate_version_info(game_version: str, loader_version: str):
|
def generate_version_info(game_version: str, loader_version: str):
|
||||||
profile = fetch_server_profile(game_version, loader_version)
|
profile = fetch_server_profile(game_version, loader_version)
|
||||||
|
vanilla = get_vanilla_details(game_version)
|
||||||
return {
|
return {
|
||||||
'id': profile['id'],
|
'id': profile['id'],
|
||||||
'mainClass': profile['mainClass'],
|
'mainClass': profile['mainClass'],
|
||||||
'libraries': get_libraries(profile['libraries']),
|
'libraries': get_libraries(profile['libraries']),
|
||||||
|
'vanilla': vanilla,
|
||||||
}
|
}
|
||||||
|
|
||||||
def main():
|
def main():
|
||||||
versions = fetch_game_versions()
|
versions = fetch_game_versions()
|
||||||
|
|
||||||
launcher_manifest = merge_launcher_manifests()
|
|
||||||
|
|
||||||
@functools.cache
|
|
||||||
def get_server_jar(version: str):
|
|
||||||
print(f' Fetching server JAR information for {version}...')
|
|
||||||
resp = requests.get(launcher_manifest[version]['url'])
|
|
||||||
resp.raise_for_status()
|
|
||||||
resp = resp.json()
|
|
||||||
server = resp['downloads']['server']
|
|
||||||
javaVersion = '8'
|
|
||||||
if 'javaVersion' in resp and 'majorVersion' in resp['javaVersion']:
|
|
||||||
javaVersion = resp['javaVersion']['majorVersion']
|
|
||||||
return {
|
|
||||||
'url': server['url'],
|
|
||||||
'sha1': server['sha1'],
|
|
||||||
'javaVersion': javaVersion,
|
|
||||||
}
|
|
||||||
|
|
||||||
output_versions = {}
|
output_versions = {}
|
||||||
latestStable = None
|
latestStable = None
|
||||||
latestUnstable = None
|
latestUnstable = None
|
||||||
|
@ -122,9 +125,7 @@ def main():
|
||||||
elif not latestUnstable and not version['stable']:
|
elif not latestUnstable and not version['stable']:
|
||||||
latestUnstable = version['version']
|
latestUnstable = version['version']
|
||||||
print(f'Fetching data for version {version['version']}...')
|
print(f'Fetching data for version {version['version']}...')
|
||||||
server_jar = get_server_jar(version['version'])
|
|
||||||
version_data = generate_version_info(version['version'], LOADER_VERSION)
|
version_data = generate_version_info(version['version'], LOADER_VERSION)
|
||||||
version_data['vanillaJar'] = server_jar
|
|
||||||
output_versions[version['version']] = version_data
|
output_versions[version['version']] = version_data
|
||||||
with open('versions.json', 'w') as f:
|
with open('versions.json', 'w') as f:
|
||||||
json.dump({
|
json.dump({
|
||||||
|
|
30
minecraft-jars.nix
Normal file
30
minecraft-jars.nix
Normal file
|
@ -0,0 +1,30 @@
|
||||||
|
{ callPackage
|
||||||
|
, lib
|
||||||
|
, fetchurl
|
||||||
|
|
||||||
|
, javaPackages
|
||||||
|
}:
|
||||||
|
|
||||||
|
let
|
||||||
|
versions = lib.importJSON ./versions.json;
|
||||||
|
|
||||||
|
escapeVersion = builtins.replaceStrings [ "." ] [ "_" ];
|
||||||
|
getJavaVersion = v: (builtins.getAttr "openjdk${toString v}" javaPackages.compiler).headless;
|
||||||
|
in
|
||||||
|
|
||||||
|
lib.mapAttrs'
|
||||||
|
(version: value: {
|
||||||
|
name = escapeVersion version;
|
||||||
|
value = {
|
||||||
|
client = fetchurl {
|
||||||
|
url = value.vanilla.clientJar.url;
|
||||||
|
sha1 = value.vanilla.clientJar.sha1;
|
||||||
|
};
|
||||||
|
server = fetchurl {
|
||||||
|
url = value.vanilla.serverJar.url;
|
||||||
|
sha1 = value.vanilla.serverJar.sha1;
|
||||||
|
};
|
||||||
|
javaVersion = getJavaVersion value.vanilla.javaVersion;
|
||||||
|
};
|
||||||
|
})
|
||||||
|
versions.versions
|
5278
versions.json
5278
versions.json
File diff suppressed because it is too large
Load diff
Loading…
Reference in a new issue