[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[elpa] externals/ement 04fe4a4f9f 3/4: Add: (ement-set-display-name, em
From: |
ELPA Syncer |
Subject: |
[elpa] externals/ement 04fe4a4f9f 3/4: Add: (ement-set-display-name, ement-room-set-display-name) |
Date: |
Thu, 6 Oct 2022 21:57:39 -0400 (EDT) |
branch: externals/ement
commit 04fe4a4f9f56058fc90d7f854bb253d91c132291
Author: Adam Porter <adam@alphapapa.net>
Commit: Adam Porter <adam@alphapapa.net>
Add: (ement-set-display-name, ement-room-set-display-name)
---
README.org | 2 ++
ement-lib.el | 47 +++++++++++++++++++++++++++++++++++++++++++++++
ement-room.el | 10 +++++++++-
3 files changed, 58 insertions(+), 1 deletion(-)
diff --git a/README.org b/README.org
index cf82264f30..4f88e36156 100644
--- a/README.org
+++ b/README.org
@@ -293,6 +293,8 @@ Note that, while ~matrix-client~ remains usable, and
probably will for some time
+ Option ~ement-room-unread-only-counts-notifications~, now enabled by
default, causes rooms' unread status to be determined only by their
notification counts (which are set by the server and depend on rooms'
notification settings).
+ Command ~ement-room-set-notification-state~ sets a room's notification state
(imitating Element's user-friendly presets).
+ Room buffers' Transient menus show the room's notification state (imitating
Element's user-friendly presets).
++ Command ~ement-set-display-name~ sets the user's global displayname.
++ Command ~ement-room-set-display-name~ sets the user's displayname in a room
(which is also now displayed in the room's Transient menu).
*Changes*
+ When a room's read receipt is updated, the room's buffer is also marked as
unmodified. (In concert with the new option, this makes rooms' unread status
more intuitive.)
diff --git a/ement-lib.el b/ement-lib.el
index e447781ebd..a6fccec088 100644
--- a/ement-lib.el
+++ b/ement-lib.el
@@ -420,6 +420,53 @@ If DELETE (interactively, with prefix), delete it."
:then (lambda (data)
(ement-debug "Changed tag on room" method tag data room)))))
+(defun ement-set-display-name (display-name session)
+ "Set DISPLAY-NAME for user on SESSION.
+Sets global displayname."
+ (interactive
+ (let* ((session (ement-complete-session))
+ (display-name (read-string "Set display-name to: " nil nil
+ (ement-user-displayname
(ement-session-user session)))))
+ (list display-name session)))
+ (pcase-let* (((cl-struct ement-session user) session)
+ ((cl-struct ement-user (id user-id)) user)
+ (endpoint (format "profile/%s/displayname" (url-hexify-string
user-id))))
+ (ement-api session endpoint :method 'put :version "v3"
+ :data (json-encode (ement-alist "displayname" display-name))
+ :then (lambda (_data)
+ (message "Ement: Display name set to %S for <%s>" display-name
+ (ement-user-id (ement-session-user session)))))))
+
+(defun ement-room-set-display-name (display-name room session)
+ "Set DISPLAY-NAME for user in ROOM on SESSION.
+Sets the name only in ROOM, not globally."
+ (interactive
+ (pcase-let* ((`(,room ,session) (or (when (bound-and-true-p ement-room)
+ (list ement-room ement-session))
+ (ement-complete-room)))
+ (prompt (format "Set display-name in %S to: "
+ (ement--format-room room)))
+ (display-name (read-string prompt nil nil
+ (ement-user-displayname
(ement-session-user session)))))
+ (list display-name room session)))
+ ;; NOTE: This does not seem to be documented in the spec, so we imitate the
+ ;; "/myroomnick" command in SlashCommands.tsx from matrix-react-sdk.
+ (pcase-let* (((cl-struct ement-room state) room)
+ ((cl-struct ement-session user) session)
+ ((cl-struct ement-user id) user)
+ (member-event (cl-find-if (lambda (event)
+ (and (equal id
(ement-event-state-key event))
+ (equal "m.room.member"
(ement-event-type event))
+ (equal "join" (alist-get
'membership (ement-event-content event)))))
+ state)))
+ (cl-assert member-event)
+ (setf (alist-get 'displayname (ement-event-content member-event))
display-name)
+ (ement-put-state room "m.room.member" id (ement-event-content
member-event) session
+ :then (lambda (_data)
+ (message "Ement: Display name set to %S for <%s> in %S"
display-name
+ (ement-user-id (ement-session-user session))
+ (ement--format-room room))))))
+
;;;;;; Push rules
;; NOTE: Although v1.4 of the spec is available and describes setting the push
rules using
diff --git a/ement-room.el b/ement-room.el
index 6b8ce6f960..7e969b2f61 100644
--- a/ement-room.el
+++ b/ement-room.el
@@ -160,6 +160,7 @@ Used to, e.g. call `ement-room-compose-org'.")
(define-key map (kbd "R j") #'ement-join-room)
(define-key map (kbd "R l") #'ement-leave-room)
(define-key map (kbd "R F") #'ement-forget-room)
+ (define-key map (kbd "R n") #'ement-room-set-display-name)
;; Other
(define-key map (kbd "g") #'ement-room-sync)
@@ -4186,7 +4187,14 @@ For use in `completion-at-point-functions'."
("R c" "Create room" ement-create-room)
("R j" "Join room" ement-join-room)
("R l" "Leave room" ement-leave-room)
- ("R F" "Forget room" ement-forget-room)]]
+ ("R F" "Forget room" ement-forget-room)
+ ("R n" "Set nick" ement-room-set-display-name
+ :description (lambda ()
+ (format "Set nick (%s)"
+ (propertize (ement--user-displayname-in
+ ement-room (gethash
(ement-user-id (ement-session-user ement-session))
+
ement-users))
+ 'face 'transient-value))))]]
["Other"
("v" "View event" ement-room-view-event)
("g" "Sync new messages" ement-room-sync