diff options
Diffstat (limited to 'desk/lib')
-rw-r--r-- | desk/lib/constants.hoon | 3 | ||||
-rw-r--r-- | desk/lib/json/common.hoon | 3 | ||||
-rw-r--r-- | desk/lib/json/nostr.hoon | 141 | ||||
-rw-r--r-- | desk/lib/json/nostrill.hoon (renamed from desk/lib/json/nostril.hoon) | 32 | ||||
-rw-r--r-- | desk/lib/nostr.hoon | 24 | ||||
-rw-r--r-- | desk/lib/nostril.hoon | 28 | ||||
-rw-r--r-- | desk/lib/nostril/mutations.hoon | 117 | ||||
-rw-r--r-- | desk/lib/nostrill.hoon | 55 | ||||
-rw-r--r-- | desk/lib/nostrill/mutations.hoon | 251 | ||||
-rw-r--r-- | desk/lib/shim.hoon | 112 | ||||
-rw-r--r--[l---------] | desk/lib/sortug.hoon | 147 |
11 files changed, 711 insertions, 202 deletions
diff --git a/desk/lib/constants.hoon b/desk/lib/constants.hoon new file mode 100644 index 0000000..c7f72b7 --- /dev/null +++ b/desk/lib/constants.hoon @@ -0,0 +1,3 @@ +|% +++ http-delay 3.000 +-- diff --git a/desk/lib/json/common.hoon b/desk/lib/json/common.hoon index 64d4b03..0ed54cd 100644 --- a/desk/lib/json/common.hoon +++ b/desk/lib/json/common.hoon @@ -5,7 +5,8 @@ |% ++ cord |= s=@t ^- json s+s ++ hex |= h=@ux ^- json - [%s (crip (scow:sr %ux h))] + =/ scoww scow:sr + [%s (crip (scoww(min-chars 64) %ux h))] ++ b64 |= h=@uv ^- json [%s (crip (scow:sr %uv h))] ++ ud |= n=@ ^- json diff --git a/desk/lib/json/nostr.hoon b/desk/lib/json/nostr.hoon index aa5952a..9c36eb0 100644 --- a/desk/lib/json/nostr.hoon +++ b/desk/lib/json/nostr.hoon @@ -2,29 +2,39 @@ /+ common=json-common, sr=sortug |% ++ en -=, enjs:format +=, enjs:format |% :: shim comms - ++ req |= =req:shim:sur ^- json - %+ frond -.req - ?- -.req - %get (get +.req) - %post (post +.req) - == - ++ get |= rs=get:shim:sur - :- %a %+ turn rs |= [r=@t fs=(list filter:sur)] + ++ bulk-req |= [relays=(list @t) r=req:shim:sur] ^- json + %+ frond %ws %: pairs - relay+s+r - filters+a+(turn fs filter) + relays+a+(turn relays cord:en:common) + req+(req r) ~ == - :: - ++ post |= p=post:shim:sur + ++ http-req |= [relay=@t delay=@ud sub-id=@t fs=(list filter:sur)] + %+ frond %http %: pairs - event+(event event.p) - relays+a+(turn relays.p cord:en:common) - ~ + relay+s+relay + delay+(numb delay) + ['subscription_id' %s sub-id] + filters+a+(turn fs filter) + ~ == + ++ req |= =req:shim:sur ^- json + :- %a :- s+(crip (cuss (trip -.req))) + ?- -.req + %req (enreq +.req) + %event :_ ~ (event +.req) + %auth :_ ~ (event +.req) + %close :_ ~ [%s +.req] + == +++ enreq + |= [sub-id=@t fs=(list filter:sur)] + ^- (list json) + :- [%s sub-id] + %+ turn fs filter + :: ++ raw-event |= raw-event:sur :: WTF nostr doesn't want the prefix on the pubkey @@ -64,33 +74,82 @@ ++ filter |= f=filter:sur ^- json =| l=(list [key=@t jon=json]) - =. l ?~ ids.f l :_ l ['ids' [%a (turn ids.f hex:en:common)]] - =. l ?~ authors.f l :_ l ['authors' [%a (turn authors.f hex:en:common)]] - =. l ?~ kinds.f l :_ l ['kinds' [%a (turn kinds.f numb)]] - =. l ?~ since.f l :_ l ['since' (numb u.since.f)] - =. l ?~ until.f l :_ l ['until' (numb u.until.f)] + =. l ?~ ids.f l :_ l ['ids' %a (turn ~(tap in u.ids.f) hex:en:common)] + =. l ?~ authors.f l :_ l ['authors' %a (turn ~(tap in u.authors.f) hex:en:common)] + =. l ?~ kinds.f l :_ l ['kinds' %a (turn ~(tap in u.kinds.f) numb)] + =. l ?~ tags.f l %+ weld l (tags u.tags.f) + + =. l ?~ since.f l :_ l ['since' (sect u.since.f)] + =. l ?~ until.f l :_ l ['until' (sect u.until.f)] =. l ?~ limit.f l :_ l ['limit' (numb u.limit.f)] + :: %- pairs l + + + ++ tags + |= tm=(map @t (set @t)) ^- (list [@t json]) :: entries to the filter obeject + %+ turn ~(tap by tm) |= [key=@t values=(set @t)] + =/ nkey (cat 3 '#' key) + [nkey %a (turn ~(tap in values) cord:en:common)] + ++ user-meta |= meta=user-meta:sur - =/ other %+ turn ~(tap by other.meta) |= [key=@t val=@t] - [key %s val] %: pairs name+s+name.meta picture+s+picture.meta about+s+about.meta - other + other+o+other.meta + ~ == -- ++ de =, dejs-soft:format |% :: shim + ++ shim-res + %- of :~ + http+(ar relay-msg) + ws+msg + == ++ msg %- ot :~ relay+so + msg+relay-msg + == + ++ relay-msg + %- of :~ + event+event-sub + ok+relay-ok + eose+so + closed+closed + notice+so + error+so + == + + + :: | { event: { subscription_id: string; event: NostrEvent } } + :: | { ok: { event_id: string; accepted: boolean; message: string } } + :: | { eose: string } + :: | { closed: { subscription_id: string; message: string } } + :: | { notice: string } + :: // this is ours + :: | { error: string }; + ++ event-sub + %- ot :~ + ['subscription_id' so] event+event == + ++ relay-ok + %- ot :~ + ['event_id' hex:de:common] + accepted+bo + message+so + == + ++ closed + %- ot :~ + ['subscription_id' so] + message+so + == ++ event %- ot :~ id+hex:de:common @@ -103,14 +162,30 @@ == ++ user-meta |= jon=json ^- (unit user-meta:sur) - =/ all ((om so) jon) - ?~ all ~ - =/ base=(unit [name=@t about=@t picture=@t]) %. jon %- ot :~ - name+so - about+so - picture+so - == - ?~ base ~ - `[name.u.base about.u.base picture.u.base u.all] + ?. ?=(%o -.jon) ~ + =| um=user-meta:sur + =/ fields ~(tap by p.jon) + |- ?~ fields (some um) + =/ k -.i.fields + =/ jn=json +.i.fields + ?+ k + =/ ot (~(put by other.um) k jn) + =. um um(other ot) $(fields t.fields) + %'name' + =/ crd (so jn) + ?~ crd $(fields t.fields) $(fields t.fields, um um(name u.crd)) + %'display_name' + =/ crd (so jn) + ?~ crd $(fields t.fields) $(fields t.fields, um um(name u.crd)) + %'displayName' + =/ crd (so jn) + ?~ crd $(fields t.fields) $(fields t.fields, um um(name u.crd)) + %'about' + =/ crd (so jn) + ?~ crd $(fields t.fields) $(fields t.fields, um um(picture u.crd)) + %'picture' + =/ crd (so jn) + ?~ crd $(fields t.fields) $(fields t.fields, um um(picture u.crd)) + == -- -- diff --git a/desk/lib/json/nostril.hoon b/desk/lib/json/nostrill.hoon index 16792a9..43f7708 100644 --- a/desk/lib/json/nostril.hoon +++ b/desk/lib/json/nostrill.hoon @@ -1,4 +1,4 @@ -/- sur=nostril, nsur=nostr, feed=trill-feed +/- sur=nostrill, nsur=nostr, feed=trill-feed /+ sr=sortug, common=json-common, trill=json-trill, nostr=json-nostr |% ++ en @@ -8,18 +8,33 @@ ++ state |= state-0:sur ^- json %: pairs relays+(en-relays relays) - keys+a+(turn ~(tap in ~(key by keys)) hex:en:common) + key+(hex:en:common pub.i.keys) profiles+(en-profiles profiles) + :: TODO proper cursors feed+(feed-with-cursor:en:trill feed ~ ~) + nostr+(en-nostr-feed nostr-feed) following+(enfollowing following) ['followGraph' (engraph follow-graph)] ~ == + ++ en-nostr-feed + |= feed=nostr-feed:sur ^- json + :- %a %+ turn (tap:norm:sur feed) |= [id=@ud ev=event:nsur] + (event:en:nostr ev) + ++ en-relays - |= r=(map @t (list event:nsur)) ^- json + |= r=(map @t relay-stats:nsur) ^- json %- pairs %+ turn ~(tap by r) - |= [url=@t events=(list event:nsur)] - :- url :- %a %+ turn events event:en:nostr + |= [url=@t rs=relay-stats:nsur] + :- url %- pairs + :~ :- %connected ?~ connected.rs ~ (time u.connected.rs) + :- %reqs (relay-stats reqs.rs) + == + ++ relay-stats |= rm=(map @t event-stats:nsur) + %- pairs %+ turn ~(tap by rm) |= [sub-id=@t es=event-stats:nsur] + :: TODO do we even need this + :- sub-id (numb received.es) + ++ en-profiles |= m=(map @ux user-meta:nsur) %- pairs %+ turn ~(tap by m) |= [key=@ux p=user-meta:nsur] @@ -51,9 +66,9 @@ :: ui ++ ui %- of :~ + keys+ul fols+ui-fols prof+ui-prof - keys+ui-keys post+ui-post rela+ui-relay == @@ -71,11 +86,6 @@ pubkey+hex:de:common meta+user-meta:de:nostr == -++ ui-keys - %- of :~ - add+ul - del+hex:de:common - == ++ ui-post %- of :~ add+de-post diff --git a/desk/lib/nostr.hoon b/desk/lib/nostr.hoon index c05b0eb..90eb563 100644 --- a/desk/lib/nostr.hoon +++ b/desk/lib/nostr.hoon @@ -1,6 +1,8 @@ /- sur=nostr -/+ js=json-nostr +/+ js=json-nostr, sr=sortug |% +++ gen-sub-id |= eny=@ ^- @t + %- crip (scag 60 (scow:sr %uw eny)) ++ gen-keys |= eny=@ ^- keys:sur =, secp256k1:secp:crypto =/ privkey @@ -26,4 +28,24 @@ ++ sign-event |= [priv=@ux hash=@ux eny=@] =^ sed eny (raws eny 256) (sign:schnorr:secp256k1:secp:crypto priv hash sed) + + +:: +++ validate-pubkey |= pubkey=@ux ^- ? + =/ tap (scow:sr %ux pubkey) + .= (lent tap) 64 +:: +++ diff-filters +|= [a=filter:sur b=filter:sur] ^- filter:sur + =/ ids (unit-set-dif ids.a ids.b) + =/ authors (unit-set-dif authors.a authors.b) + =/ kinds (unit-set-dif kinds.a kinds.b) + =/ tags ~ + =/ since ~ + =/ until ~ + =/ limit ~ :: TODO + [ids authors kinds tags since until limit] +++ unit-set-dif + |* [a=(unit) b=(unit)] + %^ clap a b |* [x=(set) y=(set)] (~(dif in x) y) -- diff --git a/desk/lib/nostril.hoon b/desk/lib/nostril.hoon deleted file mode 100644 index 48d4eb7..0000000 --- a/desk/lib/nostril.hoon +++ /dev/null @@ -1,28 +0,0 @@ -/- post=trill-post, nsur=nostr -/+ trill=trill-post, nostr, sr=sortug -|% -:: -++ post-to-event |= [=keys:nsur eny=@ p=post:post] ^- event:nsur - =/ cl (latest-post-content:trill contents.p) - =/ string (crip (content-list-to-md:trill cl)) - =/ ts (to-unix-secs:jikan:sr id.p) - =/ raw=raw-event:nsur [pub.keys ts 1 ~ string] - =/ event-id (hash-event:nostr raw) - =/ signature (sign-event:nostr priv.keys event-id eny) - ~& hash-and-signed=[event-id signature] - =/ =event:nsur :* - event-id - pub.keys - created-at.raw - kind.raw - tags.raw - content.raw - signature - == - event -++ cards -|_ =bowl:gall - ++ shim-binding ^- card:agent:gall - [%pass /binding %arvo %e %connect [~ /nostr-shim] dap.bowl] - -- --- diff --git a/desk/lib/nostril/mutations.hoon b/desk/lib/nostril/mutations.hoon deleted file mode 100644 index f7de23b..0000000 --- a/desk/lib/nostril/mutations.hoon +++ /dev/null @@ -1,117 +0,0 @@ -/- sur=nostril, nsur=nostr, - post=trill-post, gate=trill-gate, feed=trill-feed - -/+ appjs=json-nostril, - njs=json-nostr, - postlib=nostril-post, - sr=sortug - -|_ [=state:sur =bowl: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 - -++ event-parsing - |= =event:nsur - ^- (quip card _state) - |^ -:: https://nostrdata.github.io/kinds/ - ?: .=(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 !! - =/ umeta (user-meta:de:njs u.ujon) - ?~ umeta `state - =. profiles.state (~(put by profiles.state) pubkey.event u.umeta) - `state - - - ++ parse-poast - ^- (quip card _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) - -- --- diff --git a/desk/lib/nostrill.hoon b/desk/lib/nostrill.hoon new file mode 100644 index 0000000..c7e940c --- /dev/null +++ b/desk/lib/nostrill.hoon @@ -0,0 +1,55 @@ +/- post=trill-post, nsur=nostr, sur=nostrill +/+ trill=trill-post, nostr, sr=sortug +|% +:: +++ default-state |= =bowl:gall ^- state:sur + =/ s *state-0:sur + =/ l public-relays:nsur + =/ l (scag 1 l) + :: =/ l ~['wss://relay.damus.io' 'wss://nos.lol'] + =/ rl %+ turn l |= t=@t [t *relay-stats:nsur] + :: =/ l ~[['wss://relay.damus.io' ~]] + =/ key (gen-keys:nostr eny.bowl) + =/ keyl [key ~] + s(relays (malt rl), keys keyl) + +++ print-relay-stats + |= rm=(map @t relay-stats:nsur) + =/ l ~(tap by rm) + |- ?~ l ~ + =/ [url=@t rs=relay-stats:nsur] i.l + ~& relay=url + ~& connected=connected.rs + ~& sub-count=~(wyt by reqs.rs) + =/ total-received + %+ roll ~(tap by reqs.rs) + |= [[* es=event-stats:nsur] acc=@ud] + %+ add acc received.es + ~& >> total=total-received + $(l t.l) + +:: +++ post-to-event |= [=keys:nsur eny=@ p=post:post] ^- event:nsur + =/ cl (latest-post-content:trill contents.p) + =/ string (crip (content-list-to-md:trill cl)) + =/ ts (to-unix-secs:jikan:sr id.p) + =/ raw=raw-event:nsur [pub.keys ts 1 ~ string] + =/ event-id (hash-event:nostr raw) + =/ signature (sign-event:nostr priv.keys event-id eny) + ~& hash-and-signed=[event-id signature] + =/ =event:nsur :* + event-id + pub.keys + created-at.raw + kind.raw + tags.raw + content.raw + signature + == + event +++ cards +|_ =bowl:gall + ++ shim-binding ^- card:agent:gall + [%pass /binding %arvo %e %connect [~ /nostr-shim] dap.bowl] + -- +-- diff --git a/desk/lib/nostrill/mutations.hoon b/desk/lib/nostrill/mutations.hoon new file mode 100644 index 0000000..4dda095 --- /dev/null +++ b/desk/lib/nostrill/mutations.hoon @@ -0,0 +1,251 @@ +/- 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] + +++ populate-profiles + |= pubkeys=(set @ux) + ^- (quip card _state) + =/ shimm ~(. shim [state bowl]) + =^ cards state (get-profiles-http:shimm pubkeys) + [cards state] + + + + +:: ++ handle-shim-msg |= msg=res:shim:nsur +:: ^- (quip card _state) +:: ?- -.msg +:: %ws (handle-ws +.msg) +:: %http (handle-http +.msg) +:: == + +++ 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 `state + =^ cards state + ?- -.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) + `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] + + + :: =^ 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 + -- +-- diff --git a/desk/lib/shim.hoon b/desk/lib/shim.hoon index be95b70..4afdf2b 100644 --- a/desk/lib/shim.hoon +++ b/desk/lib/shim.hoon @@ -1,23 +1,115 @@ -/- sur=nostr -/+ js=json-nostr +/- sur=nostrill, nsur=nostr +/+ js=json-nostr, sr=sortug, nlib=nostr, constants /= web /web/router -|% +|_ [=state:sur =bowl:gall] -++ handle ++$ card card:agent:gall +++ parse-msg |= [eyre-id=@ta req=inbound-request:eyre] - ^- (unit [url=@ event=event:sur]) + ^- (unit res:shim:nsur) ?~ body.request.req ~ =/ jstring q.u.body.request.req + (parse-body jstring) +++ parse-body |= jstring=@t =/ ures (de:json:html jstring) ?~ ures ~ - (msg:de:js u.ures) + (shim-res:de:js u.ures) +:: __ +++ get-req |= fs=(list filter:nsur) + ^- [bulk-req:shim:nsur _state] + =/ rls ~(tap by relays.state) + =| urls=(list @t) + =/ sub-id (gen-sub-id:nlib eny.bowl) + =/ =req:shim:nsur [%req sub-id fs] + |- ?~ rls [[urls req] state] + :: build http card + =/ [url=@t rs=relay-stats:nsur] i.rls + :: mutate relays stats + =/ es=event-stats:nsur [fs 0] + =/ nreqs (~(put by reqs.rs) sub-id es) + =/ nrs rs(reqs nreqs) + =. relays.state (~(put by relays.state) url nrs) + $(urls [url urls], rls t.rls) + +++ get-posts + ^- (quip card _state) + =/ kinds (silt ~[1]) + =/ last-week (sub now.bowl ~d7) + :: =/ since (to-unix-secs:jikan:sr last-week) + =/ =filter:nsur [~ ~ `kinds ~ `last-week ~ ~] + =^ req=bulk-req:shim:nsur state (get-req ~[filter]) + :- :~((send req)) state + +++ get-profiles + |= pubkeys=(set @ux) + ^- (quip card _state) + =/ kinds (silt ~[0]) + =/ =filter:nsur [~ `pubkeys `kinds ~ ~ ~ ~] + =^ req=bulk-req:shim:nsur state (get-req ~[filter]) + :- :~((send req)) state + +++ get-engagement + |= post-ids=(set @ux) + ^- (quip card _state) + =/ post-strings %- ~(run in post-ids) |= id=@ux (crip (scow:sr %ux id)) + =/ =filter:nsur + =/ kinds (silt ~[6 7]) + =/ tags (malt :~([%e post-strings])) + [~ ~ `kinds `tags ~ ~ ~] + =^ req state (get-req ~[filter]) + :- :~((send req)) state + +++ 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])])) + =/ =filter:nsur [~ ~ `kinds `tags ~ ~ ~] + =^ req state (get-req ~[filter]) + :- :~((send req)) state + + ++ send - |= [desk=@tas =req:shim:sur] ^- card:agent:gall - =/ req-body (req:en:js req) + |= req=bulk-req:shim:nsur ^- card:agent:gall + =/ req-body (bulk-req:en:js req) + :: ~& shim-req-json=(en:json:html req-body) =/ headers :~ [key='content-type' value='application/json'] == - =/ =request:http [%'POST' url:shim:sur headers `(json-body:web req-body)] + =/ =request:http [%'POST' url:shim:nsur headers `(json-body:web req-body)] =/ pat /shim - [%pass (weld /ws pat) %arvo %k %fard desk %fetch %noun !>(request)] + [%pass (weld /ws pat) %arvo %k %fard dap.bowl %fetch %noun !>(request)] + +++ send-http + |= req=http-req:shim:nsur + ^- card:agent:gall + =/ req-body (http-req:en:js req) + :: ~& shim-req-json=(en:json:html req-body) + =/ headers :~ + [key='content-type' value='application/json'] + == + =/ =request:http [%'POST' url:shim:nsur headers `(json-body:web req-body)] + [%pass /http/[sub-id.req] %arvo %k %fard dap.bowl %fetch %noun !>(request)] +:: +:: HTTP +:: + +++ get-profiles-http + |= pubkeys=(set @ux) + ^- (quip card _state) + =/ relays ~(key by relays.state) + :: TODO make a function to use most reliable + =/ relay (head ~(tap in relays)) + ~& http=relay + =/ sub-id (gen-sub-id:nlib eny.bowl) + =/ kinds (silt ~[0]) + =/ total=filter:nsur [~ `pubkeys `kinds ~ ~ ~ ~] + =/ chunk (silt (scag 10 ~(tap in pubkeys))) + =/ =filter:nsur [~ `chunk `kinds ~ ~ ~ ~] + =. pending.state (~(put by pending.state) sub-id [total *filter:nsur]) + =/ req=http-req:shim:nsur [relay http-delay:constants sub-id ~[total]] + =/ =card (send-http req) + :- :~(card) state + -- diff --git a/desk/lib/sortug.hoon b/desk/lib/sortug.hoon index dad4203..eec99ae 120000..100644 --- a/desk/lib/sortug.hoon +++ b/desk/lib/sortug.hoon @@ -1 +1,146 @@ -/home/y/code/urbit/sortug/lib/sortug.hoon
\ No newline at end of file +:: Painstakingly built utility functions by Sortug Development Ltd. +:: There's more where it came from +|% +++ jikan +|% +++ from-unix |= ts=@ ^- @da + (from-unix:chrono:userlib ts) +++ to-unix-ms |= da=@da ^- @ud + (unm:chrono:userlib da) +++ to-unix-secs |= da=@da ^- @ud + (unt:chrono:userlib da) +-- +++ b64 (bass 64 (plus siw:ab)) +++ b16 (bass 16 (plus six:ab)) +++ scow +=| min-chars=@ud +|= [mod=@tas a=@] ^- tape + ?+ mod "" + %s (signed-scow a) + %ud (a-co:co a) + %ux ((x-co:co min-chars) a) + %uv ((v-co:co min-chars) a) + %uw ((w-co:co min-chars) a) + == +++ signed-scow |= a=@s ^- tape + =/ old (old:si a) + =/ num (scow %ud +.old) + =/ sign=tape ?: -.old "" "-" + "{sign}{num}" +++ slaw + |= [mod=@tas txt=@t] ^- (unit @) + ?+ mod ~ + %ud (rush txt dem) + %ux (rush txt b16) + %uv (rush txt vum:ag) + %uw (rush txt b64) + == +++ csplit |* =rule + (more rule (cook crip (star ;~(less rule next)))) +:: List utils +++ foldi + |* [a=(list) b=* c=_|=(^ +<+)] + =| i=@ud + |- ^+ b + ?~ a b + =/ nb (c i i.a b) + $(a t.a, b nb, i +(i)) +++ parsing + |% + ++ link auri:de-purl:html + ++ para + |% + ++ eof ;~(less next (easy ~)) + ++ white (mask "\09 ") + ++ blank ;~(plug (star white) (just '\0a')) + ++ hard-wrap (cold ' ' ;~(plug blank (star white))) + ++ one-space (cold ' ' (plus white)) + ++ empty + ;~ pose + ;~(plug blank (plus blank)) + ;~(plug (star white) eof) + ;~(plug blank (star white) eof) + == + ++ para + %+ ifix + [(star white) empty] + %- plus + ;~ less + empty + next + == + -- + ++ trim para:para :: from whom/lib/docu + ++ youtube + ;~ pfix + ;~ plug + (jest 'https://') + ;~ pose + (jest 'www.youtube.com/watch?v=') + (jest 'youtube.com/watch?v=') + (jest 'youtu.be/') + == + == + ;~ sfix + (star aln) + (star next) + == + == + ++ twatter + ;~ pfix + ;~ plug + (jest 'https://') + ;~ pose + (jest 'x.com/') + (jest 'twitter.com/') + == + (star ;~(less fas next)) + (jest '/status/') + == + ;~ sfix + (star nud) + (star next) + == + == + ++ img-set + %- silt + :~ ~.webp + ~.png + ~.jpeg + ~.jpg + ~.svg + == + ++ is-img + |= t=@ta + (~(has in img-set) t) + ++ is-image + |= url=@t ^- ? + =/ u=(unit purl:eyre) (de-purl:html url) + ?~ u .n + =/ ext p.q.u.u + ?~ ext .n + (~(has in img-set) u.ext) + -- +++ string +|% +++ replace + |= [bit=tape bot=tape =tape] + ^- ^tape + |- + =/ off (find bit tape) + ?~ off tape + =/ clr (oust [(need off) (lent bit)] tape) + $(tape :(weld (scag (need off) clr) bot (slag (need off) clr))) + :: +++ split + |= [str=tape delim=tape] + ^- (list tape) + (split-rule str (jest (crip delim))) + ++ split-rule + |* [str=tape delim=rule] + ^- (list tape) + %+ fall + (rust str (more delim (star ;~(less delim next)))) + [str ~] +-- +-- |