inputs: { config, lib, pkgs, ... }: with lib; let cfg = config.gaming; sunshineAssets = pkgs.runCommandNoCC "sunshine-assets" { } '' cp -r ${inputs.sunshine}/assets $out ''; sunshine = pkgs.stdenv.mkDerivation { name = "sunshine"; # src = inputs.sunshine; src = pkgs.fetchFromGitHub { owner = "loki-47-6F-64"; repo = "sunshine"; rev = "e4c9c292e57d39136df2d46d1e9b66eba53f3bd3"; sha256 = "sha256-YrQHHpw7GOcdlnyJI28VShYFrTRq7kpILnkyCYf77NE="; fetchSubmodules = true; }; cmakeFlags = [ "-DSUNSHINE_ASSETS_DIR=assets" "-DSUNSHINE_DEFAULT_DIR=${sunshineAssets}" ]; postPatch = '' substituteInPlace CMakeLists.txt \ --replace '/usr/include/libevdev-1.0' '${pkgs.libevdev}/include/libevdev-1.0' ''; installPhase = '' mkdir -p $out/bin cp sunshine $out/bin mkdir -p $out/etc cp -r ../assets $out/etc ''; postFixup = '' wrapProgram $out/bin/sunshine --prefix LD_LIBRARY_PATH ":" "/run/opengl-driver/lib" ''; nativeBuildInputs = with pkgs; [ cmake pkgconfig makeWrapper ]; hardeningDisable = [ "format" ]; buildInputs = with pkgs; [ openssl (boost.override { enableShared = false; enableStatic = true; }) wayland valgrind libffi ffmpeg libevdev libcap libdrm libpulseaudio libopus cudatoolkit_11_4 xorg.libXrandr xorg.libXfixes xorg.libXtst xorg.libxcb ]; }; in { options.gaming = { enable = mkEnableOption "Enable gaming stuff"; newWine = mkOption { type = types.bool; default = false; description = "If you want to include wine-staging as new-wine"; }; }; config = mkIf cfg.enable { home.packages = let newwine = (pkgs.wineFull.override { wineBuild = "wineWow"; wineRelease = "staging"; }); newwinetricks = pkgs.winetricks.override { wine = newwine; }; oldwine = pkgs.wineWowPackages.full; oldwinetricks = pkgs.winetricks.override { wine = oldwine; }; in with pkgs; [ oldwine oldwinetricks (pkgs.writeShellScriptBin "steam" "${pkgs.systemd}/bin/systemctl --user start steam") sc-controller dolphinEmuMaster ark unzip unrar mpv tuxpaint extremetuxracer ] ++ lib.optionals cfg.newWine [ ( pkgs.runCommand "new-wine-stuff" { } '' mkdir -p $out/bin ln -s ${newwine}/bin/wine $out/bin/new-wine ln -s ${newwine}/bin/winecfg $out/bin/new-winecfg ln -s ${newwinetricks}/bin/winetricks $out/bin/new-winetricks '' ) ]; systemd.user.services.sunshine = { Unit = { Description = "Host for Moonlight Streaming Client"; Requires = [ "dbus.service" ]; After = [ "graphical-session-pre.target" "network.target" ]; PartOf = [ "graphical-session.target" ]; }; Install = { WantedBy = [ "graphical-session.target" ]; }; Service = { WorkingDirectory = "${config.xdg.configHome}/sunshine"; Restart = "on-failure"; RestartSec = 3; ExecStart = "${sunshine}/bin/sunshine"; ExecStartPre = let script = pkgs.writeShellScript "sunshine-pre-start" '' ${pkgs.coreutils}/bin/mkdir -p $HOME/.config/sunshine/assets ${pkgs.coreutils}/bin/rm -rf $HOME/.config/sunshine/assets/shaders ${pkgs.coreutils}/bin/rm -rf $HOME/.config/sunshine/assets/web ${pkgs.coreutils}/bin/rm -rf $HOME/.config/sunshine/assets/box.png ${pkgs.coreutils}/bin/cp --no-preserve=all -r ${sunshineAssets}/shaders $HOME/.config/sunshine/assets ${pkgs.coreutils}/bin/cp --no-preserve=all -r ${sunshineAssets}/web $HOME/.config/sunshine/assets ${pkgs.coreutils}/bin/cp --no-preserve=all ${sunshineAssets}/box.png $HOME/.config/sunshine/assets ''; in "${script}"; }; }; systemd.user.services.scc = { Unit = { Description = "User-mode driver and GTK3 based GUI for Steam Controller"; After = [ "graphical-session-pre.target" ]; PartOf = [ "graphical-session.target" ]; }; Service = { Type = "simple"; ExecStart = "${pkgs.sc-controller}/bin/scc-daemon debug"; Restart = "always"; RestartSec = 5; }; Install = { WantedBy = [ "graphical-session.target" ]; }; }; systemd.user.services.steam = { Unit = { Description = "Start Steam gaming platform"; After = [ "graphical-session-pre.target" ]; PartOf = [ "graphical-session.target" ]; }; Service = { Type = "simple"; ExecStart = let steamStart = pkgs.writeShellScript "steam-start" '' ${pkgs.systemd}/bin/systemctl --user stop scc # no sleep is needed here because steam is slow as fuck lol /run/current-system/sw/bin/steam ''; in "${steamStart}"; ExecStop = let steamStop = pkgs.writeShellScript "steam-stop" '' ${pkgs.coreutils}/bin/sleep 5 # give time for controller to reset ${pkgs.systemd}/bin/systemctl --user start scc ''; in "${steamStop}"; }; Install = { WantedBy = [ "graphical-session.target" ]; }; }; }; }