mirror of
https://github.com/vale981/ement.el
synced 2025-03-06 01:31:41 -05:00
Loading earlier messages, etc.
This commit is contained in:
parent
372979ce1e
commit
da436bf39e
3 changed files with 69 additions and 10 deletions
|
@ -49,6 +49,7 @@
|
||||||
(define-key map (kbd "g") #'ement-room-sync)
|
(define-key map (kbd "g") #'ement-room-sync)
|
||||||
(define-key map (kbd "v") #'ement-room-view-event)
|
(define-key map (kbd "v") #'ement-room-view-event)
|
||||||
(define-key map (kbd "RET") #'ement-room-send-message)
|
(define-key map (kbd "RET") #'ement-room-send-message)
|
||||||
|
(define-key map [remap scroll-down-command] #'ement-room-scroll-down-command)
|
||||||
map)
|
map)
|
||||||
"Keymap for Ement room buffers.")
|
"Keymap for Ement room buffers.")
|
||||||
|
|
||||||
|
@ -73,16 +74,74 @@ See function `format-time-string'."
|
||||||
(const " [%Y-%m-%d %H:%M:%S]")
|
(const " [%Y-%m-%d %H:%M:%S]")
|
||||||
string))
|
string))
|
||||||
|
|
||||||
|
(defcustom ement-room-username-display-property '(raise -0.25)
|
||||||
|
"Display property applied to username strings.
|
||||||
|
See Info node `(elisp)Other Display Specs'."
|
||||||
|
:type '(choice (list :tag "Raise" (const raise :tag "Raise") (number :tag "Factor"))
|
||||||
|
(list :tag "Height" (const height)
|
||||||
|
(choice (list :tag "Larger" (const + :tag "Larger") (number :tag "Steps"))
|
||||||
|
(list :tag "Smaller" (const - :tag "Smaller") (number :tag "Steps"))
|
||||||
|
(number :tag "Factor")
|
||||||
|
(function :tag "Function")
|
||||||
|
(sexp :tag "Form"))) ))
|
||||||
|
|
||||||
(defface ement-room-timestamp
|
(defface ement-room-timestamp
|
||||||
'((t (:inherit font-lock-variable-name-face)))
|
'((t (:inherit font-lock-comment-face)))
|
||||||
"Event timestamps.")
|
"Event timestamps.")
|
||||||
|
|
||||||
(defface ement-room-user
|
(defface ement-room-user
|
||||||
'((t (:inherit font-lock-keyword-face)))
|
'((t (:inherit font-lock-function-name-face :weight bold)))
|
||||||
"Usernames.")
|
"Usernames.")
|
||||||
|
|
||||||
;;;; Commands
|
;;;; Commands
|
||||||
|
|
||||||
|
(defun ement-room-scroll-down-command ()
|
||||||
|
"Scroll down, and load NUMBER older messages when at top."
|
||||||
|
(interactive)
|
||||||
|
(condition-case _err
|
||||||
|
(scroll-down nil)
|
||||||
|
(beginning-of-buffer
|
||||||
|
(message "Loading earlier messages...")
|
||||||
|
(call-interactively #'ement-room-retro))))
|
||||||
|
|
||||||
|
(defun ement-room-retro (session room number)
|
||||||
|
"Retrieve NUMBER older messages in ROOM on SESSION."
|
||||||
|
(interactive (list ement-session ement-room
|
||||||
|
(if current-prefix-arg
|
||||||
|
(read-number "Number of messages: ")
|
||||||
|
10)))
|
||||||
|
(pcase-let* (((cl-struct ement-session server token) session)
|
||||||
|
((cl-struct ement-server hostname port) server)
|
||||||
|
((cl-struct ement-room id prev-batch) room)
|
||||||
|
(endpoint (format "rooms/%s/messages" (url-hexify-string id))))
|
||||||
|
(ement-api hostname port token endpoint
|
||||||
|
(apply-partially #'ement-room-retro-callback room)
|
||||||
|
:params (list (list "from" prev-batch)
|
||||||
|
(list "dir" "b")
|
||||||
|
(list "limit" (number-to-string number))))))
|
||||||
|
|
||||||
|
(defun ement-room-retro-callback (room data)
|
||||||
|
"Push new DATA to ROOM on SESSION and add events to room buffer."
|
||||||
|
(pcase-let* (((cl-struct ement-room) room)
|
||||||
|
((map _start end chunk state) data)
|
||||||
|
(buffer (cl-loop for buffer in (buffer-list)
|
||||||
|
when (equal room (buffer-local-value 'ement-room buffer))
|
||||||
|
return buffer)))
|
||||||
|
;; FIXME: These are pushed onto the front of the lists. Doesn't
|
||||||
|
;; really matter, but maybe better to put them at the other end.
|
||||||
|
(cl-loop for event across state
|
||||||
|
;; FIXME: Need to use make-event
|
||||||
|
do (push event (ement-room-state room)))
|
||||||
|
(cl-loop for event across-ref chunk
|
||||||
|
do (setf event (ement--make-event event))
|
||||||
|
(push event (ement-room-timeline room)))
|
||||||
|
(when buffer
|
||||||
|
(with-current-buffer buffer
|
||||||
|
(cl-loop for event across chunk
|
||||||
|
do (ement-room--insert-event event))))
|
||||||
|
(setf (ement-room-prev-batch room) end)))
|
||||||
|
|
||||||
|
|
||||||
;; FIXME: What is the best way to do this, with ement--sync being in another file?
|
;; FIXME: What is the best way to do this, with ement--sync being in another file?
|
||||||
(declare-function ement--sync "ement.el")
|
(declare-function ement--sync "ement.el")
|
||||||
(defun ement-room-sync (session)
|
(defun ement-room-sync (session)
|
||||||
|
@ -200,12 +259,11 @@ To be used as the pretty-printer for `ewoc-create'."
|
||||||
|
|
||||||
(defun ement-room--format-user (user)
|
(defun ement-room--format-user (user)
|
||||||
"Format `ement-user' USER for current buffer's room."
|
"Format `ement-user' USER for current buffer's room."
|
||||||
(propertize
|
(propertize (or (gethash ement-room (ement-user-room-display-names user))
|
||||||
" " 'display `((margin left-margin)
|
|
||||||
,(propertize (or (gethash ement-room (ement-user-room-display-names user))
|
|
||||||
(puthash ement-room (ement-room--user-display-name user ement-room)
|
(puthash ement-room (ement-room--user-display-name user ement-room)
|
||||||
(ement-user-room-display-names user)))
|
(ement-user-room-display-names user)))
|
||||||
'face 'ement-room-user))))
|
'display ement-room-username-display-property
|
||||||
|
'face 'ement-room-user))
|
||||||
|
|
||||||
(defun ement-room--user-display-name (user room)
|
(defun ement-room--user-display-name (user room)
|
||||||
"Return the displayname for USER in ROOM."
|
"Return the displayname for USER in ROOM."
|
||||||
|
|
|
@ -44,7 +44,7 @@
|
||||||
user server token transaction-id rooms next-batch)
|
user server token transaction-id rooms next-batch)
|
||||||
|
|
||||||
(cl-defstruct ement-room
|
(cl-defstruct ement-room
|
||||||
id display-name
|
id display-name prev-batch
|
||||||
summary state timeline timeline* ephemeral account-data unread-notifications)
|
summary state timeline timeline* ephemeral account-data unread-notifications)
|
||||||
|
|
||||||
;;;; Variables
|
;;;; Variables
|
||||||
|
|
3
ement.el
3
ement.el
|
@ -251,7 +251,8 @@ To be called in `ement-sync-callback-hook'."
|
||||||
(progress-reporter-update ement-progress-reporter (cl-incf ement-progress-value)))
|
(progress-reporter-update ement-progress-reporter (cl-incf ement-progress-value)))
|
||||||
(cl-loop for event across (alist-get 'events timeline)
|
(cl-loop for event across (alist-get 'events timeline)
|
||||||
do (push (ement--make-event event) (ement-room-timeline* room))
|
do (push (ement--make-event event) (ement-room-timeline* room))
|
||||||
(progress-reporter-update ement-progress-reporter (cl-incf ement-progress-value)))))
|
(progress-reporter-update ement-progress-reporter (cl-incf ement-progress-value)))
|
||||||
|
(setf (ement-room-prev-batch room) (alist-get 'prev_batch timeline))))
|
||||||
|
|
||||||
(defvar ement-users (make-hash-table :test #'equal)
|
(defvar ement-users (make-hash-table :test #'equal)
|
||||||
;; NOTE: When changing the ement-user struct, it's necessary to
|
;; NOTE: When changing the ement-user struct, it's necessary to
|
||||||
|
|
Loading…
Add table
Reference in a new issue