diff options
author | Alyssa Ross <hi@alyssa.is> | 2022-02-22 10:43:06 +0000 |
---|---|---|
committer | Alyssa Ross <hi@alyssa.is> | 2022-03-11 16:17:56 +0000 |
commit | ca1aada113c0ebda1ab8667199f6453f8e01c4fc (patch) | |
tree | 55e402280096f62eb0bc8bcad5ce6050c5a0aec7 /nixpkgs/pkgs/games/minecraft-servers | |
parent | e4df5a52a6a6531f32626f57205356a773ac2975 (diff) | |
parent | 93883402a445ad467320925a0a5dbe43a949f25b (diff) | |
download | nixlib-ca1aada113c0ebda1ab8667199f6453f8e01c4fc.tar nixlib-ca1aada113c0ebda1ab8667199f6453f8e01c4fc.tar.gz nixlib-ca1aada113c0ebda1ab8667199f6453f8e01c4fc.tar.bz2 nixlib-ca1aada113c0ebda1ab8667199f6453f8e01c4fc.tar.lz nixlib-ca1aada113c0ebda1ab8667199f6453f8e01c4fc.tar.xz nixlib-ca1aada113c0ebda1ab8667199f6453f8e01c4fc.tar.zst nixlib-ca1aada113c0ebda1ab8667199f6453f8e01c4fc.zip |
Merge commit '93883402a445ad467320925a0a5dbe43a949f25b'
Conflicts: nixpkgs/nixos/modules/programs/ssh.nix nixpkgs/pkgs/applications/networking/browsers/firefox/packages.nix nixpkgs/pkgs/data/fonts/noto-fonts/default.nix nixpkgs/pkgs/development/go-modules/generic/default.nix nixpkgs/pkgs/development/interpreters/ruby/default.nix nixpkgs/pkgs/development/libraries/mesa/default.nix
Diffstat (limited to 'nixpkgs/pkgs/games/minecraft-servers')
-rw-r--r-- | nixpkgs/pkgs/games/minecraft-servers/default.nix | 24 | ||||
-rw-r--r-- | nixpkgs/pkgs/games/minecraft-servers/derivation.nix | 36 | ||||
-rwxr-xr-x | nixpkgs/pkgs/games/minecraft-servers/update.py | 156 | ||||
-rw-r--r-- | nixpkgs/pkgs/games/minecraft-servers/versions.json | 104 |
4 files changed, 320 insertions, 0 deletions
diff --git a/nixpkgs/pkgs/games/minecraft-servers/default.nix b/nixpkgs/pkgs/games/minecraft-servers/default.nix new file mode 100644 index 000000000000..f3d4aad16698 --- /dev/null +++ b/nixpkgs/pkgs/games/minecraft-servers/default.nix @@ -0,0 +1,24 @@ +{ callPackage, lib, javaPackages }: +let + versions = lib.importJSON ./versions.json; + + latestVersion = lib.last (builtins.sort lib.versionOlder (builtins.attrNames versions)); + escapeVersion = builtins.replaceStrings [ "." ] [ "-" ]; + + getJavaVersion = v: (builtins.getAttr "openjdk${toString v}" javaPackages.compiler).headless; + + packages = lib.mapAttrs' + (version: value: { + name = "vanilla-${escapeVersion version}"; + value = callPackage ./derivation.nix { + inherit (value) version url sha1; + jre_headless = getJavaVersion (if value.javaVersion == null then 8 else value.javaVersion); # versions <= 1.6 will default to 8 + }; + }) + versions; +in +lib.recurseIntoAttrs ( + packages // { + vanilla = builtins.getAttr "vanilla-${escapeVersion latestVersion}" packages; + } +) diff --git a/nixpkgs/pkgs/games/minecraft-servers/derivation.nix b/nixpkgs/pkgs/games/minecraft-servers/derivation.nix new file mode 100644 index 000000000000..eda7da943ca5 --- /dev/null +++ b/nixpkgs/pkgs/games/minecraft-servers/derivation.nix @@ -0,0 +1,36 @@ +{ lib, stdenv, fetchurl, nixosTests, jre_headless, version, url, sha1 }: +stdenv.mkDerivation { + pname = "minecraft-server"; + inherit version; + + src = fetchurl { inherit url sha1; }; + + preferLocalBuild = true; + + installPhase = '' + mkdir -p $out/bin $out/lib/minecraft + cp -v $src $out/lib/minecraft/server.jar + + cat > $out/bin/minecraft-server << EOF + #!/bin/sh + exec ${jre_headless}/bin/java \$@ -jar $out/lib/minecraft/server.jar nogui + EOF + + chmod +x $out/bin/minecraft-server + ''; + + dontUnpack = true; + + passthru = { + tests = { inherit (nixosTests) minecraft-server; }; + updateScript = ./update.py; + }; + + meta = with lib; { + description = "Minecraft Server"; + homepage = "https://minecraft.net"; + license = licenses.unfreeRedistributable; + platforms = platforms.unix; + maintainers = with maintainers; [ thoughtpolice tomberek costrouc jyooru ]; + }; +} diff --git a/nixpkgs/pkgs/games/minecraft-servers/update.py b/nixpkgs/pkgs/games/minecraft-servers/update.py new file mode 100755 index 000000000000..0e7f10a8c932 --- /dev/null +++ b/nixpkgs/pkgs/games/minecraft-servers/update.py @@ -0,0 +1,156 @@ +#!/usr/bin/env nix-shell +#!nix-shell -i python3 -p python3Packages.requests python3Packages.dataclasses-json + +import json +from dataclasses import dataclass, field +from datetime import datetime +from pathlib import Path +from typing import Any, Dict, List, Optional + +import requests +from dataclasses_json import DataClassJsonMixin, LetterCase, config +from marshmallow import fields + + +@dataclass +class Download(DataClassJsonMixin): + sha1: str + size: int + url: str + + +@dataclass +class Version(DataClassJsonMixin): + id: str + type: str + url: str + time: datetime = field( + metadata=config( + encoder=datetime.isoformat, + decoder=datetime.fromisoformat, + mm_field=fields.DateTime(format="iso"), + ) + ) + release_time: datetime = field( + metadata=config( + encoder=datetime.isoformat, + decoder=datetime.fromisoformat, + mm_field=fields.DateTime(format="iso"), + letter_case=LetterCase.CAMEL, + ) + ) + + def get_manifest(self) -> Any: + """Return the version's manifest.""" + response = requests.get(self.url) + response.raise_for_status() + return response.json() + + def get_downloads(self) -> Dict[str, Download]: + """ + Return all downloadable files from the version's manifest, in Download + objects. + """ + return { + download_name: Download.from_dict(download_info) + for download_name, download_info in self.get_manifest()["downloads"].items() + } + + def get_java_version(self) -> Any: + """ + Return the java version specified in a version's manifest, if it is + present. Versions <= 1.6 do not specify this. + """ + return self.get_manifest().get("javaVersion", {}).get("majorVersion", None) + + def get_server(self) -> Optional[Download]: + """ + If the version has a server download available, return the Download + object for the server download. If the version does not have a server + download avilable, return None. + """ + downloads = self.get_downloads() + if "server" in downloads: + return downloads["server"] + return None + + +def get_versions() -> List[Version]: + """Return a list of Version objects for all available versions.""" + response = requests.get( + "https://launchermeta.mojang.com/mc/game/version_manifest.json" + ) + response.raise_for_status() + data = response.json() + return [Version.from_dict(version) for version in data["versions"]] + + +def get_major_release(version_id: str) -> str: + """ + Return the major release for a version. The major release for 1.17 and + 1.17.1 is 1.17. + """ + if not len(version_id.split(".")) >= 2: + raise ValueError(f"version not in expected format: '{version_id}'") + return ".".join(version_id.split(".")[:2]) + + +def group_major_releases(releases: List[Version]) -> Dict[str, List[Version]]: + """ + Return a dictionary containing each version grouped by each major release. + The key "1.17" contains a list with two Version objects, one for "1.17" + and another for "1.17.1". + """ + groups: Dict[str, List[Version]] = {} + for release in releases: + major_release = get_major_release(release.id) + if major_release not in groups: + groups[major_release] = [] + groups[major_release].append(release) + return groups + + +def get_latest_major_releases(releases: List[Version]) -> Dict[str, Version]: + """ + Return a dictionary containing the latest version for each major release. + The latest major release for 1.16 is 1.16.5, so the key "1.16" contains a + Version object for 1.16.5. + """ + return { + major_release: sorted(releases, key=lambda x: x.id, reverse=True)[0] + for major_release, releases in group_major_releases(releases).items() + } + + +def generate() -> Dict[str, Dict[str, str]]: + """ + Return a dictionary containing the latest url, sha1 and version for each major + release. + """ + versions = get_versions() + releases = list( + filter(lambda version: version.type == "release", versions) + ) # remove snapshots and betas + latest_major_releases = get_latest_major_releases(releases) + + servers = { + version: Download.schema().dump(download_info) # Download -> dict + for version, download_info in { + version: value.get_server() + for version, value in latest_major_releases.items() + }.items() + if download_info is not None # versions < 1.2 do not have a server + } + for server in servers.values(): + del server["size"] # don't need it + + for version, server in servers.items(): + server["version"] = latest_major_releases[version].id + server["javaVersion"] = latest_major_releases[version].get_java_version() + return servers + + +if __name__ == "__main__": + with open(Path(__file__).parent / "versions.json", "w") as file: + json.dump(generate(), file, indent=2) + file.write("\n") diff --git a/nixpkgs/pkgs/games/minecraft-servers/versions.json b/nixpkgs/pkgs/games/minecraft-servers/versions.json new file mode 100644 index 000000000000..ba0b652a6bdc --- /dev/null +++ b/nixpkgs/pkgs/games/minecraft-servers/versions.json @@ -0,0 +1,104 @@ +{ + "1.18": { + "url": "https://launcher.mojang.com/v1/objects/125e5adf40c659fd3bce3e66e67a16bb49ecc1b9/server.jar", + "sha1": "125e5adf40c659fd3bce3e66e67a16bb49ecc1b9", + "version": "1.18.1", + "javaVersion": 17 + }, + "1.17": { + "url": "https://launcher.mojang.com/v1/objects/a16d67e5807f57fc4e550299cf20226194497dc2/server.jar", + "sha1": "a16d67e5807f57fc4e550299cf20226194497dc2", + "version": "1.17.1", + "javaVersion": 16 + }, + "1.16": { + "url": "https://launcher.mojang.com/v1/objects/1b557e7b033b583cd9f66746b7a9ab1ec1673ced/server.jar", + "sha1": "1b557e7b033b583cd9f66746b7a9ab1ec1673ced", + "version": "1.16.5", + "javaVersion": 8 + }, + "1.15": { + "url": "https://launcher.mojang.com/v1/objects/bb2b6b1aefcd70dfd1892149ac3a215f6c636b07/server.jar", + "sha1": "bb2b6b1aefcd70dfd1892149ac3a215f6c636b07", + "version": "1.15.2", + "javaVersion": 8 + }, + "1.14": { + "url": "https://launcher.mojang.com/v1/objects/3dc3d84a581f14691199cf6831b71ed1296a9fdf/server.jar", + "sha1": "3dc3d84a581f14691199cf6831b71ed1296a9fdf", + "version": "1.14.4", + "javaVersion": 8 + }, + "1.13": { + "url": "https://launcher.mojang.com/v1/objects/3737db93722a9e39eeada7c27e7aca28b144ffa7/server.jar", + "sha1": "3737db93722a9e39eeada7c27e7aca28b144ffa7", + "version": "1.13.2", + "javaVersion": 8 + }, + "1.12": { + "url": "https://launcher.mojang.com/v1/objects/886945bfb2b978778c3a0288fd7fab09d315b25f/server.jar", + "sha1": "886945bfb2b978778c3a0288fd7fab09d315b25f", + "version": "1.12.2", + "javaVersion": 8 + }, + "1.11": { + "url": "https://launcher.mojang.com/v1/objects/f00c294a1576e03fddcac777c3cf4c7d404c4ba4/server.jar", + "sha1": "f00c294a1576e03fddcac777c3cf4c7d404c4ba4", + "version": "1.11.2", + "javaVersion": 8 + }, + "1.10": { + "url": "https://launcher.mojang.com/v1/objects/3d501b23df53c548254f5e3f66492d178a48db63/server.jar", + "sha1": "3d501b23df53c548254f5e3f66492d178a48db63", + "version": "1.10.2", + "javaVersion": 8 + }, + "1.9": { + "url": "https://launcher.mojang.com/v1/objects/edbb7b1758af33d365bf835eb9d13de005b1e274/server.jar", + "sha1": "edbb7b1758af33d365bf835eb9d13de005b1e274", + "version": "1.9.4", + "javaVersion": 8 + }, + "1.8": { + "url": "https://launcher.mojang.com/v1/objects/b58b2ceb36e01bcd8dbf49c8fb66c55a9f0676cd/server.jar", + "sha1": "b58b2ceb36e01bcd8dbf49c8fb66c55a9f0676cd", + "version": "1.8.9", + "javaVersion": 8 + }, + "1.7": { + "url": "https://launcher.mojang.com/v1/objects/4cec86a928ec171fdc0c6b40de2de102f21601b5/server.jar", + "sha1": "4cec86a928ec171fdc0c6b40de2de102f21601b5", + "version": "1.7.9", + "javaVersion": 8 + }, + "1.6": { + "url": "https://launcher.mojang.com/v1/objects/050f93c1f3fe9e2052398f7bd6aca10c63d64a87/server.jar", + "sha1": "050f93c1f3fe9e2052398f7bd6aca10c63d64a87", + "version": "1.6.4", + "javaVersion": null + }, + "1.5": { + "url": "https://launcher.mojang.com/v1/objects/f9ae3f651319151ce99a0bfad6b34fa16eb6775f/server.jar", + "sha1": "f9ae3f651319151ce99a0bfad6b34fa16eb6775f", + "version": "1.5.2", + "javaVersion": null + }, + "1.4": { + "url": "https://launcher.mojang.com/v1/objects/2f0ec8efddd2f2c674c77be9ddb370b727dec676/server.jar", + "sha1": "2f0ec8efddd2f2c674c77be9ddb370b727dec676", + "version": "1.4.7", + "javaVersion": null + }, + "1.3": { + "url": "https://launcher.mojang.com/v1/objects/3de2ae6c488135596e073a9589842800c9f53bfe/server.jar", + "sha1": "3de2ae6c488135596e073a9589842800c9f53bfe", + "version": "1.3.2", + "javaVersion": null + }, + "1.2": { + "url": "https://launcher.mojang.com/v1/objects/d8321edc9470e56b8ad5c67bbd16beba25843336/server.jar", + "sha1": "d8321edc9470e56b8ad5c67bbd16beba25843336", + "version": "1.2.5", + "javaVersion": null + } +} |