feat(steam): bs user launch scripts

This commit is contained in:
arcnmx 2024-04-12 13:57:03 -07:00
parent 7959fbd8b2
commit 6ec990a5cd
2 changed files with 61 additions and 23 deletions

View file

@ -11,7 +11,7 @@
inherit (lib.modules) mkIf mkMerge mkDefault mkOptionDefault; inherit (lib.modules) mkIf mkMerge mkDefault mkOptionDefault;
inherit (lib.strings) hasSuffix replaceStrings optionalString concatStringsSep escapeShellArg makeBinPath versionOlder; inherit (lib.strings) hasSuffix replaceStrings optionalString concatStringsSep escapeShellArg makeBinPath versionOlder;
inherit (lib.attrsets) attrValues filterAttrs mapAttrs mapAttrs' mapAttrsToList listToAttrs nameValuePair; inherit (lib.attrsets) attrValues filterAttrs mapAttrs mapAttrs' mapAttrsToList listToAttrs nameValuePair;
inherit (lib.lists) concatMap head last filter sort singleton; inherit (lib.lists) concatLists head last filter sort singleton;
inherit (config.services.steam) accountSwitch; inherit (config.services.steam) accountSwitch;
cfg = config.services.steam.beatsaber; cfg = config.services.steam.beatsaber;
sortedVersions = sort (a: b: versionOlder a.version b.version) (attrValues cfg.versions); sortedVersions = sort (a: b: versionOlder a.version b.version) (attrValues cfg.versions);
@ -280,6 +280,18 @@
''; '';
}; };
}; };
userModule = { config, name, ... }: {
options = with lib.types; {
name = mkOption {
type = str;
default = name;
};
preferredVersion = mkOption {
type = str;
default = cfg.defaultVersion;
};
};
};
emptyFile = pkgs.writeText "empty.txt" ""; emptyFile = pkgs.writeText "empty.txt" "";
emptyJson = pkgs.writeText "empty.json" "{}"; emptyJson = pkgs.writeText "empty.json" "{}";
emptyDir = pkgs.runCommand "empty" { } '' emptyDir = pkgs.runCommand "empty" { } ''
@ -335,6 +347,9 @@
rmdir "%STEAM_BS_LIBRARY%" rmdir "%STEAM_BS_LIBRARY%"
mklink /D "%STEAM_BS_LIBRARY%" "%STEAM_BS_LAUNCH%" mklink /D "%STEAM_BS_LIBRARY%" "%STEAM_BS_LAUNCH%"
''; '';
launch = ''
cd /d "%STEAM_BS_LIBRARY%"
'' + ''"%STEAM_BS_LIBRARY%\Beat Saber.exe'';
setup = '' setup = ''
rmdir "%STEAM_BS_APPDATA%" rmdir "%STEAM_BS_APPDATA%"
rmdir "%STEAM_BS_LIBRARY%" rmdir "%STEAM_BS_LIBRARY%"
@ -351,14 +366,12 @@
launchbeatsaber = '' launchbeatsaber = ''
${vars} ${vars}
${mount} ${mount}
cd /d "%STEAM_BS_LIBRARY%" ${launch}
"%STEAM_BS_LIBRARY%\Beat Saber.exe"
${eof} ${eof}
''; '';
fpfcbeatsaber = '' fpfcbeatsaber = ''
${vars} ${vars}
cd /d "%STEAM_BS_LIBRARY%" ${launch} fpfc
"%STEAM_BS_LIBRARY%\Beat Saber.exe" fpfc
${eof} ${eof}
''; '';
setupbeatsaber = '' setupbeatsaber = ''
@ -388,8 +401,15 @@
set GENSO_STEAM_BS_LOCAL=1 set GENSO_STEAM_BS_LOCAL=1
${vars} ${vars}
${mount} ${mount}
cd /d "%STEAM_BS_LIBRARY%" ${launch}
"%STEAM_BS_LIBRARY%\Beat Saber.exe" ${eof}
'';
beatsaber-user = { user, version }: ''
set GENSO_STEAM_USER=${user}
set GENSO_STEAM_BS_VERSION=${version}
${vars}
${mount}
${launch}
${eof} ${eof}
''; '';
vanilla = '' vanilla = ''
@ -429,7 +449,7 @@ in {
default = { }; default = { };
}; };
users = mkOption { users = mkOption {
type = listOf str; type = attrsOf (submodule userModule);
}; };
dirName = mkOption { dirName = mkOption {
type = str; type = str;
@ -695,11 +715,9 @@ in {
defaultVersion = mkIf (allVersions != [ ]) (mkOptionDefault ( defaultVersion = mkIf (allVersions != [ ]) (mkOptionDefault (
head allVersions head allVersions
)); ));
users = mkOptionDefault ( users = mapAttrs (_: user: { name = mkDefault user.name; }) bsUsers;
mapAttrsToList (_: user: user.name) bsUsers
);
setupServiceNames = mkOptionDefault ( setupServiceNames = mkOptionDefault (
map (user: "steam-setup-beatsaber-${user}.service") cfg.users mapAttrsToList (_: user: "steam-setup-beatsaber-${user.name}.service") cfg.users
); );
files = mkMerge [ files = mkMerge [
userFiles userFiles
@ -718,9 +736,9 @@ in {
serviceConfig = { serviceConfig = {
Type = mkOptionDefault "oneshot"; Type = mkOptionDefault "oneshot";
RemainAfterExit = mkOptionDefault true; RemainAfterExit = mkOptionDefault true;
ExecStart = mkMerge (map (user: ExecStart = mkMerge (mapAttrsToList (_: user:
(mapAttrsToList (_: version: (mapAttrsToList (_: version:
"${mksetupbeatsaber { inherit user; inherit (version) version; }}" "${mksetupbeatsaber { user = user.name; inherit (version) version; }}"
) cfg.versions) ) cfg.versions)
) cfg.users); ) cfg.users);
}; };
@ -766,17 +784,17 @@ in {
nameValuePair "${cfg.sharedDataDir}/${folder}" shared nameValuePair "${cfg.sharedDataDir}/${folder}" shared
) sharedFolders ) sharedFolders
)) ))
] ++ concatMap (owner: ] ++ concatLists (mapAttrsToList (_: user:
singleton { singleton {
${cfg.dataDirFor owner} = personal owner; ${cfg.dataDirFor user.name} = personal user.name;
"${cfg.dataDirFor owner}/AppData" = personal owner; "${cfg.dataDirFor user.name}/AppData" = personal user.name;
"${cfg.dataDirFor owner}/UserData" = personal owner; "${cfg.dataDirFor user.name}/UserData" = personal user.name;
} ++ mapAttrsToList (_: version: { } ++ mapAttrsToList (_: version: {
"${cfg.dataDirFor owner}/${version.version}" = personal owner; "${cfg.dataDirFor user.name}/${version.version}" = personal user.name;
${cfg.userWorkingDirFor owner} = personal owner; ${cfg.userWorkingDirFor user.name} = personal user.name;
${cfg.workingDirFor { user = owner; inherit (version) version; }} = personal owner; ${cfg.workingDirFor { user = user.name; inherit (version) version; }} = personal user.name;
}) cfg.versions }) cfg.versions
) cfg.users ) cfg.users)
++ mapAttrsToList (_: version: { ++ mapAttrsToList (_: version: {
"${cfg.sharedDataDir}/${version.version}" = shared; "${cfg.sharedDataDir}/${version.version}" = shared;
}) cfg.versions; }) cfg.versions;
@ -793,6 +811,20 @@ in {
}; };
} }
) cfg.versions; ) cfg.versions;
userBinFiles = mapAttrs' (_: user: nameValuePair
"${cfg.binDir}/${user.name}.bat"
{
inherit (bin) owner group mode type;
src = pkgs.writeTextFile {
name = "beatsaber-${user.name}.bat";
executable = true;
text = beatsaber-user {
user = user.name;
version = user.preferredVersion;
};
};
}
) cfg.users;
binFiles = { binFiles = {
"${cfg.binDir}/mount.bat" = { "${cfg.binDir}/mount.bat" = {
inherit (bin) owner group mode type; inherit (bin) owner group mode type;
@ -866,7 +898,8 @@ in {
executable = true; executable = true;
}; };
}; };
} // versionBinFiles; } // versionBinFiles
// userBinFiles;
in { in {
enable = mkIf cfg.setup true; enable = mkIf cfg.setup true;
files = mkIf cfg.setup (mkMerge ( files = mkIf cfg.setup (mkMerge (

View file

@ -8,5 +8,10 @@ in {
"1.29.0" = {}; "1.29.0" = {};
"1.34.2" = {}; "1.34.2" = {};
}; };
users = {
arc.preferredVersion = "1.29.0";
kat.preferredVersion = "1.29.0";
kaosubaloo.preferredVersion = "1.29.0";
};
}; };
} }