{ config, pkgs, lib, ... }: with lib; let dataDir = "/var/lib/mx-puppet-slack"; registrationFile = "${dataDir}/slack-registration.yaml"; cfg = config.services.mx-puppet-slack; settingsFormat = pkgs.formats.json {}; settingsFile = settingsFormat.generate "mx-puppet-slack-config.json" cfg.settings; mx-puppet-slack = pkgs.callPackage ./pkg-mx-puppet-slack.nix { }; in { options = { services.mx-puppet-slack = { enable = mkEnableOption '' mx-puppet-slack is a slack puppeting bridge for matrix. It handles bridging private and group DMs, as well as Guilds (servers) ''; settings = mkOption rec { apply = recursiveUpdate default; inherit (settingsFormat) type; default = { bridge.port = 8434; presence = { enabled = true; interval = 500; }; provisioning.whitelist = [ ]; relay.whitelist = [ ]; # variables are preceded by a colon. namePatterns = { user = ":name"; userOverride = ":displayname"; room = ":name"; group = ":name"; }; #defaults to sqlite but can be configured to use postgresql with #connstring database.filename = "${dataDir}/database.db"; logging = { console = "info"; lineDateFormat = "MMM-D HH:mm:ss.SSS"; }; }; example = literalExpression '' { bridge = { bindAddress = "localhost"; domain = "example.com"; homeserverUrl = "https://example.com"; }; provisioning.whitelist = [ "@admin:example.com" ]; relay.whitelist = [ "@.*:example.com" ]; } ''; description = '' config.yaml configuration as a Nix attribute set. Configuration options should match those described in sample.config.yaml. ''; }; serviceDependencies = mkOption { type = with types; listOf str; default = optional config.services.matrix-synapse.enable "matrix-synapse.service"; description = '' List of Systemd services to require and wait for when starting the application service. ''; }; }; }; config = mkIf cfg.enable { systemd.services.mx-puppet-slack = { description = '' mx-puppet-slack is a slack puppeting bridge for matrix. It handles bridging private and group DMs, as well as Guilds (servers). ''; wantedBy = [ "multi-user.target" ]; wants = [ "network-online.target" ] ++ cfg.serviceDependencies; after = [ "network-online.target" ] ++ cfg.serviceDependencies; preStart = '' # generate the appservice's registration file if absent if [ ! -f '${registrationFile}' ]; then ${mx-puppet-slack}/bin/mx-puppet-slack -r -c ${settingsFile} \ -f ${registrationFile} fi ''; serviceConfig = { Type = "simple"; Restart = "always"; ProtectSystem = "strict"; ProtectHome = true; ProtectKernelTunables = true; ProtectKernelModules = true; ProtectControlGroups = true; DynamicUser = true; PrivateTmp = true; WorkingDirectory = mx-puppet-slack; StateDirectory = baseNameOf dataDir; UMask = 0027; ExecStart = '' ${mx-puppet-slack}/bin/mx-puppet-slack \ -c ${settingsFile} \ -f ${registrationFile} ''; }; }; }; meta.maintainers = with maintainers; [ chickensoupwithrice ]; }