summaryrefslogtreecommitdiff
path: root/desk/lib
diff options
context:
space:
mode:
Diffstat (limited to 'desk/lib')
-rw-r--r--desk/lib/constants.hoon3
-rw-r--r--desk/lib/json/common.hoon3
-rw-r--r--desk/lib/json/nostr.hoon141
-rw-r--r--desk/lib/json/nostrill.hoon (renamed from desk/lib/json/nostril.hoon)32
-rw-r--r--desk/lib/nostr.hoon24
-rw-r--r--desk/lib/nostril.hoon28
-rw-r--r--desk/lib/nostril/mutations.hoon117
-rw-r--r--desk/lib/nostrill.hoon55
-rw-r--r--desk/lib/nostrill/mutations.hoon251
-rw-r--r--desk/lib/shim.hoon112
-rw-r--r--[l---------]desk/lib/sortug.hoon147
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 ~]
+--
+--