diff options
Diffstat (limited to 'app/lib/nostr/client.hoon')
| -rw-r--r-- | app/lib/nostr/client.hoon | 91 |
1 files changed, 48 insertions, 43 deletions
diff --git a/app/lib/nostr/client.hoon b/app/lib/nostr/client.hoon index 9c732bb..259852e 100644 --- a/app/lib/nostr/client.hoon +++ b/app/lib/nostr/client.hoon @@ -1,7 +1,7 @@ /- sur=nostrill, nsur=nostr /+ js=json-nostr, sr=sortug, seq, nostr-keys, constants, server, ws=websockets /= web /web/router -|_ [=state:sur =bowl:gall] +|_ [=state:sur =bowl:gall wid=@ud relay=relay-stats:nsur] +$ card card:agent:gall ++ parse-msg @@ -10,6 +10,7 @@ ?~ body.request.req ~ =/ jstring q.u.body.request.req (parse-body jstring) + ++ parse-body |= jstring=@t =/ ures (de:json:html jstring) ?~ ures ~ @@ -18,119 +19,123 @@ ur :: __ -++ get-relay - =/ rls ~(tap by relays.state) ^- [@ud relay-stats:nsur] - ?~ rls !! - :: TODO not how this should work - =/ wid -.i.rls - =/ rs=relay-stats:nsur +.i.rls - [wid rs] - ++ close-sub |= [sub-id=@t wid=@ud relay=relay-stats:nsur] - ^- (quip card _state) + ^- (quip card _relay) =. reqs.relay (~(del by reqs.relay) sub-id) - =. relays.state (~(put by relays.state) wid relay) =/ req=client-msg:nsur [%close sub-id] - =/ rl get-relay - =/ relay +.rl - =/ url url.relay - :- :~ (send url req) == state + :- :~ (send url.relay req) == relay -++ send-req |= [fs=(list filter:nsur) ongoing=? chunked=(list filter:nsur)] - ^- (quip card _state) +++ send-req |= [fs=(list filter:nsur) ongoing=(unit ?) chunked=(list filter:nsur)] + ^- (quip card _relay) =/ sub-id (gen-sub-id:nostr-keys eny.bowl) =/ req=client-msg:nsur [%req sub-id fs] =/ es=event-stats:nsur [fs 0 ongoing chunked] - =/ rl get-relay - =/ wid -.rl - =/ relay +.rl =/ url url.relay =. reqs.relay (~(put by reqs.relay) sub-id es) - =. relays.state (~(put by relays.state) wid relay) ~& > sending-ws-req=sub-id - :- :~ (send url req) == state + :- :~ (send url req) == relay ++ get-posts - ^- (quip card _state) =/ kinds (silt ~[1]) :: =/ last-week (sub now.bowl ~d7) - =/ last-week (sub now.bowl ~m2) + =/ last-week (sub now.bowl ~m1) :: =/ since (to-unix-secs:jikan:sr last-week) =/ =filter:nsur [~ ~ `kinds ~ `last-week ~ ~] - (send-req ~[filter] .y ~) - + (send-req ~[filter] `.n ~) +:: ++ get-user-feed |= pubkey=@ux - ^- (quip card _state) =/ kinds (silt ~[1]) :: =/ since (to-unix-secs:jikan:sr last-week) =/ pubkeys (silt ~[pubkey]) =/ =filter:nsur [~ `pubkeys `kinds ~ ~ ~ ~] - (send-req ~[filter] .y ~) + (send-req ~[filter] `.n ~) + +++ get-thread |= id=@ux + =/ kinds (silt ~[1]) + =/ ids (silt :~(id)) + =/ f1=filter:nsur [`ids ~ `kinds ~ ~ ~ ~] + =/ ids=(list @t) :~((crip (scow:parsing:sr %ux id))) + =/ tag ['e' ids] + =/ tags=(map @t (list @t)) (malt :~(tag)) + =/ f2=filter:nsur [~ ~ `kinds `tags ~ ~ ~] + (send-req ~[f1 f2] `.n ~) + +++ get-post |= id=@ux + =/ kinds (silt ~[1]) + =/ ids (silt :~(id)) + =/ =filter:nsur [`ids ~ `kinds ~ ~ ~ ~] + (send-req ~[filter] ~ ~) +++ get-replies |= id=@ux + =/ kinds (silt ~[1]) + =/ ids=(list @t) :~((crip (scow:parsing:sr %ux id))) + =/ tag ['e' ids] + =/ tags=(map @t (list @t)) (malt :~(tag)) + =/ =filter:nsur [~ ~ `kinds `tags ~ ~ ~] + (send-req ~[filter] `.n ~) +:: ++ get-profile |= pubkey=@ux =/ kinds (silt ~[0]) :: =/ since (to-unix-secs:jikan:sr last-week) =/ pubkeys (silt ~[pubkey]) =/ =filter:nsur [~ `pubkeys `kinds ~ ~ ~ ~] - (send-req ~[filter] .n ~) + (send-req ~[filter] ~ ~) ++ get-profiles - ^- (quip card _state) + ~& >>> "getting profiles" =/ npoasts (tap:norm:sur nostr-feed.state) =| missing-profs=(set @ux) =/ pubkeys=(set @ux) |- ?~ npoasts missing-profs =/ poast=event:nsur +.i.npoasts =/ have (~(has by profiles.state) [%nostr pubkey.poast]) - =. missing-profs ?: have missing-profs (~(put in missing-profs) pubkey.poast) + =? missing-profs !have (~(put in missing-profs) pubkey.poast) $(npoasts t.npoasts) =/ kinds (silt ~[0]) =/ chunk-size 300 + ~& >> fetching-profiles=~(wyt in pubkeys) ?. (gth ~(wyt in pubkeys) chunk-size) =/ =filter:nsur [~ `pubkeys `kinds ~ ~ ~ ~] - (send-req ~[filter] .n ~) + (send-req ~[filter] ~ ~) :: =/ chunks=(list (list @ux)) (chunk-by-size:seq ~(tap in pubkeys) chunk-size) - ?~ chunks ~& >>> "error chunking pubkeys" `state + ?~ chunks ~& >>> "error chunking pubkeys" `relay =/ queue=(list filter:nsur) %+ turn t.chunks |= l=(list @ux) ^- filter:nsur =/ pubkeys=(set @ux) (silt l) [~ `pubkeys `kinds ~ ~ ~ ~] =/ pubkeys=(set @ux) (silt i.chunks) =/ =filter:nsur [~ `pubkeys `kinds ~ ~ ~ ~] - (send-req ~[filter] .n queue) + (send-req ~[filter] ~ queue) ++ get-engagement |= post-ids=(set @ux) - ^- (quip card _state) - =/ post-strings %- ~(run in post-ids) |= id=@ux (crip (scow:sr %ux id)) + =/ post-strings %+ turn ~(tap in post-ids) |= id=@ux (crip (scow:sr %ux id)) =/ =filter:nsur =/ kinds (silt ~[6 7]) =/ tags (malt :~([%e post-strings])) [~ ~ `kinds `tags ~ ~ ~] - (send-req ~[filter] .y ~) + (send-req ~[filter] `.n ~) ++ get-quotes |= post-id=@ux - ^- (quip card _state) =/ post-string (crip (scow:sr %ux post-id)) =/ kinds (silt ~[1]) - =/ tags (malt :~([%q (silt ~[post-string])])) + =/ tags (malt :~([%q ~[post-string]])) =/ =filter:nsur [~ ~ `kinds `tags ~ ~ ~] - (send-req ~[filter] .y ~) + (send-req ~[filter] `.n ~) :: ++ test-connection - |= relay-url=@t =/ kinds (silt ~[1]) =/ since (sub now.bowl ~m10) =/ =filter:nsur [~ ~ `kinds ~ `since ~ ~] =/ sub-id (gen-sub-id:nostr-keys eny.bowl) =/ req=client-msg:nsur [%req sub-id ~[filter]] - :- :~ (send relay-url req) == state + :- :~ (send url.relay req) == relay ++ send |= [relay-url=@t req=client-msg:nsur] ^- card @@ -138,10 +143,10 @@ =/ req-body=json (req:en:js req) =/ octs (json-to-octs:server req-body) =/ wmsg=websocket-message:eyre [1 `octs] - ~& >> sup=sup.bowl =/ conn (check-connected:ws relay-url bowl) ~& >>> send-client-conn=conn ?~ conn :: if no ws connection we start a thread which will connect first, then send the message + ~& >>> "no connection!!" !! :: =/ =task:iris [%websocket-connect dap.bowl relay-url] :: [%pass /ws-req/nostrill %arvo %i task] |
