summaryrefslogtreecommitdiff
path: root/desk/lib/mutations
diff options
context:
space:
mode:
Diffstat (limited to 'desk/lib/mutations')
-rw-r--r--desk/lib/mutations/nostr.hoon243
-rw-r--r--desk/lib/mutations/trill.hoon78
2 files changed, 321 insertions, 0 deletions
diff --git a/desk/lib/mutations/nostr.hoon b/desk/lib/mutations/nostr.hoon
new file mode 100644
index 0000000..2c6acd5
--- /dev/null
+++ b/desk/lib/mutations/nostr.hoon
@@ -0,0 +1,243 @@
+/- sur=nostrill, nsur=nostr, comms=nostrill-comms,
+ post=trill-post, gate=trill-gate, feed=trill-feed
+
+/+ appjs=json-nostrill,
+ lib=nostrill,
+ njs=json-nostr,
+ postlib=trill-post,
+ shim,
+ sr=sortug
+
+|_ [=state:sur =bowl:gall]
++$ card card:agent:gall
+:: events
+++ process-events ^- (quip card _state)
+ :: =/ l events.state
+ :: =| cards=(list card:agent:gall)
+ :: |- ?~ l [cards state]
+ :: =/ n (event-parsing i.l)
+ :: $(cards -.n, state +.n, l t.l)
+ :: TODO
+ `state
+
+:: ++ parse-events
+:: |= evs=(list event:nsur)
+:: ^- (quip card _state)
+:: =| cards=(list card)
+:: =^ cards state
+:: |- ?~ evs [cards state]
+:: =^ cards state (handle-event i.evs)
+:: $(evs t.evs)
+:: [cards state]
+
+++ populate-profiles
+ |= pubkeys=(set @ux)
+ ^- (quip card _state)
+ =/ shimm ~(. shim [state bowl])
+ =^ cards state (get-profiles-http:shimm pubkeys)
+ [cards state]
+
+
+
+
+
+++ handle-http
+ |= [sub-id=@t msgs=(list relay-msg:nsur)]
+ ~& handling-http=[sub-id (lent msgs)]
+ =| cards=(list card)
+ |- ?~ msgs [cards state]
+ =^ cards state (handle-msg i.msgs)
+ $(msgs t.msgs)
+
+
+++ handle-msg |= msg=relay-msg:nsur
+ ^- (quip card _state)
+ ?+ -.msg `state
+ %event
+ (handle-event '' sub-id.msg event.msg)
+ %eose
+ `state
+ %closed
+ `state
+ %auth ~& >> auth=+.msg :: TODO handle auth challenges?
+ `state
+ %notice ~& >> notice=+.msg :: TODO pass to UI?
+ `state
+ %error ~& >>> relay-error=+.msg
+ `state
+ ==
+
+++ handle-ws |= [relay=@t msg=relay-msg:nsur]
+ =/ rs (~(get by relays.state) relay)
+ ?~ rs :: TODO do we really
+ `state
+ =^ cards state
+ ~& handle-ws=-.msg
+ ?- -.msg
+ %ok (handle-ok relay +.msg)
+ %event
+ =. relays.state (update-relay-stats relay sub-id.msg)
+ (handle-event relay sub-id.msg event.msg)
+
+ %eose
+ :: TODO do unsub for replaceable/addressable events
+ =/ creq (~(get by reqs.u.rs) +.msg)
+ ?~ creq `state
+ :: =. reqs.u.rs (~(del by reqs.u.rs) +.msg)
+ :: =. relays.state (~(put by relays.state) relay u.rs)
+ =/ cardslib ~(. cards:lib bowl)
+ =/ c (update-ui:cardslib [%nostr nostr-feed.state])
+ :_ state :~(c)
+ %closed =. reqs.u.rs (~(del by reqs.u.rs) sub-id.msg)
+ =. relays.state (~(put by relays.state) relay u.rs)
+ `state
+ %auth ~& >> auth=+.msg :: TODO handle auth challenges?
+ `state
+ %notice ~& >> notice=+.msg :: TODO pass to UI?
+ `state
+ %error ~& >>> relay-error=+.msg
+ =. relays.state (~(del by relays.state) relay)
+ `state
+ ==
+ [cards state]
+
+
+ :: =^ cards state (handle-event:mutat url.u.msg sub-id.u.msg event.u.msg)
+ :: :: TODO not just stash events
+ :: =/ relay (~(get by relays) url.u.msg)
+ :: =/ nevents=(list event:nsur) ?~ relay [event.u.msg ~] [event.u.msg u.relay]
+ :: =/ nevents2 (scag 100 nevents)
+
+ :: =. relays (~(put by relays) url.u.msg nevents2)
+ :: :: TODO respond better
+ :: =/ response (ebail:rout id.order)
+ :: =/ ncards (weld cards response)
+
+ :: [ncards this]
+ :: `state
+
+++ update-relay-stats
+ |= [relay=@t sub-id=@t] ^+ relays.state
+
+ =/ cur (~(get by relays.state) relay)
+ =/ curr ?~ cur *relay-stats:nsur u.cur
+ =? connected.curr ?=(%~ connected.curr) (some now.bowl)
+ =/ creq (~(get by reqs.curr) sub-id)
+ ?~ creq relays.state :: bail
+ =/ nreq u.creq(received +(received.u.creq))
+ =. reqs.curr (~(put by reqs.curr) sub-id nreq)
+ (~(put by relays.state) relay curr)
+
+++ handle-ok |= [relay=@t event-id=@ux accepted=? msg=@t]
+ ^- (quip card _state)
+ :: TODO pass to UI
+ `state
+
+
+++ handle-event
+ |= [relay=@t sub-id=@t =event:nsur]
+ ^- (quip card _state)
+ |^
+ ~& parsing-nostr-event=kind.event
+:: https://nostrdata.github.io/kinds/
+ ?: .=(kind.event 666) :: one_off subs eose cf. 999
+ parse-shim-oneose
+ ?: .=(kind.event 0) :: user metadata
+ parse-metadata
+ ?: .=(kind.event 1) :: apparently a poast
+ parse-poast
+ ?: .=(kind.event 3) :: follow list
+ parse-follow
+ :: ?: .=(kind.event 5) :: delete
+ ?: .=(kind.event 6) :: RT
+ parse-follow
+ ?: .=(kind.event 7) :: Reaction
+ parse-follow
+
+ `state
+
+ ++ parse-metadata
+ ^- (quip card _state)
+ =/ jstring content.event
+ =/ ujon (de:json:html jstring)
+ ?~ ujon ~& failed-parse-metadata=ujon `state
+ =/ umeta (user-meta:de:njs u.ujon)
+ ?~ umeta ~& >> failed-dejs-metadata=ujon `state
+ =. profiles.state (~(put by profiles.state) [%nostr pubkey.event] u.umeta)
+ `state
+
+
+ ++ parse-poast
+ ^- (quip card _state)
+ =. nostr-feed.state (put:norm:sur nostr-feed.state created-at.event event)
+ :: =/ uprof (~(get by profiles.state) pubkey.event)
+ :: ?~ uprof
+ :: =/ shimm ~(. shim [state bowl])
+ :: =^ cards state (get-profiles:shimm (silt ~[pubkey.event]))
+ :: [cards state]
+
+
+ :: =/ fid (~(get by following.state) pubkey.event)
+ :: ?~ fid `state :: don't save post if we don't follow the fucker
+
+ :: =/ cl (tokenize:postlib content.event)
+
+ :: =/ ts (from-unix:jikan:sr created-at.event)
+ :: :: TODO wtf
+ :: =/ cm=content-map:post (init-content-map:postlib cl ts)
+
+ :: =/ p=post:post :*
+ :: id=ts
+ :: host=`@p`pubkey.event
+ :: author=`@p`pubkey.event
+ :: thread=ts
+ :: parent=~
+ :: children=~
+ :: contents=cm
+ :: read=*lock:gate
+ :: write=*lock:gate
+ :: *engagement:post
+ :: 0v0
+ :: *signature:post
+ :: tags=~
+ :: ==
+ :: =/ nfid (put:orm:feed u.fid ts p)
+ :: =. following.state (~(put by following.state) pubkey.event nfid)
+ `state
+ ++ parse-follow
+ ^- (quip card _state)
+ =/ following (~(get by follow-graph.state) [%nostr pubkey.event])
+ =/ follow-set ?~ following *(set follow:sur) u.following
+ |- ?~ tags.event `state
+ =/ t=tag:nsur i.tags.event
+ :: ?. .=('p' key.t) $(tags.event t.tags.event)
+ :: =/ pubkeys value.t
+ :: =/ pubkey (slaw:sr %ux pubkeys)
+ :: ?~ pubkey ~& "parsing hex error" $(tags.event t.tags.event)
+ :: =/ relay (snag 0 rest.t)
+ :: =/ rel ?: .=(relay '') ~ (some relay)
+ :: =/ nickname (snag 1 rest.t)
+ :: =/ meta=follow:sur [u.pubkey nickname rel]
+ :: =. follow-set (~(put in follow-set) meta)
+ :: =. follow-graph.state (~(put by follow-graph.state) pubkey.event follow-set)
+ $(tags.event t.tags.event)
+ ++ parse-shim-oneose
+ ^- (quip card _state)
+ =/ rs (~(get by relays.state) relay)
+ ?~ rs `state
+ =. reqs.u.rs (~(del by reqs.u.rs) sub-id)
+ =. relays.state (~(put by relays.state) relay u.rs)
+ `state
+ --
+
+++ handle-prof-fact |= pf=prof-fact:comms
+ ^- (quip card _state)
+ =/ =user:sur [%urbit src.bowl]
+ ?- -.pf
+ %prof =. profiles.state (~(put by profiles.state) user +.pf)
+ :: TODO kinda wanna send it to the UI
+ `state
+ %keys `state
+ :: TODO really need a way to keep track of everyone's pubkeys
+ ==
+--
diff --git a/desk/lib/mutations/trill.hoon b/desk/lib/mutations/trill.hoon
new file mode 100644
index 0000000..ea6dadf
--- /dev/null
+++ b/desk/lib/mutations/trill.hoon
@@ -0,0 +1,78 @@
+/- sur=nostrill, nsur=nostr, comms=nostrill-comms,
+ post=trill-post, gate=trill-gate, feed=trill-feed
+
+/+ appjs=json-nostrill,
+ lib=nostrill,
+ trill=trill-post,
+ njs=json-nostr,
+ postlib=trill-post,
+ shim,
+ sr=sortug
+
+|_ [=state:sur =bowl:gall]
++$ card card:agent:gall
+++ debug-own-feed
+ =/ postlist (tap:orm:feed feed.state)
+ =/ lol
+ |- ?~ postlist ~
+ ~& >> poast=+.i.postlist
+ $(postlist t.postlist)
+ ~
+
+:: state
+++ add-to-feed |= p=post:post
+ =. feed.state (put:orm:feed feed.state id.p p)
+ state
+
+++ handle-post |= poke=post-poke:ui:sur
+ ^- (quip card _state)
+ =/ profile (~(get by profiles.state) [%urbit our.bowl])
+ =/ pubkey pub.i.keys.state
+ =/ p=post:post
+ ?- -.poke
+ %add
+ =/ sp (build-sp:trill our.bowl our.bowl content.poke ~ ~)
+ (build-post:trill now.bowl pubkey sp)
+ %quote
+ =/ sp (build-sp:trill our.bowl our.bowl content.poke ~ ~)
+ =/ quote [%ref %trill host.poke /(crip (scow:sr %ud id.poke))]
+ =. contents.sp (snoc contents.sp quote)
+ (build-post:trill now.bowl pubkey sp)
+ %reply
+ =/ sp (build-sp:trill host.poke our.bowl content.poke `id.poke `thread.poke)
+ (build-post:trill now.bowl pubkey sp)
+ %rp
+ =/ quote [%ref %trill host.poke /(crip (scow:sr %ud id.poke))]
+ =/ sp (build-sp:trill host.poke our.bowl '' ~ ~)
+ =. contents.sp ~[quote]
+ (build-post:trill now.bowl pubkey sp)
+ ==
+ =/ pw [p (some pubkey) ~ ~ profile]
+ =/ jfact=fact:ui:sur [%post %add pw]
+ =/ ui-card (update-ui:cards:lib jfact)
+ :: only update followers when we are updating our own feed
+ ?. .=(our.bowl host.p) [~[ui-card] state]
+ =. state (add-to-feed p)
+ =/ =fact:comms [%post %add p]
+ =/ fact-card (update-followers:cards:lib fact)
+ :_ state
+ :~ ui-card
+ fact-card
+ ==
+
+
+++ handle-post-fact |= pf=post-fact:comms
+ ^- (quip card _state)
+ =/ =user:sur [%urbit src.bowl]
+ =/ fed (~(get by following.state) user)
+ ?~ fed ~& "emmm not following ya" `state
+ =/ nf=feed:feed
+ ?: ?=(%del -.pf)
+ =< + (del:orm:feed u.fed id.pf)
+ ::mmm people aren't supposed to update if its not their own feeds
+ :: =/ =user:nsur [%urbit host.p.pdf]
+ (put:orm:feed u.fed id.p.pf p.pf)
+ =. following.state (~(put by following.state) user nf)
+ :: TODO update the ui with the changes
+ :_ state ~
+--