Articles now contain a list of references derived from tags.

This commit is contained in:
Robert C. Martin 2022-01-31 14:56:01 -06:00
parent 137cef3e89
commit 09ccc80a28
5 changed files with 68 additions and 27 deletions

View File

@ -50,13 +50,13 @@
(markup-article article)))))
(describe "Formatting an author nickname."
(let [author-tuple ["the pubkey" "nickname"]]
(let [author-tuple [0 "nickname"]]
(it "conforms to spec."
(should (s/valid? ::a/author-nickname-tuple author-tuple)))
(it "is properly formatted."
(should= [:bold
"the pubk..."
"00000000..."
:regular
" - "
"nickname"

View File

@ -9,14 +9,15 @@
"pubkey" "f00d"
"created_at" @now
"kind" 1
"tags" []
"tags" [["p" "0001" "someurl"]
["e" "0002" "anotherurl"]]
"content" "the content"
"sig" "dddddd"})
(with state {:application
{:text-event-map {}
:chronological-text-events []}
})
(it "should create map of text events by id"
(it "creates the map of text events by id"
(let [state (process-text-event @state @event)
event-map (get-in state [:application :text-event-map])
text-events (get-in state [:application :chronological-text-events])
@ -30,7 +31,18 @@
(should= @now (:created-at event))
(should= "the content" (:content event))
(should= 0xdddddd (:sig event))
(should= [] (:tags event))
(should= [[:p 1 "someurl"]
[:e 2 "anotherurl"]] (:tags event))
))
(it "adds references to tagged articles."
(let [state (assoc-in @state
[:application :text-event-map 2]
{:id 2})
state (process-references state (translate-text-event @event))
text-event-map (get-in state [:application :text-event-map])
article (get text-event-map 2)]
(should= [0xdeadbeef] (:references article)))
)
)

View File

@ -1,5 +1,6 @@
(ns more-speech.article
(:require [clojure.spec.alpha :as s])
(:require [clojure.spec.alpha :as s]
[more-speech.nostr.util :refer [num->hex-string]])
(:import (java.util Date)
(java.text SimpleDateFormat)))
@ -15,13 +16,13 @@
(s/def ::author-pubkey string?)
(s/def ::author-nickname-tuple (s/tuple ::author-pubkey ::author-nickname))
(defn make-article [name time body]
(defn make-article [name time body thread-count]
{:group ""
:author name
:subject "?"
:time time
:body body
:thread-count 1}
:thread-count thread-count}
)
(defn format-time [time]
@ -63,7 +64,7 @@
(defn markup-author [[pubkey name]]
[:bold
(abbreviate-key pubkey)
(abbreviate-key (num->hex-string pubkey))
:regular
" - "
name

View File

@ -11,29 +11,56 @@
[name subscription-id inner-event :as decoded-msg] event
{:strs [id pubkey created_at kind tags content sig]} inner-event]
(condp = kind
0 (update-in
state [:application :nicknames]
assoc pubkey (get (json/read-str content) "name" "tilt"))
0 (let [pubkey (hex-string->num pubkey)
name (get (json/read-str content) "name" "tilt")]
(update-in
state [:application :nicknames] assoc pubkey name))
3 (do (printf "%s: %s %s %s\n" kind (article/format-time created_at) (name-of pubkey) content)
state)
1 (process-text-event state inner-event)
4 (do (printf "%s: %s %s %s\n" kind (article/format-time created_at) (name-of pubkey) content)
state)
(do (prn "unknown event: " event)
state)
)))
state))))
(defn process-text-event [state event]
(defn process-tag [[type hex arg]]
[(keyword type)
(hex-string->num hex)
arg])
(defn process-tags [tags]
(map process-tag tags))
(defn process-references [state {:keys [id tags] :as event}]
(let [e-tags (filter #(= :e (first %)) tags)
refs (map second e-tags)]
(loop [refs refs
state state]
(if (empty? refs)
state
(let [referent-path [:application :text-event-map (first refs)]]
(if (nil? (get-in state referent-path))
(recur (rest refs) state)
(recur (rest refs)
(update-in
state
(conj referent-path :references)
conj id))))))))
(defn translate-text-event [event]
(let [id (hex-string->num (get event "id"))
pubkey (hex-string->num (get event "pubkey"))
sig (hex-string->num (get event "sig"))
new-event {:id id
:pubkey pubkey
:created-at (get event "created_at")
:content (get event "content")
:sig sig
:tags (get event "tags")}
state (assoc-in state [:application :text-event-map id] new-event)
sig (hex-string->num (get event "sig"))]
{:id id
:pubkey pubkey
:created-at (get event "created_at")
:content (get event "content")
:sig sig
:tags (process-tags (get event "tags"))}))
(defn process-text-event [state event]
(let [event (translate-text-event event)
id (:id event)
state (assoc-in state [:application :text-event-map id] event)
state (update-in state [:application :chronological-text-events] conj id)]
state
))
(process-references state event)))

View File

@ -71,9 +71,10 @@
cursor
(let [article-id (first articles)
text-event (get article-map article-id)
{:keys [pubkey created-at content]} text-event
{:keys [pubkey created-at content references]} text-event
name (get nicknames pubkey (num->hex-string pubkey))
article (a/make-article name created-at content)]
ref-count (count references)
article (a/make-article name created-at content ref-count)]
(recur (draw-article window cursor article)
(rest articles)))))))