WIP: User avatars

This commit is contained in:
Adam Porter 2022-05-13 20:49:09 -05:00
parent d1e4fc2074
commit 3f475d2c92
2 changed files with 62 additions and 11 deletions

View file

@ -807,6 +807,14 @@ BODY is wrapped in a lambda form that binds `event', `room', and
;; So `ement-room--format-user' returns a string propertized with `help-echo' as a string.
(concat sender "")))
(ement-room-define-event-formatter ?a
"Sender avatar."
(ignore session)
(if-let (avatar (ement-user-avatar (ement-event-sender event)))
;; (propertize " " 'display `((:align-to left-margin) ,avatar))
(propertize " " 'display avatar)
"NOA"))
(ement-room-define-event-formatter ?r
"Reactions."
(ignore room session)
@ -2270,8 +2278,26 @@ function to `ement-room-event-fns', which see."
(ement-room--insert-event event))
(ement-room-defevent "m.room.member"
(pcase-let* (((cl-struct ement-event sender) event)
((cl-struct ement-user avatar-url) sender)
(room ement-room))
(with-silent-modifications
(ement-room--insert-event event)))
(ement-room--insert-event event))
(when (and ement-room-user-avatars avatar-url (not (string-empty-p avatar-url)))
(plz 'get (ement--mxc-to-url avatar-url ement-session) :as 'binary
:then (lambda (data)
(let* ((image (ement--resize-image (create-image data nil 'data-p)
nil (frame-char-height))))
(setf (image-property image :ascent) 'center
(ement-user-avatar sender) image)
(message "SENDER:%S AVATAR:%S" (ement-user-id sender) image)
(when-let (buffer (alist-get 'buffer (ement-room-local room)))
(with-current-buffer buffer
(ewoc-map
(lambda (data)
(and (ement-event-p data)
(equal (ement-event-sender data) sender)))
ement-ewoc)))))))))
(ement-room-defevent "m.room.message"
(pcase-let* (((cl-struct ement-event content unsigned) event)
@ -3157,6 +3183,10 @@ ROOM defaults to the value of `ement-room'."
'face face
'help-echo (ement-user-id user))))
(defcustom ement-room-user-avatars t
"Display user avatars."
:type 'boolean)
(cl-defun ement-room--event-mentions-user-p (event user &optional (room ement-room))
"Return non-nil if EVENT in ROOM mentions USER."
(pcase-let* (((cl-struct ement-event content) event)

View file

@ -803,17 +803,38 @@ and `session' to the session. Adds function to
('avatar_url avatar-url))))
event)
(user (or (gethash state-key ement-users)
(puthash state-key
(make-ement-user :id state-key :avatar-url avatar-url
(puthash state-key (make-ement-user :id state-key)
ement-users))))
(setf (ement-user-avatar-url user) avatar-url
;; NOTE: The spec doesn't seem to say whether the
;; displayname in the member event applies only to the
;; room or is for the user generally, so we'll save it
;; in the struct anyway.
:displayname displayname)
ement-users))))
(ement-user-displayname user) displayname)
;; FIXME: Should we also update the room displayname here? Shouldn't we only do that
;; when we know it applies only to the room?
(puthash room displayname (ement-user-room-display-names user))
(unless (gethash state-key members)
(puthash state-key user members))))
(puthash state-key user members)))
;; (defvar ement-room-user-avatars)
;; (defun ement--update-user-avatar (user room session)
;; "Update USER's avatar in ROOM on SESSION."
;; (ignore session)
;; (pcase-let (((cl-struct ement-user avatar-url) user))
;; (when (and ement-room-user-avatars avatar-url)
;; (plz 'get (ement--mxc-to-url avatar-url session) :as 'binary
;; :then (lambda (data)
;; (let* ((image (create-image data nil 'data-p))
;; (avatar-string (propertize " " :display `(image ,image))))
;; (setf (ement-user-avatar user) avatar-string)
;; (when-let (buffer (alist-get 'buffer (ement-room-local room)))
;; (with-current-buffer buffer
;; (ewoc-map
;; (lambda (data)
;; (and (ement-event-p data)
;; (equal (ement-event-sender data) user)))
;; ement-ewoc)))))))))
(ement-defevent "m.room.name"
(ignore session)