From 722a3f174267771dd8f80b2c7491350228427b74 Mon Sep 17 00:00:00 2001 From: ndwarshuis Date: Tue, 24 Aug 2021 13:04:00 -0400 Subject: [PATCH] ADD automated flight tasker (because why not?) --- etc/conf.org | 68 ++++++++++++++++++++++++++++++++++++++++ local/lib/org-x/org-x.el | 11 +++++++ 2 files changed, 79 insertions(+) diff --git a/etc/conf.org b/etc/conf.org index 7f8068b..7c056a4 100644 --- a/etc/conf.org +++ b/etc/conf.org @@ -1861,6 +1861,74 @@ Make todo insertion respect contents #+BEGIN_SRC emacs-lisp (setq org-insert-heading-respect-content t) #+END_SRC +*** flights +:PROPERTIES: +:CREATED: [2021-08-24 Tue 11:56] +:END: +To remind myself to check into flights and stuff +#+begin_src emacs-lisp +(defun nd/org-insert-flight (arg) + "Insert a flight. + +Add a prefix ARG to add check in date." + (interactive "P") + (cl-flet* + ((try-until + (try-fun test-fun msg) + (let ((res)) + (while (not (funcall test-fun (setq res (funcall try-fun)))) + (message msg)) + res)) + (read-airport + (prompt) + (try-until (lambda () (read-from-minibuffer (format "%s: " prompt))) + (lambda (r) (< 0 (length r))) + "Enter a valid location (Ex. YYZ)")) + (read-date + (prompt) + (try-until (lambda () (float-time (org-read-date t t nil prompt))) + (lambda (r) (or (not r) (< 0 (- r (float-time))))) + "Enter a valid datetime in the future")) + (mk-flight-headline + (level loc1 loc2 flight-time) + (let ((contents (--> (org-ml-unixtime-to-time-long flight-time) + (org-ml-build-timestamp! it :active t) + (org-ml-build-paragraph it) + (list it))) + (title (format "%s -> %s" loc1 loc2))) + (->> (org-ml-build-headline! :level level + :title-text title + :tags (list org-x-tag-errand)) + (org-x-element-headline-add-created nil) + (org-ml-headline-set-contents (org-x-logbook-config) contents)))) + (mk-checkin-headline + (level loc flight-time) + (let* ((pl (--> (- flight-time (* 24 60 60)) + (org-ml-unixtime-to-time-long it) + (org-ml-build-timestamp! it :active t) + (org-ml-build-planning :scheduled it))) + (title (format "check into %s flight" loc))) + (->> (org-ml-build-headline! :level level + :title-text title + :todo-keyword org-x-kw-todo + :tags (list org-x-tag-laptop)) + (org-x-element-headline-add-created nil) + (org-ml-headline-set-planning pl) + (org-ml-headline-set-node-property "Effort" "0:15"))))) + (let ((t1 (read-date "Depart date")) + (t2 (read-date "Return date"))) + (if (< t2 t1) (error "Return time must be after depart time") + (let* ((level (or (org-ml-get-property :level (org-ml-parse-this-headline)) 1)) + (loc1 (read-airport "Depart location")) + (loc2 (read-airport "Arrive location")) + (fh1 (mk-flight-headline level loc1 loc2 t1)) + (fh2 (mk-flight-headline level loc2 loc1 t2)) + (ch1 (when (equal arg '(4)) (mk-checkin-headline level loc1 t1))) + (ch2 (when (equal arg '(4)) (mk-checkin-headline level loc2 t2)))) + (->> (list ch1 fh1 ch2 fh2) + (-non-nil) + (org-ml-insert (1+ (org-end-of-subtree))))))))) +#+end_src *** table of contents :PROPERTIES: :ID: 77cd66b2-08b8-4c53-bdd3-4af3b9eade2e diff --git a/local/lib/org-x/org-x.el b/local/lib/org-x/org-x.el index 5edf2d5..08ca3b8 100644 --- a/local/lib/org-x/org-x.el +++ b/local/lib/org-x/org-x.el @@ -276,6 +276,17 @@ entire subtrees to save time and ignore tasks") (first-item-ut first-item-ut) (first-clock-ut first-clock-ut)))) +(defun org-x-element-headline-add-created (epoch-time headline) + "Add the CREATED property to HEADLINE. + +EPOCH-TIME is an integer/float for the created time. If nil, use +the current time." + (let ((ts (->> (float-time) + (org-ml-unixtime-to-time-long) + (org-ml-build-timestamp!) + (org-ml-to-string)))) + (org-ml-headline-set-node-property org-x-prop-created ts headline))) + ;;; STATEFUL BUFFER HEADLINE FUNCTIONS ;; All of these functions operate on the current headline