(define-module (jd features mail)
#:use-module (rde packages)
#:use-module (rde exceptions)
#:use-module (rde features)
#:use-module (rde predicates)
#:use-module (rde features emacs)
#:use-module (rde features mail)
#:use-module ((rde features mail providers) #:prefix mail-providers:)
#:use-module (gnu packages mail)
#:use-module (gnu packages emacs-xyz)
#:use-module (rde packages emacs-xyz)
#:use-module (rde packages mail)
#:use-module (rde serializers elisp)
#:use-module (rde home services mail)
#:use-module (gnu services)
#:use-module (gnu services configuration)
#:use-module (gnu home services)
#:use-module (gnu home-services mail)
#:use-module (gnu home services mcron)
#:use-module (gnu home-services version-control)
#:use-module (gnu home services xdg)
#:use-module (ice-9 match)
#:use-module (srfi srfi-1)
#:use-module (guix gexp)
#:use-module (guix deprecation)
#:use-module (guix diagnostics)
#:use-module (guix i18n)
#:export (feature-l2md* feature-mail-mcron))
(define* (feature-l2md*
#:key
(l2md l2md))
"Configure l2md MDA."
(ensure-pred file-like? l2md)
(define (get-home-services config)
(require-value 'mail-directory-fn config)
(require-value 'mailing-lists config)
(define mail-dir ((get-value 'mail-directory-fn config) config))
(define mls (filter (lambda (x) (eq? (mailing-list-synchronizer x) 'l2md))
(get-value 'mailing-lists config)))
(define (get-repo-config ml)
(let ((repo-config (mailing-list-config ml)))
(if (eq? %unset-value (l2md-repo-maildir repo-config))
(l2md-repo
(inherit repo-config)
(maildir (string-append
mail-dir "/lists/" (mailing-list-fqda ml) "/archive")))
repo-config)))
;;
;; Applying patches
(define add-ml-tag
(map (lambda (x)
(format
#f "notmuch tag +~a -- path:lists/~a/**"
;; TODO: Use new tag not to retag already existing entities.
;; Do it before new tag will be romved
;; TODO: Fix order of items in post-new hook
(mailing-list-id x) (mailing-list-fqda x)))
mls))
(list
(simple-service
'l2md-add-tags-to-mailing-list
home-notmuch-service-type
(home-notmuch-extension
(post-new
(list
#~(begin (for-each system '#$add-ml-tag))))))
(service
home-l2md-service-type
(home-l2md-configuration
(l2md l2md)
(oneshot 1)
(repos (map get-repo-config mls))))))
(feature
(name 'l2md)
(home-services-getter get-home-services)
(values `((l2md . ,l2md)))))
(define* (feature-mail-mcron
#:key
(time-spec '(next-minute
(range 0 60 20))))
"Configure mcron to invoke other email commands based on the other
features that have been enabled."
(define (get-home-services config)
(list
(when (get-value 'isync config)
(let* ((sync-cmd (list `(,((get-value 'mbsync config) config) "-a")))
(notmuch-cmd (if (get-value 'notmuch config)
(list `(,(file-append (get-value 'notmuch config) "/bin/notmuch")
"new"))
(list)))
(l2md-cmd (if (get-value 'l2md config)
(list `(,(file-append (get-value 'l2md config) "/bin/l2md")))
(list))))
(simple-service
'isync-mcron-job
home-mcron-service-type
(list
#~(job '#$time-spec
(lambda ()
(setenv "DISPLAY" ":0")
#$@(map (lambda (x) `(system* ,@x))
(append sync-cmd l2md-cmd notmuch-cmd))))))))))
(feature
(name 'mail-mcron)
(home-services-getter get-home-services)))