aboutsummaryrefslogtreecommitdiff
path: root/home-manager/modules/services/imapnotify.nix
diff options
context:
space:
mode:
Diffstat (limited to 'home-manager/modules/services/imapnotify.nix')
-rw-r--r--home-manager/modules/services/imapnotify.nix90
1 files changed, 90 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..b59b006e335
--- /dev/null
+++ b/home-manager/modules/services/imapnotify.nix
@@ -0,0 +1,90 @@
+{ 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);
+ };
+}