urbit/app/gmail.hoon

220 lines
5.5 KiB
Plaintext
Raw Normal View History

2016-02-11 21:27:32 +03:00
:: Three ways we interactg with this app
:: 1. .^(%gx /=gh=/endpoint)
:: 2. [%peer [our %gh] /endpoint]
:: 3. :gh &gh-poke %post /gists json-data
:: This is a driver for the Github API v3.
::
:: You can interact with this in a few different ways:
::
:: - .^(%gx /=gh=/read{/endpoint}) or subscribe to
:: /scry/x/read{/endpoint} for authenticated reads.
::
:: - subscribe to /scry/x/listen/{owner}/{repo}/{events...}
:: for webhook-powered event notifications. For event list,
:: see https://developer.github.com/webhooks/.
::
:: See the %github app for example usage.
::
/? 314
/- rfc, gmail-label
2016-02-11 21:27:32 +03:00
/+ http
2016-02-18 22:02:26 +03:00
::::
/= rfctext /: /%/rfc /txt/
2016-02-18 22:02:26 +03:00
::
2016-02-11 21:27:32 +03:00
// /%/split
::/- gmail
:: /ape/gh/split.hoon defines ++split, which splits a request
:: at the end of the longest possible endpoint.
::
=> |% :: => only used for indentation
++ move (pair bone card)
++ subscription-result
2016-02-19 23:33:56 +03:00
$% {$arch arch}
{$json json}
{$null $~}
2016-02-11 21:27:32 +03:00
==
++ card
2016-02-19 23:33:56 +03:00
$% {$diff subscription-result}
{$hiss wire {$~ $~} $httr {$hiss hiss}}
2016-02-11 21:27:32 +03:00
==
--
::
2016-02-19 23:33:56 +03:00
|_ {hid/bowl count/@ web-hooks/(map @t {id/@t listeners/(set bone)})}
2016-02-11 21:27:32 +03:00
:: We can't actually give the response to pretty much anything
:: without blocking, so we just block unconditionally.
::
++ peek
2016-02-19 23:33:56 +03:00
|= {ren/@tas pax/path}
^- (unit (unit (pair mark *)))
2016-02-11 21:27:32 +03:00
~
::
++ peer-scry
2016-02-19 23:33:56 +03:00
|= pax/path
^- {(list move) _+>.$}
?> ?=({care ^} pax) :: assert %u
2016-02-11 21:27:32 +03:00
=> (help i.pax i.t.pax t.t.pax)
2016-02-17 05:21:45 +03:00
=> scry
%= make-move
count +(count)
==
2016-02-11 21:27:32 +03:00
::
++ poke-gmail-req
|= $: method/meth endpoint/path quy/quay
::mes/$?(message:rfc )
label-req:gmail-label
==
2016-02-19 23:33:56 +03:00
^- {(list move) _+>.$}
2016-02-11 21:27:32 +03:00
?> ?=(valid-get-endpoint endpoint)
:_ +>.$ :_ ~
^- move
:* ost.hid %hiss /poke/[method] `~ %httr %hiss
2016-02-17 05:21:45 +03:00
^- purl
:+ [& ~ [%& /com/googleapis/www]]
2016-02-19 23:33:56 +03:00
[~ gmail+v1+users+me+`valid-get-endpoint`endpoint]
2016-02-18 22:02:26 +03:00
`quay`[[%alt %json] ~]
::
2016-02-19 23:33:56 +03:00
:+ method `math`(malt ~[content-type+['application/json']~])
::=+ hoon-json-object=(joba %raw s/(message-to-rfc822:rfc mes))
::=+ request-body=(tact (pojo hoon-json-object))
::(some request-body)
2016-02-20 01:47:09 +03:00
~
::(some (pojo label-req-to-json:gmail-label label-req:gmail-label ~)) XX
2016-02-11 21:27:32 +03:00
==
::
:: HTTP response. We make sure the response is good, then
:: produce the result (as JSON) to whoever sent the request.
::
++ sigh-httr
2016-02-19 23:33:56 +03:00
|= {wir/wire res/httr}
^- {(list move) _+>.$}
?. ?=({care @ @ @ *} wir)
2016-02-11 21:27:32 +03:00
:: pokes don't return anything
2016-02-19 23:33:56 +03:00
~& poke+res
2016-02-11 21:27:32 +03:00
[~ +>.$]
=+ arg=(path (cue (slav %uv i.t.t.wir)))
2016-02-17 05:21:45 +03:00
:_ +>.$ :_ ~
:+ ost.hid %diff
2016-02-19 23:33:56 +03:00
?+ i.wir null+~
$x
2016-02-17 05:21:45 +03:00
?~ r.res
2016-02-19 23:33:56 +03:00
json+(jobe err+s+%empty-response code+(jone p.res) ~)
2016-02-17 05:21:45 +03:00
=+ jon=(rush q.u.r.res apex:poja)
?~ jon
2016-02-19 23:33:56 +03:00
json+(jobe err+s+%bad-json code+(jone p.res) body+s+q.u.r.res ~)
2016-02-17 05:21:45 +03:00
?. =(2 (div p.res 100))
2016-02-19 23:33:56 +03:00
json+(jobe err+s+%request-rejected code+(jone p.res) msg+u.jon ~)
2016-02-17 05:21:45 +03:00
::
:: Once we know we have good data, we drill into the JSON
:: to find the specific piece of data referred to by 'arg'
::
|- ^- subscription-result
?~ arg
[%json `json`u.jon]
=+ dir=((om:jo some) u.jon)
2016-02-19 23:33:56 +03:00
?~ dir json+(jobe err+s+%no-children ~)
2016-02-17 05:21:45 +03:00
=+ new-jon=(~(get by u.dir) i.arg)
`subscription-result`$(arg t.arg, u.jon ?~(new-jon ~ u.new-jon))
:: redo with next argument
::
$y
2016-02-17 05:21:45 +03:00
?~ r.res
2016-02-19 23:33:56 +03:00
~& [err+s+%empty-response code+(jone p.res)]
arch+*arch
2016-02-17 05:21:45 +03:00
=+ jon=(rush q.u.r.res apex:poja)
?~ jon
2016-02-19 23:33:56 +03:00
~& [err+s+%bad-json code+(jone p.res) body+s+q.u.r.res]
arch+*arch
2016-02-17 05:21:45 +03:00
?. =(2 (div p.res 100))
2016-02-19 23:33:56 +03:00
~& [err+s+%request-rejected code+(jone p.res) msg+u.jon]
arch+*arch
2016-02-17 05:21:45 +03:00
::
:: Once we know we have good data, we drill into the JSON
:: to find the specific piece of data referred to by 'arg'
::
|- ^- subscription-result
=+ dir=((om:jo some) u.jon)
?~ dir
[%arch `(shax (jam u.jon)) ~]
?~ arg
[%arch `(shax (jam u.jon)) (~(run by u.dir) $~)]
2016-02-17 05:21:45 +03:00
=+ new-jon=(~(get by u.dir) i.arg)
$(arg t.arg, u.jon ?~(new-jon ~ u.new-jon))
==
2016-02-11 21:27:32 +03:00
++ sigh
2016-02-20 01:47:09 +03:00
|= a/*
~& a+a
2016-02-11 21:27:32 +03:00
:_ +>.$ ~
::
++ help
2016-02-19 23:33:56 +03:00
|= {ren/care style/@tas pax/path}
2016-02-18 22:02:26 +03:00
~& pax
=^ query pax
=+ xap=(flop pax)
?~ xap [~ ~]
=+ query=(rush i.xap ;~(pfix wut yquy:urlp))
?~ query [~ pax]
[u.query (flop t.xap)]
=^ arg pax [+ -]:(split pax)
~& [pax=pax arg=arg query=query]
=| mow/(list move)
2016-02-11 21:27:32 +03:00
|%
:: Resolve core
::
++ make-move
2016-02-19 23:33:56 +03:00
^- {(list move) _+>.$}
2016-02-18 22:02:26 +03:00
[(flop mow) +>.$]
2016-02-11 21:27:32 +03:00
::
++ endpoint-to-purl
2016-02-19 23:33:56 +03:00
|= endpoint/path
^- purl
2016-02-17 05:21:45 +03:00
%+ scan
"https://www.googleapis.com/gmail/v1/users/me{<`path`endpoint>}"
auri:epur
2016-02-11 21:27:32 +03:00
:: Send an HTTP req
++ send-http
2016-02-19 23:33:56 +03:00
|= hiz/hiss
2016-02-11 21:27:32 +03:00
^+ +>
=+ wir=`wire`[ren (scot %ud count) (scot %uv (jam arg)) style pax]
=+ new-move=[ost.hid %hiss wir `~ %httr [%hiss hiz]]
+>.$(mow [new-move mow])
::
++ scry
^+ .
?+ style ~|(%invalid-style !!)
2016-02-19 23:33:56 +03:00
$read read
:: $listen listen
2016-02-11 21:27:32 +03:00
==
:: Standard GET request
2016-02-17 05:21:45 +03:00
++ read (send-http (endpoint-to-purl pax) %get ~ ~)
2016-02-11 21:27:32 +03:00
:: Subscription request
:: ++ listen
:: ^+ .
:: =+ events=?>(?=([@ @ *] pax) t.t.pax)
:: |- ^+ +>.$
:: ?~ events
:: +>.$
:: ?: (~(has by web-hooks) i.events) :: if hook exists
:: =. +>.$ (update-hook i.events)
:: $(events t.events)
:: =. +>.$ (create-hook i.events)
:: $(events t.events)
::
--
--