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