From 149a8e67408347f23d9446d26bbe087d778e09d6 Mon Sep 17 00:00:00 2001 From: "Robert C. Martin" Date: Sat, 21 May 2022 11:39:01 -0500 Subject: [PATCH] Add Subject to edit window, and send message with [subject: ] tag. --- spec/more_speech/nostr/events_spec.clj | 32 +++++++++++++++++++----- src/more_speech/nostr/events.clj | 19 +++++++++----- src/more_speech/ui/swing/edit_window.clj | 10 ++++++-- 3 files changed, 47 insertions(+), 14 deletions(-) diff --git a/spec/more_speech/nostr/events_spec.clj b/spec/more_speech/nostr/events_spec.clj index 53917f0..fbca806 100644 --- a/spec/more_speech/nostr/events_spec.clj +++ b/spec/more_speech/nostr/events_spec.clj @@ -118,12 +118,13 @@ ) ) (context "composing Text (kind 1) messages" - (it "composes an original message." + (it "composes an original message with no subject." (let [private-key (num->bytes 64 314159) event-state {:keys {:private-key (bytes->hex-string private-key)}} public-key (get-pub-key private-key) text "message text" - event (compose-text-event event-state text) + subject "" + event (compose-text-event event-state subject text) {:keys [pubkey created_at kind tags content id sig]} (second event) now (quot (System/currentTimeMillis) 1000)] (should= "EVENT" (first event)) @@ -136,6 +137,25 @@ public-key (hex-string->bytes sig))))) + (it "composes an original message with a subject." + (let [private-key (num->bytes 64 314159) + event-state {:keys {:private-key (bytes->hex-string private-key)}} + public-key (get-pub-key private-key) + text "message text" + subject "subject" + event (compose-text-event event-state subject text) + {:keys [pubkey created_at kind tags content id sig]} (second event) + now (quot (System/currentTimeMillis) 1000)] + (should= "EVENT" (first event)) + (should= (bytes->hex-string public-key) pubkey) + (should (<= 0 (- now created_at) 1)) ;within one second. + (should= 1 kind) + (should= [[:subject "subject"]] tags) + (should= text content) + (should (do-verify (hex-string->bytes id) + public-key + (hex-string->bytes sig))))) + (it "composes a reply to a root article." (let [private-key (num->bytes 64 42) root-id 7734 @@ -146,7 +166,7 @@ :tags []}}} public-key (get-pub-key private-key) text "message text" - event (compose-text-event event-state text root-id) + event (compose-text-event event-state "" text root-id) {:keys [pubkey created_at kind tags content id sig]} (second event) now (quot (System/currentTimeMillis) 1000)] (should= "EVENT" (first event)) @@ -175,7 +195,7 @@ :tags []}}} public-key (get-pub-key private-key) text "message text" - event (compose-text-event event-state text root-child-id) + event (compose-text-event event-state "" text root-child-id) {:keys [pubkey created_at kind tags content id sig]} (second event) now (quot (System/currentTimeMillis) 1000)] (should= "EVENT" (first event)) @@ -198,7 +218,7 @@ event-state {:keys {:private-key (bytes->hex-string private-key)} :text-event-map {root-id {:pubkey root-author :tags [[:p (hexify author)]]}}} - event (compose-text-event event-state "" root-id) + event (compose-text-event event-state "" "message" root-id) {:keys [tags]} (second event)] (should= [[:e root-id-hex] [:p (hexify root-author)]] tags))) @@ -208,7 +228,7 @@ event-state {:keys {:private-key (bytes->hex-string private-key)}} public-key (get-pub-key private-key) text "message/text" - event (compose-text-event event-state text) + event (compose-text-event event-state "" text) {:keys [pubkey created_at kind tags content id sig]} (second event) now (quot (System/currentTimeMillis) 1000)] (should= "EVENT" (first event)) diff --git a/src/more_speech/nostr/events.clj b/src/more_speech/nostr/events.clj index 46a28af..17711ba 100644 --- a/src/more_speech/nostr/events.clj +++ b/src/more_speech/nostr/events.clj @@ -194,25 +194,32 @@ (declare make-event-reference-tags make-people-reference-tags + make-subject-tag get-reply-root) (defn compose-text-event - ([event-state text] - (compose-text-event event-state text nil)) + ([event-state subject text] + (compose-text-event event-state subject text nil)) - ([event-state text reply-to-or-nil] + ([event-state subject text reply-to-or-nil] (let [private-key (get-in event-state [:keys :private-key]) private-key (util/hex-string->bytes private-key) pubkey (ecc/get-pub-key private-key) root (get-reply-root event-state reply-to-or-nil) tags (concat (make-event-reference-tags reply-to-or-nil root) - (make-people-reference-tags event-state pubkey reply-to-or-nil)) + (make-people-reference-tags event-state pubkey reply-to-or-nil) + (make-subject-tag subject)) content text body {:kind 1 :tags tags :content content}] (body->event event-state body)))) +(defn make-subject-tag [subject] + (if (empty? (.trim subject)) + [] + [[:subject subject]])) + (defn get-reply-root [event-state reply-to-or-nil] (if (nil? reply-to-or-nil) nil @@ -255,9 +262,9 @@ (let [send-chan (:send-chan event-state)] (async/>!! send-chan [:event event]))) -(defn compose-and-send-text-event [event-state source-event-or-nil message] +(defn compose-and-send-text-event [event-state source-event-or-nil subject message] (let [reply-to-or-nil (:id source-event-or-nil) - event (compose-text-event event-state message reply-to-or-nil)] + event (compose-text-event event-state subject message reply-to-or-nil)] (send-event event-state event))) (defn compose-and-send-metadata-event [event-state] diff --git a/src/more_speech/ui/swing/edit_window.clj b/src/more_speech/ui/swing/edit_window.clj index fe651e8..3035c04 100644 --- a/src/more_speech/ui/swing/edit_window.clj +++ b/src/more_speech/ui/swing/edit_window.clj @@ -7,6 +7,10 @@ (defn make-edit-window [kind event-agent header-tree] (let [reply? (= kind :reply) event-state @event-agent + subject-label (label "Subject:") + subject-text (text :id :subject :text "") + subject-panel (left-right-split subject-label subject-text + :divider-location 1/10) edit-frame (frame :title (name kind) :size [1000 :by 500] :on-close :dispose) @@ -22,8 +26,9 @@ nil)] (listen send-button :action (fn [_] - (let [message (text edit-area)] - (events/compose-and-send-text-event event-state event message)) + (let [message (text edit-area) + subject (text subject-text)] + (events/compose-and-send-text-event event-state event subject message)) (dispose! edit-frame))) (text! edit-area (if reply? @@ -31,6 +36,7 @@ "")) (config! edit-frame :content (border-panel + :north subject-panel :center (scrollable edit-area) :south (flow-panel :items [send-button]))) (show! edit-frame))) \ No newline at end of file