mirror of
https://git.savannah.gnu.org/git/emacs.git
synced 2025-02-03 20:24:29 +00:00
Add support for IRCv3 message tags.
* erc-backend.el: erc-response: Add `tags' element. Add (erc-parse-tags). (erc-parse-server-response): Use (erc-parse-tags) to parse message tags (if any), and store them in `erc-resopnse' struct. * erc.el: (erc-display-message): Expose message tags with text properties of the corresponding message line.
This commit is contained in:
parent
e589018b48
commit
2205546269
@ -53,6 +53,7 @@
|
||||
;; CONTENTS --- `erc-response.contents'
|
||||
;; SENDER --- `erc-response.sender'
|
||||
;; LINE --- `erc-response.unparsed'
|
||||
;; TAGS --- `erc-response.tags'
|
||||
;;
|
||||
;; WARNING, WARNING!!
|
||||
;; It's probably not a good idea to destructively modify the list
|
||||
@ -115,7 +116,8 @@
|
||||
(sender "" :type string)
|
||||
(command "" :type string)
|
||||
(command-args '() :type list)
|
||||
(contents "" :type string))
|
||||
(contents "" :type string)
|
||||
(tags '() :type list))
|
||||
|
||||
;;; User data
|
||||
|
||||
@ -955,16 +957,34 @@ See also `erc-server-send'."
|
||||
|
||||
;;;; Handling responses
|
||||
|
||||
(defun erc-parse-tags (string)
|
||||
"Parse IRCv3 tags list in STRING to a (tag . value) alist."
|
||||
(let ((tags)
|
||||
(tag-strings (split-string string ";")))
|
||||
(dolist (tag-string tag-strings tags)
|
||||
(let ((pair (split-string tag-string "=")))
|
||||
(push (if (consp pair)
|
||||
pair
|
||||
`(,pair))
|
||||
tags)))))
|
||||
|
||||
(defun erc-parse-server-response (proc string)
|
||||
"Parse and act upon a complete line from an IRC server.
|
||||
PROC is the process (connection) from which STRING was received.
|
||||
PROCs `process-buffer' is `current-buffer' when this function is called."
|
||||
(unless (string= string "") ;; Ignore empty strings
|
||||
(save-match-data
|
||||
(let ((posn (if (eq (aref string 0) ?:)
|
||||
(string-match " " string)
|
||||
0))
|
||||
(msg (make-erc-response :unparsed string)))
|
||||
(let* ((tag-list (when (eq (aref string 0) ?@)
|
||||
(substring string 1 (string-match " " string))))
|
||||
(msg (make-erc-response :unparsed string :tags (when tag-list
|
||||
(erc-parse-tags
|
||||
tag-list))))
|
||||
(string (if tag-list
|
||||
(substring string (+ 1 (string-match " " string)))
|
||||
string))
|
||||
(posn (if (eq (aref string 0) ?:)
|
||||
(string-match " " string)
|
||||
0)))
|
||||
|
||||
(setf (erc-response.sender msg)
|
||||
(if (eq posn 0)
|
||||
|
@ -2700,7 +2700,10 @@ See also `erc-format-message' and `erc-display-line'."
|
||||
(unless (erc-hide-current-message-p parsed)
|
||||
(erc-put-text-property 0 (length string) 'erc-parsed parsed string)
|
||||
(erc-put-text-property 0 (length string) 'rear-sticky t string)
|
||||
(erc-display-line string buffer)))))
|
||||
(when (erc-response.tags parsed)
|
||||
(erc-put-text-property 0 (length string) 'tags (erc-response.tags parsed)
|
||||
string))
|
||||
(erc-display-line string buffer)))))
|
||||
|
||||
(defun erc-message-type-member (position list)
|
||||
"Return non-nil if the erc-parsed text-property at POSITION is in LIST.
|
||||
|
Loading…
x
Reference in New Issue
Block a user