mirror of
https://github.com/vale981/ement.el
synced 2025-03-05 17:21:41 -05:00
WIP: User avatars
This commit is contained in:
parent
d1e4fc2074
commit
3f475d2c92
2 changed files with 62 additions and 11 deletions
|
@ -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.
|
;; So `ement-room--format-user' returns a string propertized with `help-echo' as a string.
|
||||||
(concat sender "")))
|
(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
|
(ement-room-define-event-formatter ?r
|
||||||
"Reactions."
|
"Reactions."
|
||||||
(ignore room session)
|
(ignore room session)
|
||||||
|
@ -2270,8 +2278,26 @@ function to `ement-room-event-fns', which see."
|
||||||
(ement-room--insert-event event))
|
(ement-room--insert-event event))
|
||||||
|
|
||||||
(ement-room-defevent "m.room.member"
|
(ement-room-defevent "m.room.member"
|
||||||
(with-silent-modifications
|
(pcase-let* (((cl-struct ement-event sender) event)
|
||||||
(ement-room--insert-event event)))
|
((cl-struct ement-user avatar-url) sender)
|
||||||
|
(room ement-room))
|
||||||
|
(with-silent-modifications
|
||||||
|
(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"
|
(ement-room-defevent "m.room.message"
|
||||||
(pcase-let* (((cl-struct ement-event content unsigned) event)
|
(pcase-let* (((cl-struct ement-event content unsigned) event)
|
||||||
|
@ -3157,6 +3183,10 @@ ROOM defaults to the value of `ement-room'."
|
||||||
'face face
|
'face face
|
||||||
'help-echo (ement-user-id user))))
|
'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))
|
(cl-defun ement-room--event-mentions-user-p (event user &optional (room ement-room))
|
||||||
"Return non-nil if EVENT in ROOM mentions USER."
|
"Return non-nil if EVENT in ROOM mentions USER."
|
||||||
(pcase-let* (((cl-struct ement-event content) event)
|
(pcase-let* (((cl-struct ement-event content) event)
|
||||||
|
|
39
ement.el
39
ement.el
|
@ -803,17 +803,38 @@ and `session' to the session. Adds function to
|
||||||
('avatar_url avatar-url))))
|
('avatar_url avatar-url))))
|
||||||
event)
|
event)
|
||||||
(user (or (gethash state-key ement-users)
|
(user (or (gethash state-key ement-users)
|
||||||
(puthash state-key
|
(puthash state-key (make-ement-user :id state-key)
|
||||||
(make-ement-user :id state-key :avatar-url 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-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.
|
||||||
|
(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))
|
(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"
|
(ement-defevent "m.room.name"
|
||||||
(ignore session)
|
(ignore session)
|
||||||
|
|
Loading…
Add table
Reference in a new issue