diff --git a/src/more_speech/config.clj b/src/more_speech/config.clj index 07f4b85..cec0ae9 100644 --- a/src/more_speech/config.clj +++ b/src/more_speech/config.clj @@ -1,7 +1,8 @@ (ns more-speech.config - (:require [more-speech.mem :refer :all] - [more-speech.db.in-memory :as in-memory] - [more-speech.db.xtdb :as xtdb])) + (:require + [more-speech.db.in-memory :as in-memory] + [more-speech.db.xtdb :as xtdb] + [more-speech.mem :refer :all])) (def default-font "COURIER-PLAIN-14") (def bold-font "COURIER-BOLD-14") @@ -10,9 +11,9 @@ (def article-width 120) -(def days-to-read 6/24) ;how far back in time to load old messages from the database. +(def days-to-read 6/24) ;how far back in time to load old messages from the database. (def days-to-read-messages-that-have-been-read 7) -(def read-contacts false) ;Read contacts from relays at startup. +(def read-contacts false) ;Read contacts from relays at startup. (def read-contact-lists-days-ago 0.5) (def migration-level 11) @@ -22,8 +23,8 @@ (def subscription-id-base "ms") -(def auto-thanks :off) ;{:dm :note :off} -(def auto-thanks-fortune :normal) ;{:off :normal :markov :insane} +(def auto-thanks :off) ;{:dm :note :off} +(def auto-thanks-fortune :normal) ;{:off :normal :markov :insane} (def test-run? (atom false)) (defn is-test-run? [] @test-run?) @@ -47,12 +48,12 @@ ;---configuration files (def private-directory (atom "private")) (def migration-filename (atom "private/migration")) -(def nicknames-filename (atom "private/nicknames")) ;grandfathered. +(def nicknames-filename (atom "private/nicknames")) ;grandfathered. (def profiles-filename (atom "private/profiles")) (def keys-filename (atom "private/keys")) (def relays-filename (atom "private/relays")) (def read-event-ids-filename (atom "private/read-event-ids")) -(def tabs-filename (atom "private/tabs")) ;grandfathered. +(def tabs-filename (atom "private/tabs")) ;grandfathered. (def tabs-list-filename (atom "private/tabs-list")) (def messages-directory (atom "private/messages")) (def messages-filename (atom "private/messages/message-file")) @@ -93,6 +94,8 @@ (def user-name-chars #"[\w\-]+") (def reference-pattern #"\#\[\d+\]") +(def html-escapes {\< "<" \> ">"}) + (def production-db :xtdb) (def db-type (atom nil)) diff --git a/src/more_speech/nostr/protocol.clj b/src/more_speech/nostr/protocol.clj index 906157b..19ec3fa 100644 --- a/src/more_speech/nostr/protocol.clj +++ b/src/more_speech/nostr/protocol.clj @@ -368,9 +368,10 @@ (check-open url)))) (defn connect-to-relays [] - (doseq [url (keys @relays)] - (let [relay (make-relay url)] - (connect-to-relay relay))) + (let [futures (for [url (keys @relays)] + (let [relay (make-relay url)] + (future (connect-to-relay relay))))] + (doseq [f futures] (deref f))) (log-pr 2 'relay-connection-attempts-complete)) (defn request-contact-lists-from-relays [] diff --git a/src/more_speech/ui/formatter_util.clj b/src/more_speech/ui/formatter_util.clj index 8826d21..a2d1311 100644 --- a/src/more_speech/ui/formatter_util.clj +++ b/src/more_speech/ui/formatter_util.clj @@ -1,5 +1,6 @@ (ns more-speech.ui.formatter-util - (:require [clojure.string :as string]) + (:require [clojure.string :as string] + [more-speech.config :as config]) (:import (java.text SimpleDateFormat) (java.util Date))) @@ -26,4 +27,19 @@ (defn prepend> [text] (let [lines (string/split-lines text) lines (map #(str ">" %) lines)] - (string/join "\n" lines))) \ No newline at end of file + (string/join "\n" lines))) + +(defn wrap-and-trim [s n l] + (cond + (zero? l) "" + + (< (count s) n) s + + :else + (let [point (.lastIndexOf s " " n) + point (if (< point 1) n point)] + (str (subs s 0 point) + "
" + (wrap-and-trim (subs s point) n (dec l)))))) + +(defn escape-html [s] (string/escape s config/html-escapes)) diff --git a/src/more_speech/ui/formatters.clj b/src/more_speech/ui/formatters.clj index 69dc813..86cd07f 100644 --- a/src/more_speech/ui/formatters.clj +++ b/src/more_speech/ui/formatters.clj @@ -134,9 +134,12 @@ (defn format-header ([event] - (format-header event :long)) + (format-header event :long {})) - ([{:keys [pubkey created-at tags zaps] :as event} opt] + ([event opt] + (format-header event opt {})) + + ([{:keys [pubkey created-at tags zaps] :as event} opt args] (try (if (nil? event) "nil" @@ -158,7 +161,21 @@ (condp = opt :long (format "%s%s %20s %s %s%s%s\n" reply-mark reaction-mark name time zap-mark dm-mark subject-content) :short (format "%s%s %s %s %s%s%s" reply-mark reaction-mark name time zap-mark dm-mark subject-content) - :menu-item (format "%-20.20s %s %10.10s|%-30.30s" name short-time subject content)))) + :menu-item (format "%-20.20s %s %10.10s|%-30.30s" name short-time subject content) + + :tree-header + (let [read-mark (if (:read? args) " " "🔵  ") + trimmed-content (-> content + (string/replace \newline \space) + (wrap-and-trim 100 2)) + escaped-name (escape-html name) + escaped-dm-mark (escape-html dm-mark) + reaction-mark (if (some? (:reactions event)) (str "🤙" reaction-mark) "")] + (format "%s%-20.20s %s %s %s%s %s
%s
" + read-mark escaped-name reaction-mark short-time + zap-mark escaped-dm-mark subject + trimmed-content)) + ))) (catch Exception e (log-pr 1 'format-header 'Exception (.getMessage e)))))) diff --git a/src/more_speech/ui/swing/edit_window.clj b/src/more_speech/ui/swing/edit_window.clj index 25e35e9..4b54a85 100644 --- a/src/more_speech/ui/swing/edit_window.clj +++ b/src/more_speech/ui/swing/edit_window.clj @@ -31,9 +31,8 @@ (when (or (not reply?) (and reply? (some? event))) (when reply? - (let [subject (formatters/get-subject (:tags event)) - prefix (if (empty? subject) "" "Re: ")] - (text! subject-text (str prefix subject)))) + (let [subject (formatters/get-subject (:tags event))] + (text! subject-text subject))) (listen send-button :action (fn [_] (let [message (text edit-area) diff --git a/src/more_speech/ui/swing/tabs.clj b/src/more_speech/ui/swing/tabs.clj index 0421338..909e759 100644 --- a/src/more_speech/ui/swing/tabs.clj +++ b/src/more_speech/ui/swing/tabs.clj @@ -13,10 +13,9 @@ [more-speech.nostr.zaps :as zaps] [more-speech.ui.formatters :as formatters] [more-speech.ui.swing.article-panel :as article-panel] - [more-speech.ui.swing.tabs-util :as at-util] [more-speech.ui.swing.edit-window :as edit-window] - [more-speech.ui.swing.util :as swing-util] - [more-speech.user-configuration :as uconfig]) + [more-speech.ui.swing.tabs-util :as at-util] + [more-speech.ui.swing.util :as swing-util]) (:use (seesaw [color] [core] [font] [tree])) (:import (javax.swing.tree DefaultMutableTreeNode DefaultTreeModel TreePath))) @@ -30,10 +29,9 @@ event-id (if (number? event-id) event-id 0) ;dummy event-idi event (gateway/get-event (get-db) event-id) read? (:read event) - font (if read? (uconfig/get-default-font) (uconfig/get-bold-font)) color (if (= (:kind event) 4) :blue :black)] - (config! widget :font font :foreground color) - (text! widget (formatters/format-header event))))) + (config! widget :foreground color) + (text! widget (formatters/format-header event :tree-header {:read? read?}))))) (defn select-article [tab-index selected-node] @@ -52,7 +50,9 @@ (let [tab-index (swing-util/get-tab-index tab-name) header-tree (tree :renderer render-event :root-visible? false - :expands-selected-paths? true + :shows-root-handles? false + :expands-selected-paths? false + :row-height 60 :model (DefaultTreeModel. (DefaultMutableTreeNode. 0))) renderer (.getCellRenderer header-tree) _ (.setBackgroundSelectionColor renderer (color :azure))] diff --git a/src/more_speech/websocket_relay.clj b/src/more_speech/websocket_relay.clj index ee18d3c..8e4b6c0 100644 --- a/src/more_speech/websocket_relay.clj +++ b/src/more_speech/websocket_relay.clj @@ -89,7 +89,7 @@ cl (.header cl "origin" "more-speech") cws (.buildAsync cl (URI/create url) (->listener (StringBuffer.) relay)) wsf (future (.get cws)) - ws (deref wsf 30000 :time-out)] + ws (deref wsf 5000 :time-out)] (if (= ws :time-out) (do (log-pr 2 'connection-time-out url)