feat(minecraft): permissions

This commit is contained in:
arcnmx 2024-05-01 11:18:43 -07:00
parent e2a091e17a
commit 9184146fed
2 changed files with 44 additions and 10 deletions

View file

@ -13,17 +13,31 @@ let
xuid = mkOption { xuid = mkOption {
type = oneOf [ int str ]; type = oneOf [ int str ];
}; };
permission = mkOption {
type = enum [ "visitor" "member" "operator" ];
default = "member";
};
settings = mkOption { settings = mkOption {
type = attrsOf str; type = attrsOf str;
}; };
permissionSettings = mkOption {
type = attrsOf str;
}; };
config = { };
settings = { config = let
name = mkOptionDefault config.name; xuid = {
xuid = mkOptionDefault {
string = toString (hexToInt config.xuid); string = toString (hexToInt config.xuid);
int = toString config.xuid; int = toString config.xuid;
}.${typeOf config.xuid}; }.${typeOf config.xuid};
in {
settings = {
name = mkOptionDefault config.name;
xuid = mkOptionDefault xuid;
# TODO: ignoresPlayerLimit = true/false
};
permissionSettings = {
xuid = mkOptionDefault xuid;
permission = mkOptionDefault config.permission;
}; };
}; };
}; };
@ -85,6 +99,7 @@ in { config, gensokyo-zone, lib, pkgs, ... }: let
inherit (lib.options) mkOption mkPackageOption; inherit (lib.options) mkOption mkPackageOption;
inherit (lib.modules) mkIf mkMerge mkOptionDefault; inherit (lib.modules) mkIf mkMerge mkOptionDefault;
inherit (lib.attrsets) filterAttrs mapAttrsToList; inherit (lib.attrsets) filterAttrs mapAttrsToList;
inherit (lib.lists) optional;
inherit (lib.strings) concatStringsSep; inherit (lib.strings) concatStringsSep;
inherit (lib.trivial) boolToString; inherit (lib.trivial) boolToString;
inherit (lib.meta) getExe; inherit (lib.meta) getExe;
@ -185,6 +200,10 @@ in {
type = nullOr path; type = nullOr path;
}; };
permissions = mkOption {
type = nullOr path;
};
packs = mkOption { packs = mkOption {
type = attrsOf (submoduleWith { type = attrsOf (submoduleWith {
modules = [ packModule ]; modules = [ packModule ];
@ -234,6 +253,15 @@ in {
if cfg.allowPlayers != null then allowListJson if cfg.allowPlayers != null then allowListJson
else null else null
); );
permissions = let
permissions = mapAttrsToList (_: allow: allow.permissionSettings) cfg.allowPlayers;
permissionsJson = pkgs.writeText "minecraft-bedrock-server-permissions.json" (
toJSON permissions
);
in mkOptionDefault (
if cfg.allowPlayers != null then permissionsJson
else null
);
}; };
conf.users.users.${cfg.user} = { conf.users.users.${cfg.user} = {
inherit (cfg) group; inherit (cfg) group;
@ -251,7 +279,7 @@ in {
serviceConfig = { serviceConfig = {
BindReadOnlyPaths = let BindReadOnlyPaths = let
packageResources = map (subpath: "${cfg.package}/var/lib/minecraft-bedrock/${subpath}:${cfg.dataDir}/${subpath}") [ packageResources = map (subpath: "${cfg.package}/var/lib/minecraft-bedrock/${subpath}:${cfg.dataDir}/${subpath}") ([
"definitions/attachables" "definitions/attachables"
"definitions/biomes" "definitions/biomes"
"definitions/feature_rules" "definitions/feature_rules"
@ -264,8 +292,7 @@ in {
"config/default" "config/default"
"bedrock_server_symbols.debug" "bedrock_server_symbols.debug"
"env-vars" "env-vars"
"permissions.json" ] ++ optional (cfg.permissions == null) "permissions.json");
];
mkWorldPacks = type: let mkWorldPacks = type: let
enabledPacks = filterAttrs (_: pack: pack.enable && pack.packType == "${type}_packs") cfg.packs; enabledPacks = filterAttrs (_: pack: pack.enable && pack.packType == "${type}_packs") cfg.packs;
jsonName = "world_${type}_packs.json"; jsonName = "world_${type}_packs.json";
@ -288,6 +315,7 @@ in {
in mkMerge [ in mkMerge [
packageResources packageResources
(mkIf (cfg.allowList != null) [ "${cfg.allowList}:${cfg.dataDir}/allowlist.json" ]) (mkIf (cfg.allowList != null) [ "${cfg.allowList}:${cfg.dataDir}/allowlist.json" ])
(mkIf (cfg.permissions != null) [ "${cfg.permissions}:${cfg.dataDir}/permissions.json" ])
(mkIf (cfg.packs != { }) packsPaths) (mkIf (cfg.packs != { }) packsPaths)
]; ];
ExecStart = [ ExecStart = [

View file

@ -21,8 +21,14 @@ in {
base = 2535420000000000; base = 2535420000000000;
nums = 1760; nums = 1760;
in { in {
Kyxna.xuid = base + 44308966797; Kyxna = {
arcnmx.xuid = base + 413399068799; xuid = base + 44308966797;
permission = "operator";
};
arcnmx = {
xuid = base + 53399068799;
permission = "operator";
};
"ConnieHeart${toString (base / 1000000000000 + nums)}".xuid = base + 417602225; "ConnieHeart${toString (base / 1000000000000 + nums)}".xuid = base + 417602225;
}; };
}; };