about summary refs log tree commit diff
path: root/nixpkgs/pkgs/games/minecraft-servers
diff options
context:
space:
mode:
authorAlyssa Ross <hi@alyssa.is>2022-02-22 10:43:06 +0000
committerAlyssa Ross <hi@alyssa.is>2022-03-11 16:17:56 +0000
commitca1aada113c0ebda1ab8667199f6453f8e01c4fc (patch)
tree55e402280096f62eb0bc8bcad5ce6050c5a0aec7 /nixpkgs/pkgs/games/minecraft-servers
parente4df5a52a6a6531f32626f57205356a773ac2975 (diff)
parent93883402a445ad467320925a0a5dbe43a949f25b (diff)
downloadnixlib-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.nix24
-rw-r--r--nixpkgs/pkgs/games/minecraft-servers/derivation.nix36
-rwxr-xr-xnixpkgs/pkgs/games/minecraft-servers/update.py156
-rw-r--r--nixpkgs/pkgs/games/minecraft-servers/versions.json104
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
+  }
+}