emacs-elpa-diffs
[Top][All Lists]
Advanced

[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



reply via email to

[Prev in Thread] Current Thread [Next in Thread]