/- sur=nostrill, nsur=nostr, post=trill-post, gate=trill-gate, feed=trill-feed /+ appjs=json-nostrill, 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) ~ :: TODO not a mutation but fuck it ++ get-poast |= [host=@p id=@] ^- (unit post:post) =/ poast ?: .=(host our.bowl) (get:orm:feed feed.state id) ~ poast :: state ++ add-to-feed |= p=post:post =. feed.state (put:orm:feed feed.state id.p p) state :: 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] ++ handle-shim-msg |= [relay=@t msg=relay-msg:nsur] =/ rs (~(get by relays.state) relay) ?~ rs `state =^ cards state ?- -.msg %event (handle-event relay sub-id.msg event.msg) %ok (handle-ok relay +.msg) %eose =/ 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) `state %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] :: =. relays (update-relay-stats:mutat url.u.msg sub-id.u.msg) :: =^ 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) 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) 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 -- --