Extract main and move most of protocol into events.

This commit is contained in:
Robert C. Martin 2023-01-18 21:06:11 -06:00
parent cb605a909f
commit 3c0ce944f4
4 changed files with 100 additions and 97 deletions

View File

@ -4,7 +4,7 @@
(ns more-speech.core (ns more-speech.core
(:gen-class) (:gen-class)
(:require [more-speech.config :as config] (:require [more-speech.config :as config]
[more-speech.nostr.protocol :as protocol] [more-speech.nostr.main :as main]
[more-speech.ui.swing.main-window :as swing] [more-speech.ui.swing.main-window :as swing]
[more-speech.ui.swing.ui-context :refer :all] [more-speech.ui.swing.ui-context :refer :all]
[more-speech.migrator :as migrator] [more-speech.migrator :as migrator]
@ -30,7 +30,7 @@
(data-storage/read-in-last-n-days config/days-to-read handler) (data-storage/read-in-last-n-days config/days-to-read handler)
(-> (System/currentTimeMillis) (quot 1000) (- 86400))) (-> (System/currentTimeMillis) (quot 1000) (- 86400)))
_ (prn 'main 'getting-events) _ (prn 'main 'getting-events)
exit-condition (protocol/get-events latest-old-message-time)] exit-condition (main/start-nostr latest-old-message-time)]
(when (not config/test-run?) (when (not config/test-run?)
(data-storage/write-configuration) (data-storage/write-configuration)

View File

@ -9,7 +9,9 @@
[more-speech.nostr.relays :as relays] [more-speech.nostr.relays :as relays]
[clojure.string :as string] [clojure.string :as string]
[more-speech.nostr.contact-list :as contact-list] [more-speech.nostr.contact-list :as contact-list]
[more-speech.config :as config]) [more-speech.config :as config]
[clojure.stacktrace :as st]
)
(:import (java.nio.charset StandardCharsets) (:import (java.nio.charset StandardCharsets)
(ecdhJava SECP256K1))) (ecdhJava SECP256K1)))
@ -82,6 +84,7 @@
} }
event-context-map))) event-context-map)))
(def event-agent (agent nil))
(defn decrypt-his-dm [event] (defn decrypt-his-dm [event]
(let [p-tags (filter #(= :p (first %)) (:tags event)) (let [p-tags (filter #(= :p (first %)) (:tags event))
@ -521,5 +524,50 @@
(defn compose-and-send-contact-list [contact-list] (defn compose-and-send-contact-list [contact-list]
(send-event (compose-contact-list contact-list))) (send-event (compose-contact-list contact-list)))
(defn compute-id [event]
(util/bytes->num
(make-id
{:pubkey (get event "pubkey")
:created_at (get event "created_at")
:kind (get event "kind")
:tags (get event "tags")
:content (get event "content")})))
(defn is-text-event? [event]
(or (= (:kind event) 1)
(= (:kind event) 4)))
(def event-counter (atom {:total 0}))
(defn count-event [envelope url]
(let [source (second envelope)
key (str url "|" source)]
(swap! event-counter update :total inc)
(swap! event-counter update key #(inc (if (nil? %) 0 %)))
(when (zero? (mod (:total @event-counter) 1000))
(clojure.pprint/pprint @event-counter))))
(defn record-and-display-event [_agent envelope url]
(count-event envelope url)
(try
(let [[_name _subscription-id inner-event :as _decoded-msg] envelope
event (translate-event inner-event)
id (:id event)
computed-id (compute-id inner-event)
ui-handler (get-event-state :event-handler)
dup? (contains? (get-event-state :text-event-map) id)]
(if (= id computed-id)
(let [event (decrypt-dm-event event)]
(when (not (:private event))
(swap! (:event-context @ui-context) process-event event url)
(when (and (not dup?)
(is-text-event? event))
(handle-text-event ui-handler event))))
(prn 'id-mismatch url 'computed-id (util/num32->hex-string computed-id) envelope)))
(catch Exception e
(do (prn `record-and-display-event url (.getMessage e))
(prn "--on event: " envelope)
(st/print-stack-trace e)))))

View File

@ -0,0 +1,47 @@
(ns more-speech.nostr.main
(:require [more-speech.nostr.protocol :as protocol]
[more-speech.ui.swing.ui-context :as context]
[more-speech.user-configuration :as user-configuration]
[more-speech.nostr.events :as events]
[more-speech.nostr.relays :as relays]
[more-speech.relay :as relay]
[clojure.core.async :as async]))
(defn process-send-channel []
(let [send-chan (context/get-event-state :send-chan)
urls (keys @relays/relays)
send-urls (filter #(:write (get @relays/relays %)) urls)
writeable-relays (map #(get-in @relays/relays [% :connection]) send-urls)
writeable-relays (filter some? writeable-relays)]
(loop [[type msg] (async/<!! send-chan)]
(condp = type
:closed :quit
:relaunch :relaunch
:event
(do
(doseq [relay writeable-relays] (relay/send relay msg))
(recur (async/<!! send-chan)))))))
(defn start-nostr [subscription-time]
(let [subscription-id "more-speech"
metadata-request-id "more-speech-metadata"
contact-lists-request-id "more-speech-contact-lists"
event-handler (context/get-event-state :event-handler)
now-in-seconds (quot (System/currentTimeMillis) 1000)]
(protocol/connect-to-relays)
(protocol/request-contact-lists-from-relays contact-lists-request-id)
(when (user-configuration/should-import-metadata? now-in-seconds)
(protocol/request-metadata-from-relays metadata-request-id)
(user-configuration/set-last-time-metadata-imported now-in-seconds))
(protocol/subscribe-to-relays subscription-id subscription-time)
(events/update-relay-panel event-handler)
(if (user-configuration/should-export-profile? now-in-seconds)
(do
(user-configuration/set-last-time-profile-exported now-in-seconds)
(future (events/compose-and-send-metadata-event)))
(println "Not time to export profile yet."))
(let [exit-condition (process-send-channel)]
(protocol/unsubscribe-from-relays subscription-id)
(Thread/sleep 100)
(prn 'done)
exit-condition)))

View File

@ -1,13 +1,9 @@
(ns more-speech.nostr.protocol (ns more-speech.nostr.protocol
(:require [clojure.core.async :as async] (:require [more-speech.relay :as relay]
[clojure.stacktrace :as st]
[more-speech.relay :as relay]
[more-speech.websocket-relay :as ws-relay] [more-speech.websocket-relay :as ws-relay]
[more-speech.ui.swing.ui-context :refer :all] [more-speech.ui.swing.ui-context :refer :all]
[more-speech.nostr.events :as events] [more-speech.nostr.events :as events]
[more-speech.nostr.relays :refer [relays]] [more-speech.nostr.relays :refer [relays]]
[more-speech.nostr.util :as util]
[more-speech.user-configuration :as user-configuration]
[more-speech.config :as config]) [more-speech.config :as config])
(:import (java.util Date) (:import (java.util Date)
(java.text SimpleDateFormat))) (java.text SimpleDateFormat)))
@ -37,62 +33,13 @@
(defn unsubscribe [relay id] (defn unsubscribe [relay id]
(relay/send relay ["CLOSE" id])) (relay/send relay ["CLOSE" id]))
(defn compute-id [event]
(util/bytes->num
(events/make-id
{:pubkey (get event "pubkey")
:created_at (get event "created_at")
:kind (get event "kind")
:tags (get event "tags")
:content (get event "content")})))
(defn is-text-event? [event]
(or (= (:kind event) 1)
(= (:kind event) 4)))
(def event-counter (atom {:total 0}))
(defn count-event [envelope url]
(let [source (second envelope)
key (str url "|" source)]
(swap! event-counter update :total inc)
(swap! event-counter update key #(inc (if (nil? %) 0 %)))
(when (zero? (mod (:total @event-counter) 1000))
(clojure.pprint/pprint @event-counter))))
(defn record-and-display-event [_agent envelope url]
(count-event envelope url)
(try
(let [[_name _subscription-id inner-event :as _decoded-msg] envelope
event (events/translate-event inner-event)
id (:id event)
computed-id (compute-id inner-event)
ui-handler (get-event-state :event-handler)
dup? (contains? (get-event-state :text-event-map) id)]
(if (= id computed-id)
(let [event (events/decrypt-dm-event event)]
(when (not (:private event))
(swap! (:event-context @ui-context) events/process-event event url)
(when (and (not dup?)
(is-text-event? event))
(events/handle-text-event ui-handler event)
)))
(prn 'id-mismatch url 'computed-id (util/num32->hex-string computed-id) envelope)
))
(catch Exception e
(do (prn `record-and-display-event url (.getMessage e))
(prn "--on event: " envelope)
(st/print-stack-trace e))
)))
(defn close-connection [relay id] (defn close-connection [relay id]
(unsubscribe relay id) (unsubscribe relay id)
(relay/close relay)) (relay/close relay))
(def event-agent (agent nil))
(defn handle-relay-message [relay message] (defn handle-relay-message [relay message]
(let [url (::ws-relay/url relay)] (let [url (::ws-relay/url relay)]
(send event-agent record-and-display-event message url))) (send events/event-agent events/record-and-display-event message url)))
(defn connect-to-relays [] (defn connect-to-relays []
(let [urls (if config/test-run? (let [urls (if config/test-run?
@ -139,21 +86,6 @@
(subscribe relay id date) (subscribe relay id date)
(swap! relays assoc-in [url :subscribed] true)))))) (swap! relays assoc-in [url :subscribed] true))))))
(defn process-send-channel []
(let [send-chan (get-event-state :send-chan)
urls (keys @relays)
send-urls (filter #(:write (get @relays %)) urls)
writeable-relays (map #(get-in @relays [% :connection]) send-urls)
writeable-relays (filter some? writeable-relays)]
(loop [[type msg] (async/<!! send-chan)]
(condp = type
:closed :quit
:relaunch :relaunch
:event
(do
(doseq [relay writeable-relays] (relay/send relay msg))
(recur (async/<!! send-chan)))))))
(defn unsubscribe-from-relays [id] (defn unsubscribe-from-relays [id]
(doseq [url (keys @relays)] (doseq [url (keys @relays)]
(let [relay (get-in @relays [url :connection])] (let [relay (get-in @relays [url :connection])]
@ -161,27 +93,3 @@
(prn 'closing url) (prn 'closing url)
(close-connection relay id))))) (close-connection relay id)))))
(defn get-events [subscription-time]
(let [subscription-id "more-speech"
metadata-request-id "more-speech-metadata"
contact-lists-request-id "more-speech-contact-lists"
event-handler (get-event-state :event-handler)
now-in-seconds (quot (System/currentTimeMillis) 1000)]
(connect-to-relays)
(request-contact-lists-from-relays contact-lists-request-id)
(when (user-configuration/should-import-metadata? now-in-seconds)
(request-metadata-from-relays metadata-request-id)
(user-configuration/set-last-time-metadata-imported now-in-seconds))
(subscribe-to-relays subscription-id subscription-time)
(events/update-relay-panel event-handler)
(if (user-configuration/should-export-profile? now-in-seconds)
(do
(user-configuration/set-last-time-profile-exported now-in-seconds)
(future (events/compose-and-send-metadata-event)))
(println "Not time to export profile yet."))
(let [exit-condition (process-send-channel)]
(unsubscribe-from-relays subscription-id)
(Thread/sleep 100)
(prn 'done)
exit-condition))
)