Add Subject to edit window, and send message with [subject: <subject>] tag.

This commit is contained in:
Robert C. Martin 2022-05-21 11:39:01 -05:00
parent 02c00be014
commit 149a8e6740
3 changed files with 47 additions and 14 deletions

View File

@ -118,12 +118,13 @@
) )
) )
(context "composing Text (kind 1) messages" (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) (let [private-key (num->bytes 64 314159)
event-state {:keys {:private-key (bytes->hex-string private-key)}} event-state {:keys {:private-key (bytes->hex-string private-key)}}
public-key (get-pub-key private-key) public-key (get-pub-key private-key)
text "message text" 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) {:keys [pubkey created_at kind tags content id sig]} (second event)
now (quot (System/currentTimeMillis) 1000)] now (quot (System/currentTimeMillis) 1000)]
(should= "EVENT" (first event)) (should= "EVENT" (first event))
@ -136,6 +137,25 @@
public-key public-key
(hex-string->bytes sig))))) (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." (it "composes a reply to a root article."
(let [private-key (num->bytes 64 42) (let [private-key (num->bytes 64 42)
root-id 7734 root-id 7734
@ -146,7 +166,7 @@
:tags []}}} :tags []}}}
public-key (get-pub-key private-key) public-key (get-pub-key private-key)
text "message text" 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) {:keys [pubkey created_at kind tags content id sig]} (second event)
now (quot (System/currentTimeMillis) 1000)] now (quot (System/currentTimeMillis) 1000)]
(should= "EVENT" (first event)) (should= "EVENT" (first event))
@ -175,7 +195,7 @@
:tags []}}} :tags []}}}
public-key (get-pub-key private-key) public-key (get-pub-key private-key)
text "message text" 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) {:keys [pubkey created_at kind tags content id sig]} (second event)
now (quot (System/currentTimeMillis) 1000)] now (quot (System/currentTimeMillis) 1000)]
(should= "EVENT" (first event)) (should= "EVENT" (first event))
@ -198,7 +218,7 @@
event-state {:keys {:private-key (bytes->hex-string private-key)} event-state {:keys {:private-key (bytes->hex-string private-key)}
:text-event-map {root-id {:pubkey root-author :text-event-map {root-id {:pubkey root-author
:tags [[:p (hexify 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)] {:keys [tags]} (second event)]
(should= [[:e root-id-hex] [:p (hexify root-author)]] tags))) (should= [[:e root-id-hex] [:p (hexify root-author)]] tags)))
@ -208,7 +228,7 @@
event-state {:keys {:private-key (bytes->hex-string private-key)}} event-state {:keys {:private-key (bytes->hex-string private-key)}}
public-key (get-pub-key private-key) public-key (get-pub-key private-key)
text "message/text" 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) {:keys [pubkey created_at kind tags content id sig]} (second event)
now (quot (System/currentTimeMillis) 1000)] now (quot (System/currentTimeMillis) 1000)]
(should= "EVENT" (first event)) (should= "EVENT" (first event))

View File

@ -194,25 +194,32 @@
(declare make-event-reference-tags (declare make-event-reference-tags
make-people-reference-tags make-people-reference-tags
make-subject-tag
get-reply-root) get-reply-root)
(defn compose-text-event (defn compose-text-event
([event-state text] ([event-state subject text]
(compose-text-event event-state text nil)) (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]) (let [private-key (get-in event-state [:keys :private-key])
private-key (util/hex-string->bytes private-key) private-key (util/hex-string->bytes private-key)
pubkey (ecc/get-pub-key private-key) pubkey (ecc/get-pub-key private-key)
root (get-reply-root event-state reply-to-or-nil) root (get-reply-root event-state reply-to-or-nil)
tags (concat (make-event-reference-tags reply-to-or-nil root) 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 content text
body {:kind 1 body {:kind 1
:tags tags :tags tags
:content content}] :content content}]
(body->event event-state body)))) (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] (defn get-reply-root [event-state reply-to-or-nil]
(if (nil? reply-to-or-nil) (if (nil? reply-to-or-nil)
nil nil
@ -255,9 +262,9 @@
(let [send-chan (:send-chan event-state)] (let [send-chan (:send-chan event-state)]
(async/>!! send-chan [:event event]))) (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) (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))) (send-event event-state event)))
(defn compose-and-send-metadata-event [event-state] (defn compose-and-send-metadata-event [event-state]

View File

@ -7,6 +7,10 @@
(defn make-edit-window [kind event-agent header-tree] (defn make-edit-window [kind event-agent header-tree]
(let [reply? (= kind :reply) (let [reply? (= kind :reply)
event-state @event-agent 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) edit-frame (frame :title (name kind)
:size [1000 :by 500] :size [1000 :by 500]
:on-close :dispose) :on-close :dispose)
@ -22,8 +26,9 @@
nil)] nil)]
(listen send-button :action (listen send-button :action
(fn [_] (fn [_]
(let [message (text edit-area)] (let [message (text edit-area)
(events/compose-and-send-text-event event-state event message)) subject (text subject-text)]
(events/compose-and-send-text-event event-state event subject message))
(dispose! edit-frame))) (dispose! edit-frame)))
(text! edit-area (text! edit-area
(if reply? (if reply?
@ -31,6 +36,7 @@
"")) ""))
(config! edit-frame :content (config! edit-frame :content
(border-panel (border-panel
:north subject-panel
:center (scrollable edit-area) :center (scrollable edit-area)
:south (flow-panel :items [send-button]))) :south (flow-panel :items [send-button])))
(show! edit-frame))) (show! edit-frame)))