aboutsummaryrefslogtreecommitdiffstats
path: root/elisp/delivery-track.el
diff options
context:
space:
mode:
Diffstat (limited to 'elisp/delivery-track.el')
-rw-r--r--elisp/delivery-track.el105
1 files changed, 79 insertions, 26 deletions
diff --git a/elisp/delivery-track.el b/elisp/delivery-track.el
index ec24417..809e1f2 100644
--- a/elisp/delivery-track.el
+++ b/elisp/delivery-track.el
@@ -9,7 +9,7 @@
;; Version: 0.0.1
;; Keywords: abbrev bib c calendar comm convenience data docs emulations extensions faces files frames games hardware help hypermedia i18n internal languages lisp local maint mail matching mouse multimedia news outlines processes terminals tex tools unix vc wp
;; Homepage: https://github.com/titan/delivery-track
-;; Package-Requires: ((emacs "27.1"))
+;; Package-Requires: ((emacs "29.1"))
;;
;; This file is not part of GNU Emacs.
;;
@@ -25,6 +25,39 @@
(defvar url-http-end-of-headers)
+(defun delivery-track-write-time! (timestring)
+ "Insert an org inactive timestamp from a parse-able TIMESTRING."
+ (thread-first
+ timestring
+ (parse-time-string)
+ (encode-time)
+ (org-insert-timestamp t t)))
+
+(defun delivery-track-org-entry (buffer shipment-id status events)
+ "Write update on BUFFER the SHIPMENT-ID with STATUS and EVENTS."
+ (with-current-buffer buffer
+ (goto-char (org-find-entry-with-id shipment-id))
+ (org-entry-put nil "status" status)
+ (org-next-visible-heading 1)
+ (seq-let (level _rlevel _todo _prio headline)
+ (org-heading-components)
+ (when (and (= level 2)
+ (string= "Shipment reverse history" headline))
+ (org-cut-subtree))
+
+ (insert "** Shipment reverse history\n")
+ (seq-doseq (event events)
+ (seq-let (time status) event
+ (delivery-track-write-time! time)
+ (insert " " status "\n"))))))
+
+(defun delivery-track--process-response (_request-status buffer provider-parser)
+ "Process API response with PROVIDER-PARSER and update into BUFFER."
+ (goto-char url-http-end-of-headers)
+ (apply #'delivery-track-org-entry
+ buffer
+ (funcall provider-parser (json-parse-buffer))))
+
(defun delivery-track--dhl-de (track-id buffer callback)
"Async request to API using TRACK-ID and process with CALLBACK.
It writes into the org-node in BUFFER."
@@ -37,6 +70,31 @@ It writes into the org-node in BUFFER."
(concat (url-build-query-string params))
(url-retrieve callback (list buffer)))))
+(defun delivery-track-entry--hermes (response)
+ "Parse hermes RESPONSE into standard delivery-track info for writer."
+ (list
+ (gethash "barcode" response)
+ (thread-last response (gethash "status") (gethash "parcelStatus"))
+ (thread-last
+ (gethash "parcelHistory" response)
+ (seq-keep (lambda (event)
+ (when-let ((time (gethash "timestamp" event)))
+ (list time (gethash "statusHistoryText" event)))))
+ (reverse))))
+
+(defun delivery-track--hermes-de (track-id)
+ "Async request to hermes API using TRACK-ID.
+Write update on the org-node in current buffer."
+ (let* ((url-request-method "GET")
+ (url-request-extra-headers
+ '(("User-Agent" . "Mozilla/5.0 (X11; Linux x86_64; rv:136.0) Gecko/20100101 Firefox/136.0"))))
+ (thread-first
+ "https://api.my-deliveries.de/tnt/parcelservice/parceldetails/"
+ (concat track-id)
+ (url-retrieve #'delivery-track--process-response
+ (list (current-buffer) #'delivery-track-entry--hermes)))))
+
+
(defun delivery-track-entry--dhl (_request-status buffer)
"Parse response from DHL and write in in BUFFER."
(goto-char url-http-end-of-headers)
@@ -49,33 +107,28 @@ It writes into the org-node in BUFFER."
(history (thread-last
shipment-info
(gethash "sendungsdetails")
- (gethash "sendungsverlauf")))
- (id (gethash "id" shipment-info))
- (status (gethash "kurzStatus" history))
- (events (reverse (gethash "events" history))))
- (with-current-buffer buffer
- (goto-char (org-find-entry-with-id id))
- (org-entry-put nil "status" status)
- (org-next-visible-heading 1)
- (seq-let (level _rlevel _todo _prio headline)
- (org-heading-components)
- (when (and (= level 2)
- (string= "Shipment reverse history" headline))
- (org-cut-subtree))
+ (gethash "sendungsverlauf"))))
+ (delivery-track-org-entry
+ buffer
+ (gethash "id" shipment-info)
+ (gethash "kurzStatus" history)
+ (thread-last
+ (gethash "events" history)
+ (seq-keep (lambda (event)
+ (when-let ((time (gethash "datum" event)))
+ (list time (gethash "status" event)))))
+ (reverse)))))
- (insert "** Shipment reverse history\n")
- (seq-doseq (event events)
- (thread-first
- (gethash "datum" event)
- (parse-time-string)
- (encode-time)
- (org-insert-timestamp t t))
- (insert " " (gethash "status" event) "\n"))))))
+(defun delivery-track-update (track-id provider)
+ "Update tracking information for TRACK-ID under PROVIDER.
+Interactive defaults to current buffer's org-node id and provider properties."
+ (interactive (list (read-string "What is the tracking id? " (org-id-get))
+ (completing-read "Which service provider? "
+ '(dhl hermes) nil t (org-entry-get nil "provider"))))
+ (pcase provider
+ ("dhl" (delivery-track--dhl-de track-id (current-buffer) #'delivery-track-entry--dhl))
+ ("hermes" (delivery-track--hermes-de track-id))))
-(defun delivery-track-update-dhl (track-id)
- "Update tracking information for DHL TRACK-ID."
- (interactive (list (read-string "What is the tracking id? " (org-id-get))))
- (delivery-track--dhl-de track-id (current-buffer) #'delivery-track-entry--dhl))
(provide 'delivery-track)
;;; delivery-track.el ends here