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
|
(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)
|
||||||
|
@ -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)))))
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
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
|
(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))
|
|
||||||
)
|
|
Loading…
Reference in New Issue
Block a user