mirror of
https://github.com/unclebob/more-speech.git
synced 2024-09-30 02:21:02 +00:00
Multiline headers using html. Concurrent websocket open. And some general glitter.
This commit is contained in:
parent
0ae3be7c6b
commit
c579d5be6d
@ -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))
|
||||
|
||||
|
@ -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 []
|
||||
|
@ -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)))
|
||||
(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)
|
||||
"<br>"
|
||||
(wrap-and-trim (subs s point) n (dec l))))))
|
||||
|
||||
(defn escape-html [s] (string/escape s config/html-escapes))
|
||||
|
@ -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) " " "<span style=\"font-size:5px\">🔵</span>  ")
|
||||
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 "<html>%s<span style=\"font-size:11px\"><b>%-20.20s %s %s %s%s <i>%s</i></b></span><br>%s<hr></html>"
|
||||
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))))))
|
||||
|
||||
|
@ -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)
|
||||
|
@ -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))]
|
||||
|
@ -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)
|
||||
|
Loading…
Reference in New Issue
Block a user