aboutsummaryrefslogtreecommitdiffstats
path: root/elisp
diff options
context:
space:
mode:
Diffstat (limited to 'elisp')
-rw-r--r--elisp/ai-query.el64
-rw-r--r--elisp/delivery-track.el81
2 files changed, 145 insertions, 0 deletions
diff --git a/elisp/ai-query.el b/elisp/ai-query.el
new file mode 100644
index 0000000..3bc621c
--- /dev/null
+++ b/elisp/ai-query.el
@@ -0,0 +1,64 @@
+;;; ai-query.el --- Query an AI over the lakera gandalf game -*- lexical-binding: t; -*-
+;;
+;; Copyright (C) 2024 Óscar Nájera
+;;
+;; Author: Óscar Nájera <hi@oscarnajera.com>
+;; Maintainer: Óscar Nájera <hi@oscarnajera.com>
+;; Created: July 22, 2024
+;; Modified: July 22, 2024
+;; Version: 0.0.1
+;; Package-Requires: ((emacs "27.1"))
+;;
+;; This file is not part of GNU Emacs.
+;;
+;;; Commentary:
+;;
+;; Query an AI over the lakera gandalf game
+;;
+;;; Code:
+
+(require 'subr-x)
+(require 'markdown-mode)
+
+;; Silence byte-compiler.
+(defvar url-http-end-of-headers)
+
+(defconst ai-query-api
+ "https://gandalf.lakera.ai/api/send-message"
+ "AI security endpoint, use it for queries.")
+
+(defun ai-query--request (prompt callback)
+ "Async request to API using PROMPT and process with CALLBACK."
+ (let ((url-request-method "POST")
+ (url-request-extra-headers
+ '(("Content-Type" . "application/x-www-form-urlencoded")))
+ (url-request-data
+ (thread-first
+ (list 'prompt prompt)
+ (cons '((defender "baseline")))
+ (url-build-query-string))))
+ (url-retrieve ai-query-api callback)))
+
+(defun ai-query--process-response (_status)
+ "Callback function to process response."
+ (goto-char url-http-end-of-headers)
+ (let ((response (json-parse-buffer)))
+ (with-current-buffer (get-buffer-create "*AI reply*")
+ (markdown-mode)
+ (erase-buffer)
+ (insert "# Question\n" (gethash "prompt" response))
+ (insert "\n\n# Answer\n\n" (gethash "answer" response))
+ (display-buffer (current-buffer)))))
+
+(defun ai-query-request (prompt)
+ "Query the API with this PROMPT."
+ (thread-first
+ (if (use-region-p)
+ (buffer-substring-no-properties (region-beginning) (region-end))
+ (read-string "What is your question? "))
+ (list)
+ (interactive))
+ (ai-query--request prompt #'ai-query--process-response))
+
+(provide 'ai-query)
+;;; ai-query.el ends here
diff --git a/elisp/delivery-track.el b/elisp/delivery-track.el
new file mode 100644
index 0000000..ec24417
--- /dev/null
+++ b/elisp/delivery-track.el
@@ -0,0 +1,81 @@
+;;; delivery-track.el --- Track packages -*- lexical-binding: t; -*-
+;;
+;; Copyright (C) 2024 Óscar Nájera
+;;
+;; Author: Óscar Nájera <hi@oscarnajera.com>
+;; Maintainer: Óscar Nájera <hi@oscarnajera.com>
+;; Created: August 28, 2024
+;; Modified: August 28, 2024
+;; 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"))
+;;
+;; This file is not part of GNU Emacs.
+;;
+;;; Commentary:
+;;
+;; Track packages
+;;
+;;; Code:
+
+(require 'org)
+(require 'org-id)
+(require 'url)
+
+(defvar url-http-end-of-headers)
+
+(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."
+ (let* ((url-request-method "GET")
+ (params `((piececode ,track-id)
+ ("noRedirect" true)
+ (language "en"))))
+ (thread-first
+ "https://www.dhl.de/int-verfolgen/data/search?"
+ (concat (url-build-query-string params))
+ (url-retrieve callback (list buffer)))))
+
+(defun delivery-track-entry--dhl (_request-status buffer)
+ "Parse response from DHL and write in in BUFFER."
+ (goto-char url-http-end-of-headers)
+ (let* ((shipment-info (thread-last
+ (json-parse-buffer)
+ (gethash "sendungen")
+ (seq-find
+ (lambda (item)
+ (eq t (gethash "hasCompleteDetails" item))))))
+ (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))
+
+ (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-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