1{ config, lib, pkgs, ... }:
2
3with lib;
4
5let
6 cfg = config.programs.steam;
7
8 steam = pkgs.steam.override {
9 extraLibraries = pkgs: with config.hardware.opengl;
10 if pkgs.hostPlatform.is64bit
11 then [ package ] ++ extraPackages
12 else [ package32 ] ++ extraPackages32;
13 };
14in {
15 options.programs.steam = {
16 enable = mkEnableOption "steam";
17
18 remotePlay.openFirewall = mkOption {
19 type = types.bool;
20 default = false;
21 description = ''
22 Open ports in the firewall for Steam Remote Play.
23 '';
24 };
25
26 dedicatedServer.openFirewall = mkOption {
27 type = types.bool;
28 default = false;
29 description = ''
30 Open ports in the firewall for Source Dedicated Server.
31 '';
32 };
33 };
34
35 config = mkIf cfg.enable {
36 hardware.opengl = { # this fixes the "glXChooseVisual failed" bug, context: https://github.com/NixOS/nixpkgs/issues/47932
37 enable = true;
38 driSupport = true;
39 driSupport32Bit = true;
40 };
41
42 # optionally enable 32bit pulseaudio support if pulseaudio is enabled
43 hardware.pulseaudio.support32Bit = config.hardware.pulseaudio.enable;
44
45 hardware.steam-hardware.enable = true;
46
47 environment.systemPackages = [ steam steam.run ];
48
49 networking.firewall = lib.mkMerge [
50 (mkIf cfg.remotePlay.openFirewall {
51 allowedTCPPorts = [ 27036 ];
52 allowedUDPPortRanges = [ { from = 27031; to = 27036; } ];
53 })
54
55 (mkIf cfg.dedicatedServer.openFirewall {
56 allowedTCPPorts = [ 27015 ]; # SRCDS Rcon port
57 allowedUDPPorts = [ 27015 ]; # Gameplay traffic
58 })
59 ];
60 };
61
62 meta.maintainers = with maintainers; [ mkg20001 ];
63}