branch: elpa/jabber
commit 656815f2da6a593bdcb45926df121cee774b723d
Author: Thanos Apollo <[email protected]>
Commit: Thanos Apollo <[email protected]>
chat: Extract stanza-id and reply helpers from build-msg-plist
---
lisp/jabber-chat.el | 88 ++++++++++++++++++++++++++++-------------------------
1 file changed, 47 insertions(+), 41 deletions(-)
diff --git a/lisp/jabber-chat.el b/lisp/jabber-chat.el
index 29ef45d372..37e7c2a223 100644
--- a/lisp/jabber-chat.el
+++ b/lisp/jabber-chat.el
@@ -1051,51 +1051,57 @@ Shares its namespace with <stanza-id/>, so match on the
node name."
(jabber-xml-node-children xml-data))))
(and el (jabber-xml-get-attribute el 'id))))
-(defun jabber-chat--build-msg-plist (xml-data delayed)
- "Build a message plist from the fields in XML-DATA.
-DELAYED marks the message as delayed unconditionally."
- (let* ((msg-timestamp (jabber-message-timestamp xml-data))
- (oob-entries (jabber-chat--extract-oob-entries xml-data))
- (error-node (car (jabber-xml-get-children xml-data 'error)))
- (from (jabber-xml-get-attribute xml-data 'from))
+(defun jabber-chat--server-id (xml-data)
+ "Return the trusted XEP-0359 stanza-id in XML-DATA, or nil.
+In groupchat, only the room itself may assign the stanza-id
+\(XEP-0461). Elsewhere the archive JID is not known here, so any
+`by' is accepted."
+ (let* ((from (jabber-xml-get-attribute xml-data 'from))
(type (jabber-xml-get-attribute xml-data 'type))
- ;; In groupchat, only the room itself may assign the stanza-id
- ;; (XEP-0461). Elsewhere we cannot know the archive JID here,
- ;; so any by is accepted.
(sid-el (jabber-chat--stanza-id-element
xml-data
(and (equal type "groupchat") from
- (jabber-jid-user from))))
- (reply-el (jabber-xml-child-with-xmlns xml-data
- jabber-chat--reply-xmlns))
- (unstyled-el (jabber-xml-child-with-xmlns xml-data
"urn:xmpp:styling:0"))
- (body (car (jabber-xml-node-children
- (car (jabber-xml-get-children xml-data 'body))))))
- (list
- :id (jabber-xml-get-attribute xml-data 'id)
- :server-id (when sid-el (jabber-xml-get-attribute sid-el 'id))
- :origin-id (jabber-chat--origin-id xml-data)
- :from from
- :body body
- :subject (car (jabber-xml-node-children
- (car (jabber-xml-get-children xml-data 'subject))))
- :timestamp (or msg-timestamp (current-time))
- :delayed (or delayed (and msg-timestamp t))
- :encrypted (and (jabber-xml-child-with-xmlns
- xml-data "eu.siacs.conversations.axolotl")
- t)
- :oob-entries oob-entries
- :oob-url (caar oob-entries)
- :oob-desc (cdar oob-entries)
- :error-text (when error-node
- (jabber-parse-error error-node))
- :reply-to-id (when reply-el
- (jabber-xml-get-attribute reply-el 'id))
- :reply-to-jid (when reply-el
- (jabber-xml-get-attribute reply-el 'to))
- :fallback-range (when reply-el
- (jabber-chat--reply-fallback-range xml-data))
- :unstyled (and unstyled-el t))))
+ (jabber-jid-user from)))))
+ (and sid-el (jabber-xml-get-attribute sid-el 'id))))
+
+(defun jabber-chat--reply-fields (xml-data)
+ "Return XEP-0461 reply fields in XML-DATA as a plist, or nil."
+ (and-let* ((reply-el (jabber-xml-child-with-xmlns
+ xml-data jabber-chat--reply-xmlns)))
+ (list :reply-to-id (jabber-xml-get-attribute reply-el 'id)
+ :reply-to-jid (jabber-xml-get-attribute reply-el 'to)
+ :fallback-range (jabber-chat--reply-fallback-range xml-data))))
+
+(defun jabber-chat--build-msg-plist (xml-data delayed)
+ "Build a message plist from the fields in XML-DATA.
+DELAYED marks the message as delayed unconditionally."
+ (let ((msg-timestamp (jabber-message-timestamp xml-data))
+ (oob-entries (jabber-chat--extract-oob-entries xml-data))
+ (error-node (car (jabber-xml-get-children xml-data 'error))))
+ (append
+ (list
+ :id (jabber-xml-get-attribute xml-data 'id)
+ :server-id (jabber-chat--server-id xml-data)
+ :origin-id (jabber-chat--origin-id xml-data)
+ :from (jabber-xml-get-attribute xml-data 'from)
+ :body (car (jabber-xml-node-children
+ (car (jabber-xml-get-children xml-data 'body))))
+ :subject (car (jabber-xml-node-children
+ (car (jabber-xml-get-children xml-data 'subject))))
+ :timestamp (or msg-timestamp (current-time))
+ :delayed (or delayed (and msg-timestamp t))
+ :encrypted (and (jabber-xml-child-with-xmlns
+ xml-data "eu.siacs.conversations.axolotl")
+ t)
+ :oob-entries oob-entries
+ :oob-url (caar oob-entries)
+ :oob-desc (cdar oob-entries)
+ :error-text (when error-node
+ (jabber-parse-error error-node))
+ :unstyled (and (jabber-xml-child-with-xmlns
+ xml-data "urn:xmpp:styling:0")
+ t))
+ (jabber-chat--reply-fields xml-data))))
(defun jabber-chat--msg-plist-from-stanza (xml-data &optional delayed)
"Extract display fields from XML-DATA into a message plist.