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.nix107
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);
+ };
+}