1
0
Fork 0

- prevented skipping of statuses when updatig timeline (so i hope);

- added the possibility to update a timeline going backward;
- added two new  key to delete a  status and move to  next or previous
  one.
This commit is contained in:
cage 2020-05-14 16:32:01 +02:00
parent 9a5509eabe
commit 5f00107808
7 changed files with 140 additions and 11 deletions

View File

@ -208,6 +208,8 @@
(define-key "C-t u" #'update-current-timeline *thread-keymap*) (define-key "C-t u" #'update-current-timeline *thread-keymap*)
(define-key "C-t U" #'update-current-timeline-backwards *thread-keymap*)
(define-key "C-t h r" #'refresh-tags *thread-keymap*) (define-key "C-t h r" #'refresh-tags *thread-keymap*)
(define-key "C-X m t" #'move-message-tree *thread-keymap*) (define-key "C-X m t" #'move-message-tree *thread-keymap*)

View File

@ -10,6 +10,18 @@
(ui:thread-go-up) (ui:thread-go-up)
(ui:thread-open-selected-message)) (ui:thread-open-selected-message))
(define-key "right" #'open-next *thread-keymap*) (defun delete-and-move-next ()
(ui:thread-mark-delete-selected-message)
(ui:thread-open-selected-message))
(define-key "left" #'open-previous *thread-keymap*) (defun delete-and-move-previous ()
(ui:thread-mark-delete-selected-message)
(ui:thread-open-selected-message))
(define-key "right" #'open-next *thread-keymap*)
(define-key "left" #'open-previous *thread-keymap*)
(define-key "M-d" #'delete-and-move-next *thread-keymap*)
(define-key "M-u" #'delete-and-move-previous *thread-keymap*)

View File

@ -276,12 +276,27 @@ authorizations was performed with success."
:min-id min-id :min-id min-id
:limit limit)) :limit limit))
(defun status-id< (a b)
(string< (tooter:id a)
(tooter:id b)))
(defun update-pagination-statuses-so-far (statuses timeline folder)
(loop for status in statuses do
(let ((add-fetched-event (make-instance 'program-events:add-pagination-status-event
:status-id (tooter:id status)
:timeline timeline
:folder folder)))
(program-events:push-event add-fetched-event))))
(defun-w-lock update-timeline (timeline kind (defun-w-lock update-timeline (timeline kind
folder folder
&key &key
local only-media max-id since-id local
min-id only-media
(limit 20)) max-id
since-id
min-id
(limit 20))
*client-lock* *client-lock*
"Update a timeline, this function will fetch new messages and generate and event to "Update a timeline, this function will fetch new messages and generate and event to
update the program reflectings the changes in the timeline (saves update the program reflectings the changes in the timeline (saves
@ -301,11 +316,18 @@ authorizations was performed with success."
:folder folder :folder folder
:localp local :localp local
:min-id min-id))) :min-id min-id)))
;; note that, because events are enqueued with priority and the
;; first instanced event has better priority the another instanced
;; later, the events generated by the function below will run
;; after the update-timeline-event; in this case it does not
;; matter, though
(update-pagination-statuses-so-far timeline-statuses timeline folder)
(program-events:push-event event))) (program-events:push-event event)))
(defun-w-lock get-timeline-tag (tag &key min-id (limit 20)) (defun-w-lock get-timeline-tag (tag &key min-id (limit 20))
*client-lock* *client-lock*
"Gets messages that contains tags identitgied by parameter `tag'" "Gets messages that contains tags identified by parameter `tag'"
(tooter:timeline-tag *client* (tooter:timeline-tag *client*
tag tag
:local nil :local nil
@ -374,7 +396,7 @@ database."
(tooter:find-status *client* status-id))) (tooter:find-status *client* status-id)))
(defun-w-lock get-status-context (status-id) *client-lock* (defun-w-lock get-status-context (status-id) *client-lock*
"Get aparent and a child of a status (identified by status-id), if exists" "Get a parent and a child of a status (identified by status-id), if exists"
(tooter:context *client* status-id)) (tooter:context *client* status-id))
(defun-w-lock send-status (content in-reply-to-id attachments subject visibility) (defun-w-lock send-status (content in-reply-to-id attachments subject visibility)

View File

@ -89,6 +89,9 @@
(define-constant +table-ignored-status+ :ignored-status (define-constant +table-ignored-status+ :ignored-status
:test #'eq) :test #'eq)
(define-constant +table-pagination-status+ :pagination-status
:test #'eq)
(define-constant +table-followed-user+ :followed-user (define-constant +table-followed-user+ :followed-user
:test #'eq) :test #'eq)
@ -405,6 +408,13 @@
" \"created-at\" TEXT NOT NULL" " \"created-at\" TEXT NOT NULL"
+make-close+))) +make-close+)))
(defun make-pagination-status ()
(query-low-level (strcat (prepare-table +table-pagination-status+ :autoincrementp t)
" \"status-id\" TEXT NOT NULL, "
" timeline TEXT NOT NULL, "
" folder TEXT NOT NULL "
+make-close+)))
(defun build-all-indices () (defun build-all-indices ()
(create-table-index +table-status+ '(:folder :timeline :status-id)) (create-table-index +table-status+ '(:folder :timeline :status-id))
(create-table-index +table-account+ '(:id :acct)) (create-table-index +table-account+ '(:id :acct))
@ -455,6 +465,7 @@
(make-subscribed-tag) (make-subscribed-tag)
(make-tag-histogram) (make-tag-histogram)
(make-conversation) (make-conversation)
(make-pagination-status)
(build-all-indices) (build-all-indices)
(fs:set-file-permissions (db-path) (logior fs:+s-irusr+ fs:+s-iwusr+)))) (fs:set-file-permissions (db-path) (logior fs:+s-irusr+ fs:+s-iwusr+))))
@ -1697,13 +1708,43 @@ to `timeline' , `folder' and possibly `account-id', older than
(when-let ((row (fetch-single query))) (when-let ((row (fetch-single query)))
(second row)))) (second row))))
(defun last-status-id-timeline-folder (timeline folder) (defun last-status-id-timeline-folder-table (timeline folder table)
(let ((query (select ((:as (fields (:max :status-id)) :max)) (let ((query (select ((:as (fields (:max :status-id)) :max))
(from :status) (from table)
(where (:and (:= :timeline timeline) (where (:and (:= :timeline timeline)
(:= :folder folder)))))) (:= :folder folder))))))
(second (fetch-single query)))) (second (fetch-single query))))
(defun first-status-id-timeline-folder-table (timeline folder table)
(let ((query (select ((:as (fields (:min :status-id)) :min))
(from table)
(where (:and (:= :timeline timeline)
(:= :folder folder))))))
(second (fetch-single query))))
(defun last-status-id-timeline-folder (timeline folder)
(last-status-id-timeline-folder-table timeline folder :status))
(defun first-status-id-timeline-folder (timeline folder)
(first-status-id-timeline-folder-table timeline folder :status))
(defun last-ignored-status-id-timeline-folder (timeline folder)
(last-status-id-timeline-folder-table timeline folder :ignored-status))
(defun first-ignored-status-id-timeline-folder (timeline folder)
(first-status-id-timeline-folder-table timeline folder :ignored-status))
(defun last-pagination-status-id-timeline-folder (timeline folder)
(last-status-id-timeline-folder-table timeline folder :pagination-status))
(defun first-pagination-status-id-timeline-folder (timeline folder)
(first-status-id-timeline-folder-table timeline folder :pagination-status))
(defun add-to-pagination-status (status-id folder timeline)
(query (make-insert +table-pagination-status+
(:status-id :folder :timeline)
(status-id folder timeline))))
(defun delete-status (timeline-type folder status-id) (defun delete-status (timeline-type folder status-id)
"delete status and connect its children with their grandparent" "delete status and connect its children with their grandparent"
(let* ((status (find-status-id-folder-timeline status-id (let* ((status (find-status-id-folder-timeline status-id

View File

@ -786,6 +786,12 @@
:search-next-unread-message :search-next-unread-message
:last-message-index-status :last-message-index-status
:last-status-id-timeline-folder :last-status-id-timeline-folder
:first-status-id-timeline-folder
:last-ignored-status-id-timeline-folder
:first-ignored-status-id-timeline-folder
:last-pagination-status-id-timeline-folder
:first-pagination-status-id-timeline-folder
:add-to-pagination-status
:count-status-marked-to-delete :count-status-marked-to-delete
:delete-all-statuses-marked-deleted :delete-all-statuses-marked-deleted
:tags-histogram-foreground :tags-histogram-foreground
@ -1119,7 +1125,10 @@
:report-status-event :report-status-event
:add-crypto-data-event :add-crypto-data-event
:function-event :function-event
:dispatch-program-events)) :dispatch-program-events
:add-pagination-status-event
:status-id
:timeline))
(defpackage :api-client (defpackage :api-client
(:use (:use
@ -1821,6 +1830,7 @@
:change-folder :change-folder
:change-timeline :change-timeline
:update-current-timeline :update-current-timeline
:update-current-timeline-backwards
:refresh-tags :refresh-tags
:favourite-selected-status :favourite-selected-status
:unfavourite-selected-status :unfavourite-selected-status

View File

@ -762,6 +762,26 @@
(db:import-crypto-data (db:acct->id username) (db:import-crypto-data (db:acct->id username)
key))) key)))
(defclass add-pagination-status-event (program-event)
((status-id
:initform nil
:initarg :status-id
:accessor status-id)
(timeline
:initform nil
:initarg :timeline
:accessor timeline)
(folder
:initform nil
:initarg :folder
:accessor folder)))
(defmethod process-event ((object add-pagination-status-event))
(with-accessors ((status-id status-id)
(timeline timeline)
(folder folder)) object
(db:add-to-pagination-status status-id folder timeline)))
(defclass function-event (program-event) ()) (defclass function-event (program-event) ())
(defmethod process-event ((object function-event)) (defmethod process-event ((object function-event))

View File

@ -470,7 +470,7 @@ and if fetch local (again, to server) statuses only."
"Update current timeline" "Update current timeline"
(let* ((timeline (thread-window:timeline-type specials:*thread-window*)) (let* ((timeline (thread-window:timeline-type specials:*thread-window*))
(folder (thread-window:timeline-folder specials:*thread-window*)) (folder (thread-window:timeline-folder specials:*thread-window*))
(max-id (db:last-status-id-timeline-folder timeline folder))) (max-id (db:last-pagination-status-id-timeline-folder timeline folder)))
(multiple-value-bind (kind localp) (multiple-value-bind (kind localp)
(timeline->kind timeline) (timeline->kind timeline)
(flet ((update () (flet ((update ()
@ -486,6 +486,28 @@ and if fetch local (again, to server) statuses only."
:ending-message (_ "Messages downloaded.") :ending-message (_ "Messages downloaded.")
:life-start (* (swconf:config-notification-life) 5)))))) :life-start (* (swconf:config-notification-life) 5))))))
(defun update-current-timeline-backwards ()
"Update current timeline backwards
Starting from the oldest toot and going back."
(let* ((timeline (thread-window:timeline-type specials:*thread-window*))
(folder (thread-window:timeline-folder specials:*thread-window*))
(min-id (db:first-pagination-status-id-timeline-folder timeline folder)))
(multiple-value-bind (kind localp)
(timeline->kind timeline)
(flet ((update ()
(client:update-timeline timeline
kind
folder
:max-id min-id
:local localp)
(let ((refresh-event (make-instance 'refresh-thread-windows-event)))
(push-event refresh-event))))
(notify-procedure #'update
(_ "Downloading messages.")
:ending-message (_ "Messages downloaded.")
:life-start (* (swconf:config-notification-life) 5))))))
(defun refresh-tags () (defun refresh-tags ()
"Update messages for subscribed tags" "Update messages for subscribed tags"
(let ((all-tags (db:all-subscribed-tags-name))) (let ((all-tags (db:all-subscribed-tags-name)))