From 7af28751f0088e2ba99b70e2a7d291309ed50919 Mon Sep 17 00:00:00 2001 From: jao Date: Sun, 23 Feb 2020 17:17:30 +0000 Subject: signel: fixes for receipts reception --- net/signel.org | 37 ++++++++++++++++++++++++++++--------- 1 file changed, 28 insertions(+), 9 deletions(-) (limited to 'net/signel.org') diff --git a/net/signel.org b/net/signel.org index 274ad5b..7a85397 100644 --- a/net/signel.org +++ b/net/signel.org @@ -146,9 +146,24 @@ received or read; e.g.: #+end_src A bit confusingly, that delivery notification has a ~receiptMessage~, -but its ~isReceipt~ flag is set to ~false~. Oh well, i'm sure there's a -reason, but for now, we're going to ignore that flag. +but its ~isReceipt~ flag is set to ~false~. At other times, we get +~isReceipt~ but no ~receiptMessage~: +#+begin_src json :tangle no +{ + "envelope": { + "source": "+346xxxxxxxx", + "sourceDevice": 1, + "relay": null, + "timestamp": 1582476539281, + "isReceipt": true, + "dataMessage": null, + "syncMessage": null, + "callMessage": null, + "receiptMessage": null + } +} +#+end_src It is very easy to parse JSON in emacs and extract signal-cli's envelopes: @@ -186,9 +201,12 @@ boring) to get into its components: (defun signel--msg-receipt (msg) (cdr (assoc 'receiptMessage msg))) +(defun signel--msg-is-receipt (msg) + (cdr (assoc 'isReceipt msg))) + (defun signel--msg-receipt-timestamp (msg) - (when-let (secs (cdr (assoc 'when (signel--msg-receipt msg)))) - (format-time-string "%H:%M" secs))) + (when-let (msecs (cdr (assoc 'when (signel--msg-receipt msg)))) + (format-time-string "%H:%M" (/ msecs 1000)))) (defun signel--msg-is-delivery (msg) (when-let ((receipt (signel--msg-receipt msg))) @@ -221,7 +239,7 @@ Or, in elisp: (stamp (signel--msg-timestamp msg)) (data (signel--msg-data msg)) (rec-stamp (signel--msg-receipt-timestamp msg))) - (when (and source (or data rec-stamp)) + (when source (signel--update-chat-buffer source data stamp rec-stamp msg))))) #+end_src @@ -231,7 +249,7 @@ reasonable implementation, which i just copied: #+begin_src emacs-lisp (defun signel--ordinary-insertion-filter (proc string) - (when (buffer-live-p (process-buffer proc)) + (when (and proc (buffer-live-p (process-buffer proc))) (with-current-buffer (process-buffer proc) (let ((moving (= (point) (process-mark proc)))) (save-excursion @@ -307,10 +325,11 @@ buffer: data "\n") (fill-region p (point))) - (let ((is-delivery (signel--msg-is-delivery msg)) + (let ((is-delivery (or (signel--msg-is-delivery msg) + (signel--msg-is-receipt msg))) (is-read (signel--msg-is-read msg))) - (when rec-stamp - (insert "[" rec-stamp "] " + (when (or rec-stamp stamp) + (insert "[" (or rec-stamp stamp) "] " (if is-read "(read)" "(delivered)") "\n")))) (insert signel-prompt)) -- cgit v1.2.3