mirror of
https://github.com/unclebob/more-speech.git
synced 2024-09-30 10:30:56 +00:00
Extract main and move most of protocol into events.
This commit is contained in:
parent
cb605a909f
commit
3c0ce944f4
@ -4,7 +4,7 @@
|
||||
(ns more-speech.core
|
||||
(:gen-class)
|
||||
(: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.ui-context :refer :all]
|
||||
[more-speech.migrator :as migrator]
|
||||
@ -30,7 +30,7 @@
|
||||
(data-storage/read-in-last-n-days config/days-to-read handler)
|
||||
(-> (System/currentTimeMillis) (quot 1000) (- 86400)))
|
||||
_ (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?)
|
||||
(data-storage/write-configuration)
|
||||
|
@ -9,7 +9,9 @@
|
||||
[more-speech.nostr.relays :as relays]
|
||||
[clojure.string :as string]
|
||||
[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)
|
||||
(ecdhJava SECP256K1)))
|
||||
|
||||
@ -82,6 +84,7 @@
|
||||
}
|
||||
event-context-map)))
|
||||
|
||||
(def event-agent (agent nil))
|
||||
|
||||
(defn decrypt-his-dm [event]
|
||||
(let [p-tags (filter #(= :p (first %)) (:tags event))
|
||||
@ -521,5 +524,50 @@
|
||||
(defn compose-and-send-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)))))
|
||||
|
||||
|
||||
|
||||
|
||||
|
47
src/more_speech/nostr/main.clj
Normal file
47
src/more_speech/nostr/main.clj
Normal 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)))
|
@ -1,13 +1,9 @@
|
||||
(ns more-speech.nostr.protocol
|
||||
(:require [clojure.core.async :as async]
|
||||
[clojure.stacktrace :as st]
|
||||
[more-speech.relay :as relay]
|
||||
(:require [more-speech.relay :as relay]
|
||||
[more-speech.websocket-relay :as ws-relay]
|
||||
[more-speech.ui.swing.ui-context :refer :all]
|
||||
[more-speech.nostr.events :as events]
|
||||
[more-speech.nostr.relays :refer [relays]]
|
||||
[more-speech.nostr.util :as util]
|
||||
[more-speech.user-configuration :as user-configuration]
|
||||
[more-speech.config :as config])
|
||||
(:import (java.util Date)
|
||||
(java.text SimpleDateFormat)))
|
||||
@ -37,62 +33,13 @@
|
||||
(defn unsubscribe [relay 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]
|
||||
(unsubscribe relay id)
|
||||
(relay/close relay))
|
||||
|
||||
(def event-agent (agent nil))
|
||||
|
||||
(defn handle-relay-message [relay message]
|
||||
(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 []
|
||||
(let [urls (if config/test-run?
|
||||
@ -139,21 +86,6 @@
|
||||
(subscribe relay id date)
|
||||
(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]
|
||||
(doseq [url (keys @relays)]
|
||||
(let [relay (get-in @relays [url :connection])]
|
||||
@ -161,27 +93,3 @@
|
||||
(prn 'closing url)
|
||||
(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))
|
||||
)
|
Loading…
Reference in New Issue
Block a user