/ nix / module.nix
module.nix
 1  self:
 2  {
 3    lib,
 4    config,
 5    pkgs,
 6    ...
 7  }:
 8  let
 9    settingsFormat = pkgs.formats.toml { };
10  in
11  {
12    options.services.aocbot = {
13      enable = lib.mkEnableOption "aocbot";
14  
15      package = lib.mkOption {
16        type = lib.types.package;
17        default = self.packages.${pkgs.stdenv.hostPlatform.system}.default;
18      };
19  
20      logLevel = lib.mkOption {
21        type = lib.types.str;
22        default = "info,matrix_sdk=warn";
23      };
24  
25      settings = lib.mkOption {
26        inherit (settingsFormat) type;
27        default = { };
28      };
29    };
30  
31    config =
32      let
33        cfg = config.services.aocbot;
34  
35        settings = settingsFormat.generate "config.toml" cfg.settings;
36  
37        aocbot-setup = pkgs.writeShellScriptBin "aocbot-setup" ''
38          export CONFIG_PATH=${settings}
39          export RUST_LOG=${lib.escapeShellArg cfg.logLevel}
40          ${lib.getExe pkgs.sudo} --preserve-env=CONFIG_PATH,RUST_LOG -u aocbot ${lib.getExe cfg.package} setup
41        '';
42      in
43      lib.mkIf cfg.enable {
44        systemd.services.aocbot = {
45          wantedBy = [ "multi-user.target" ];
46          wants = [ "network-online.target" ];
47          after = [ "network-online.target" ];
48  
49          serviceConfig = {
50            User = "aocbot";
51            Group = "aocbot";
52            StateDirectory = "aocbot";
53          };
54  
55          environment = {
56            CONFIG_PATH = "${settings}";
57            RUST_LOG = cfg.logLevel;
58          };
59  
60          script = ''
61            ${lib.getExe cfg.package} run
62          '';
63        };
64  
65        users.users.aocbot = {
66          isSystemUser = true;
67          group = "aocbot";
68        };
69        users.groups.aocbot = { };
70  
71        services.aocbot.settings = {
72          users = lib.mkDefault self.users;
73          matrix.store_path = lib.mkDefault "/var/lib/aocbot/store";
74        };
75  
76        environment.systemPackages = [ aocbot-setup ];
77      };
78  }