diff options
Diffstat (limited to 'home-manager/modules/services/imapnotify.nix')
-rw-r--r-- | home-manager/modules/services/imapnotify.nix | 107 |
1 files changed, 107 insertions, 0 deletions
diff --git a/home-manager/modules/services/imapnotify.nix b/home-manager/modules/services/imapnotify.nix new file mode 100644 index 00000000000..fbb0713e978 --- /dev/null +++ b/home-manager/modules/services/imapnotify.nix @@ -0,0 +1,107 @@ +{ config, lib, pkgs, ... }: + +with lib; + +let + + cfg = config.services.imapnotify; + + safeName = lib.replaceChars ["@" ":" "\\" "[" "]"] ["-" "-" "-" "" ""]; + + imapnotifyAccounts = + filter (a: a.imapnotify.enable) + (attrValues config.accounts.email.accounts); + + genAccountUnit = account: + let + name = safeName account.name; + in + { + name = "imapnotify-${name}"; + value = { + Unit = { + Description = "imapnotify for ${name}"; + }; + + Service = { + ExecStart = "${pkgs.imapnotify}/bin/imapnotify -c ${genAccountConfig account}"; + } // optionalAttrs account.notmuch.enable { + Environment = "NOTMUCH_CONFIG=${config.xdg.configHome}/notmuch/notmuchrc"; + }; + + Install = { + WantedBy = [ "default.target" ]; + }; + }; + }; + + genAccountConfig = account: + pkgs.writeText "imapnotify-${safeName account.name}-config.js" ( + let + port = + if account.imap.port != null then account.imap.port + else if account.imap.tls.enable then 993 + else 143; + + toJSON = builtins.toJSON; + in + '' + var child_process = require('child_process'); + + function getStdout(cmd) { + var stdout = child_process.execSync(cmd); + return stdout.toString().trim(); + } + + exports.host = ${toJSON account.imap.host} + exports.port = ${toJSON port}; + exports.tls = ${toJSON account.imap.tls.enable}; + exports.username = ${toJSON account.userName}; + exports.password = getStdout("${toString account.passwordCommand}"); + exports.onNotify = ${toJSON account.imapnotify.onNotify}; + exports.onNotifyPost = ${toJSON account.imapnotify.onNotifyPost}; + exports.boxes = ${toJSON account.imapnotify.boxes}; + '' + ); + +in + +{ + meta.maintainers = [ maintainers.nickhu ]; + + options = { + services.imapnotify = { + enable = mkEnableOption "imapnotify"; + }; + + accounts.email.accounts = mkOption { + type = with types; attrsOf (submodule ( + import ./imapnotify-accounts.nix + )); + }; + }; + + config = mkIf cfg.enable { + assertions = + let + checkAccounts = pred: msg: + let + badAccounts = filter pred imapnotifyAccounts; + in + { + assertion = badAccounts == []; + message = "imapnotify: Missing ${msg} for accounts: " + + concatMapStringsSep ", " (a: a.name) badAccounts; + }; + in + [ + (checkAccounts (a: a.maildir == null) "maildir configuration") + (checkAccounts (a: a.imap == null) "IMAP configuration") + (checkAccounts (a: a.passwordCommand == null) "password command") + (checkAccounts (a: a.userName == null) "username") + ]; + + systemd.user.services = + listToAttrs (map genAccountUnit imapnotifyAccounts); + }; +} |