summaryrefslogtreecommitdiff
path: root/app/lib/nostr/client.hoon
blob: f0d12a2ebcdf71eb7e7c7c47b4b25aece8be3591 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
/-  sur=nostrill, nsur=nostr
/+  js=json-nostr, sr=sortug, nostr-keys, constants, server, ws=websockets
/=  web  /web/router
|_  [=state:sur =bowl:gall]

+$  card  card:agent:gall
++  parse-msg
  |=  [eyre-id=@ta req=inbound-request:eyre]
  ^-  (unit relay-msg:nsur)
  ?~  body.request.req  ~
  =/  jstring  q.u.body.request.req
  (parse-body jstring)
++  parse-body  |=  jstring=@t
  =/  ures  (de:json:html jstring)
  ?~  ures  ~
  =/  ur  (relay-msg:de:js u.ures)
  ?~  ur  ~&  >>>  relay-msg-parsing-failed=jstring  ~
  ur
:: __

:: ++  get-req  |=  fs=(list filter:nsur)
::     ^-  [bulk-req:shim:nsur _state]
::     =/  rls  ~(tap by relays.state)
::     =|  urls=(list @t)
::     =/  sub-id  (gen-sub-id:nostr-keys eny.bowl)
::     =/  req=client-msg:nsur  [%req sub-id fs]
::     |-  ?~  rls  [[urls req] state]
::       ::  build http card
::       =/  [url=@t rs=relay-stats:nsur]  i.rls
::       ::  mutate relays stats
::       =/  nrs  rs(reqs nreqs)
::       =.  relays.state  (~(put by relays.state) url nrs)
::       $(urls [url urls], rls t.rls)

++  send-req  |=  fs=(list filter:nsur)
    ^-  (quip card _state)
    =/  sub-id  (gen-sub-id:nostr-keys eny.bowl)
    =/  req=client-msg:nsur  [%req sub-id fs]
    =/  rls  ~(tap by relays.state)
    ?~  rls  !!
    :: TODO not how this should work
    =/  rs=relay-stats:nsur  +.i.rls
    =/  wid  -.i.rls
    =/  url  url.rs
    =/  es=event-stats:nsur  [fs 0]  
    =.  reqs.rs  (~(put by reqs.rs) sub-id es)
    =.  relays.state  (~(put by relays.state) wid rs)
    ~&  >  sending-ws-req=sub-id
    :-  :~  (send url req)  ==  state


++  get-posts
  ^-  (quip card _state)
  =/  kinds  (silt ~[1])
  :: =/  last-week  (sub now.bowl ~d7)
  =/  last-week  (sub now.bowl ~m2)
  :: =/  since  (to-unix-secs:jikan:sr last-week)
  =/  =filter:nsur  [~ ~ `kinds ~ `last-week ~ ~]
  (send-req ~[filter])

++  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])

++  get-profiles
  |=  pubkeys=(set @ux)
    ^-  (quip card _state)
    =/  kinds  (silt ~[0])
    =/  =filter:nsur  [~ `pubkeys `kinds ~ ~ ~ ~]
  (send-req ~[filter])

++  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 ~ ~ ~]
  (send-req ~[filter])

++  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 ~ ~ ~]
  (send-req ~[filter])

::
++  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
  |=  [relay-url=@t req=client-msg:nsur]  ^-  card:agent:gall
    ~&  >>>  sendws=relay-url
    =/  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
    !!
    :: =/  =task:iris  [%websocket-connect dap.bowl relay-url]
    :: [%pass /ws-req/nostrill %arvo %i task]
    ::
    (give-ws-payload-client:ws wid.u.conn wmsg)
--