From 44b6c62e44faf13caa4baf6a76ad23455d0202b0 Mon Sep 17 00:00:00 2001 From: cage Date: Sun, 10 Jan 2021 13:01:03 +0100 Subject: [PATCH] - [gemini] - added command to refresh all gemlogs; - added scheduled refresh of all gemlogs; - fixed sorting of gemlog posts. --- etc/init.lisp | 4 +++- src/db.lisp | 26 ++++++++++++++++---------- src/package.lisp | 3 +++ src/program-events.lisp | 15 ++++++++++++--- src/scheduled-events.lisp | 19 +++++++++++++------ src/ui-goodies.lisp | 5 ++++- 6 files changed, 51 insertions(+), 21 deletions(-) diff --git a/etc/init.lisp b/etc/init.lisp index 939e01b..3a726c3 100644 --- a/etc/init.lisp +++ b/etc/init.lisp @@ -145,7 +145,9 @@ (define-key "M-c" #'open-chats-list-window) -(define-key "M-g s" #'gemini-open-gemlog-window) +(define-key "M-g s o" #'gemini-open-gemlog-window) + +(define-key "M-g s r" #'gemlog-refresh-all) ;; focus diff --git a/src/db.lisp b/src/db.lisp index 7919653..6701f95 100644 --- a/src/db.lisp +++ b/src/db.lisp @@ -2947,6 +2947,8 @@ than `days-in-the-past' days (default: `(swconf:config-purge-cache-days-offset)' (gen-access-message-row post-link :post-link) +(gen-access-message-row post-seenp :seenp) + (defun gemlog-entries (gemlog-url &key (unseen-only nil) (seen-only nil)) (assert (not (and unseen-only seen-only))) @@ -2972,18 +2974,22 @@ than `days-in-the-past' days (default: `(swconf:config-purge-cache-days-offset)' unordered-rows)) (t unordered-rows)))) - (num:multisort actual-rows (list (num:gen-multisort-test string> + (num:multisort actual-rows (list (num:gen-multisort-test (lambda (a b) + (if (and (db-nil-p a) + (db-nil-p b)) + a + (db-nil-p a))) + (lambda (a b) + (if (and (db-nil-p a) + (db-nil-p b)) + b + (db-nil-p b))) + (lambda (a) + (db-getf a :seenp))) + (num:gen-multisort-test string> string< (lambda (a) - (row-post-date a))) - (num:gen-multisort-test (lambda (a b) - (declare (ignore a)) - (db-nil-p b)) - (lambda (a b) - (declare (ignore b)) - (db-nil-p a)) - (lambda (a) - (db-getf a :seenp))))))) + (row-post-date a))))))) (defun delete-gemlog-entry (gemlog-url) (query (delete-from +table-gemlog-entries+ (where (:= :url gemlog-url))))) diff --git a/src/package.lisp b/src/package.lisp index a1e2d8d..e271e60 100644 --- a/src/package.lisp +++ b/src/package.lisp @@ -966,6 +966,7 @@ :row-post-date :row-post-title :row-post-link + :row-post-seenp :gemlog-entries :delete-gemlog-entry)) @@ -1351,6 +1352,7 @@ :gemini-gemlog-subscribe-event :gemlog-cancel-subscription-event :gemlog-show-event + :gemlog-refresh-all-event :get-chat-messages-event :get-chats-event :chat-show-event @@ -2391,6 +2393,7 @@ :gemlogs-subscription-go-down :close-gemlog-window :show-gemlog-to-screen + :gemlog-refresh-all :gemlog-cancel-subscription :send-to-pipe :send-message-to-pipe)) diff --git a/src/program-events.lisp b/src/program-events.lisp index ee3df53..30ef5cb 100644 --- a/src/program-events.lisp +++ b/src/program-events.lisp @@ -1199,11 +1199,13 @@ (encoded-date (db-utils:encode-datetime-string date)) (title (text-utils:strcat (format-time encoded-date date-format) " " - (db:row-post-title entry)))) + (db:row-post-title entry))) + (seenp (db:row-post-seenp entry))) (format stream - "~a~%" + (_ "~a ~:[(not opened)~;(opened)~]~%") (gemini-parser:make-gemini-link link - title)))))) + title) + seenp))))) (url (iri:iri-parse gemlog-url)) (parsed (gemini-parser:parse-gemini-file gemini-page)) (links (gemini-parser:sexp->links parsed @@ -1220,6 +1222,13 @@ keybindings:*gemini-message-keymap*) (windows:draw specials:*message-window*)))) +(defclass gemlog-refresh-all-event (program-event) ()) + +(defmethod process-event ((object gemlog-refresh-all-event)) + (let ((all-subscribed-gemlogs (mapcar #'db:row-url (db:gemini-all-subscriptions)))) + (loop for subscription in all-subscribed-gemlogs do + (gemini-subscription:refresh subscription)))) + ;;;; pleroma (defclass get-chat-messages-event (program-event) diff --git a/src/scheduled-events.lisp b/src/scheduled-events.lisp index b5fb3b3..ae86460 100644 --- a/src/scheduled-events.lisp +++ b/src/scheduled-events.lisp @@ -17,9 +17,11 @@ (in-package :scheduled-events) -(define-constant +refresh-all-chats-data-frequency+ 10000 :test #'=) +(define-constant +refresh-all-chats-data-frequency+ 10000 :test #'=) -(define-constant +refresh-all-chats-messages-frequency+ 50 :test #'=) +(define-constant +refresh-all-chats-messages-frequency+ 50 :test #'=) + +(define-constant +refresh-gemlog-subscriptions-frequency+ 50000 :test #'=) (defun triggedp (ticks frequency) (= (rem ticks frequency) @@ -30,12 +32,16 @@ (when (triggedp ticks ,frequency) ,@body-if-triggered))) -(gen-scheduler-function (refresh-refresh-all-chats-data +(gen-scheduler-function (refresh-all-chats-data +refresh-all-chats-data-frequency+) (ui:notify (_ "Updating all chats.")) (ui:update-all-chats-data)) -(gen-scheduler-function (refresh-refresh-all-chats-messages +(gen-scheduler-function (refresh-gemlog-subscriptions + +refresh-gemlog-subscriptions-frequency+) + (ui:gemlog-refresh-all)) + +(gen-scheduler-function (refresh-all-chats-messages +refresh-all-chats-messages-frequency+) (when (message-window:display-chat-p *message-window*) (ui:update-all-chats-messages) @@ -44,5 +50,6 @@ (program-events:push-event show-event)))) (defun run-scheduled-events (ticks) - (refresh-refresh-all-chats-messages ticks) - (refresh-refresh-all-chats-data ticks)) + (refresh-all-chats-messages ticks) + (refresh-all-chats-data ticks) + (refresh-gemlog-subscriptions ticks)) diff --git a/src/ui-goodies.lisp b/src/ui-goodies.lisp index 5ed263f..4b2be16 100644 --- a/src/ui-goodies.lisp +++ b/src/ui-goodies.lisp @@ -1256,7 +1256,7 @@ certificate). (with-blocking-notify-procedure ((format nil (_ "Canceling subscription for ~s") gemlog-id)) (program-events:push-event event))))) -(defun show-gemlog-to-screen () +(defun show-gemlog-to-screen () (with-selected-gemlog-id (fields gemlog-id) (when-let* ((entries (db:gemlog-entries gemlog-id)) (event (make-instance 'program-events:gemlog-show-event @@ -1267,6 +1267,9 @@ certificate). (program-events:push-event event) (focus-to-message-window)))) +(defun gemlog-refresh-all () + (with-blocking-notify-procedure ((_ "updating gemlog's subscriptions")) + (program-events:push-event (make-instance 'program-events:gemlog-refresh-all-event)))) (defun prompt-for-username (prompt complete-function event notify-starting-message