Merge branch 'passcode-code', remote-tracking branches 'galenwp/clean', 'ohaitch/mo-not-running' and 'ohaitch/mar-twitter-request'

Move eyre auth code to +code
Remove nonexistent vane stubs
Add a printf somewhere
Twitter auth and requests
This commit is contained in:
Raymond Pasco 2016-03-14 19:43:32 -04:00
33 changed files with 1139 additions and 463 deletions

View File

@ -4,9 +4,11 @@
/? 310
!:
|_ {{^ ^ ost/@ ^} $~}
++ poke |*(a/{mark *} :_(+> [ost %hiss / %wain a]~))
++ poke |*(a/{mark *} :_(+> [ost %hiss / `~ %wain a]~))
::++ poke-purl |=(a/purl :_(+> [ost %hiss / %wain %purl a]~))
++ poke-noun |=(a/tape (poke %purl (scan a auri:epur)))
++ poke-tape |=(a/tape (poke %purl (scan a auri:epur)))
++ poke-hiss |=(a/hiss (poke %hiss a))
++ poke-noun poke-hiss
++ sigh-wain |=({* a/wain} ~&(a `+>))
++ sigh-tang |=({* a/tang} (mean a))
--

View File

@ -3,7 +3,7 @@
:: :: ::
/? 310
/- talk, sole
/+ talk, sole, time-to-id
/+ talk, sole, time-to-id, twitter
/= seed /~ !>(.)
::
::::

220
app/twit.hoon Normal file
View File

@ -0,0 +1,220 @@
:: Twitter daemon
::
:::: /hook/core/twit/app
::
/+ twitter, talk
::
:::: ~fyr
::
|%
++ twit-path :: valid peer path
$% :: [%home ~] :: home timeline
[%user p=@t ~] :: user's tweets
[%post p=span:,@uv ~] :: status of status
==
::
++ axle :: app state
$: %0
kes=(map span keys:twittter) :: auth
out=(map ,@uvI (each ,[span cord] stat)) :: sent tweets
ran=(map path ,[p=@ud q=@da]) :: polls active
fed=(jar path stat) :: feed cache
==
::
++ gift :: subscription action
$% [%quit ~] :: terminate
[%diff gilt] :: send data
==
++ gilt
$% [%twit-feed p=(list stat)] :: posts in feed
[%twit-stat p=stat] :: tweet accepted
[%ares term (list tank)]
==
::
++ move ,[bone card]
++ card :: arvo request
$? gift
$% [%them path ~ u=hiss] :: HTTP request
[%poke wire dock %talk-command command:talk] ::
[%wait path p=@da] :: timeout
== ==
::
++ sign :: arvo response
$% [%e %thou p=httr] :: HTTP result
[%t %wake ~] :: timeout ping
==
::
++ stat stat:twitter :: recieved tweet
++ twit main:twitter :: api interface
++ twir parse:twitter :: reparsers
++ twip render:twitter :: printers
--
!:
::::
::
|_ [bowl axle]
++ any-auth ?~(kes (auth) (auth p.n.kes)) :: use any keys
++ auth :: build API door
|= a=span
~| [%no-auth a]
~(. twit (~(got by kes) a) now `@`eny)
::
++ cull :: remove seen tweets
|= [pax=path rep=(list stat)] ^+ rep
=+ pev=(sa (turn (~(get ja fed) pax) |=(stat id)))
(skip rep |=(stat (~(has in pev) id)))
::
++ done [*(list move) .]
++ dely :: next polling timeout
|= pax=path
^- [(unit time) _ran]
=+ cur=(~(get by ran) pax)
=+ tym=(add now (mul ~s8 (bex ?~(cur 0 p.u.cur))))
:: ~& dely/`@dr`(sub tym now)
?: &(?=(^ cur) (gte tym q.u.cur) (gth q.u.cur now))
[~ ran]
[`tym (~(put by ran) pax ?~(cur 0 (min 5 +(p.u.cur))) tym)]
::
++ wait :: ensure poll by path
|= [pax=path mof=(list move)]
=^ tym ran (dely pax)
:_ +>.$
?~ tym
:: ~& no-wait/ran
mof
:: ~& will-wait/u.tym
:- [ost %wait pax u.tym]
mof
::
++ poke-twit-do :: recieve request
|= [usr=span act=command:twitter]
^+ [*(list move) +>]
?- -.act
%auth
:- [(print "authed @{(trip usr)}")]~
+>.$(kes (~(put by kes) usr p.act)) :: XX verify key
%post
=: out (~(put by out) p.act %& usr q.act)
ran (~(del by ran) /peer/home)
==
%+ wait /peer/home
=+ mez=(stat-upda:(auth usr) [%status q.act]~ ~)
[ost %them /post/(scot %uv p.act) ~ mez]~
==
::
++ wake-peer
|= [pax=path ~] ^+ done
~& twit-wake/peer/pax
:_ +>.$
?. (~(has by ran) peer/pax) :: ignore if retracted
~
=+ => |=([a=bone @ b=path] [b a])
pus=(~(gas ju *(jug path bone)) (turn (~(tap by sup)) .))
?~ (~(get ju pus) pax)
~
~& peer-again/[pax ran]
(pear | our pax)
::
++ thou
|= [pax=path hit=httr] ^+ done
?+ p.hit ~|([%unknown-code p.hit] !!)
429 :: Rate-limit
=. ran (~(put by ran) pax 6 now)
=+ lim=%.(%x-rate-limit-reset ;~(biff ~(get by (mo q.hit)) poja ni:jo))
=+ tym=?~(lim (add ~m7.s30 now) (add ~1970.1.1 (mul ~s1 u.lim)))
~& retrying-in/`@dr`(sub tym now)
:_(+>.$ [ost %wait pax tym]~)
::
200 :: OK
=+ jon=(need (poja q:(need r.hit)))
:: ~& twit-resp/%.(jon ?+(-.jon !! %o stat:twir, %a (ar:jo stat:twir)))
?+ pax ~|([%http-missed pax] !!)
[%post @ ~] :: post acknowledged
=+ ^= rep
~| [%bad-post jon]
(need %.(jon stat:twir))
=. out (~(put by out) (slav %uv i.t.pax) %| rep)
:_ +>.$
=+ pax=/[who.rep]/status/(rsh 3 2 (scot %ui id.rep))
:- (print (earn [& ~ `/com/twitter] `pax ~))
(spam pax (tweet-good rep))
[%peer *] :: feed data
=+ ^= rep
~| [%bad-feed jon]
(need %.(jon (ar:jo stat:twir)))
:: ~& got-feed/[(scag 5 (turn rep |=(stat id))) fed]
=+ ren=(cull t.pax rep) :: new messages
?~ ren
(wait pax ~) :: pump polling
:: ~& spam-feed/ren
=: ran (~(del by ran) pax) :: clear poll delay
fed (~(put by fed) t.pax rep) :: saw last message
==
(wait pax (spam t.pax [%diff twit-feed/(flop ren)] ~))
==
::
?(400 401 403 404) :: Err
=+ ^- git=gift
=+ err=%.(q:(need r.hit) ;~(biff poja mean:twir))
:^ %diff %ares %bad-http
[leaf/"HTTP Code {<p.hit>}" (turn (need err) mean:twip)]
?+ pax [[ost git]~ +>.$]
[%post @ ~]
[(spam pax git ~) +>.$]
==
==
++ tweet-good |=(rep=stat `(list gift)`~[[%diff %twit-stat rep] [%quit ~]])
++ peer |=(pax=path :_(+> (pear & src pax))) :: accept subscription
++ pear :: poll, possibly returning current data
|= [ver=? @ pax=path]
^- (list move)
?. ?=(twit-path pax)
~|([%missed-path pax] !!)
=> .(pax `twit-path`pax)
?: ?=(%post -.pax)
?. ver ~
=+ sta=(~(get by out) (slav %uv p.pax))
?. ?=([~ %| ^] sta) :: post not received
~
~[[ost %diff %twit-stat p.u.sta] [ost %quit ~]]
=+ ole=(~(get ja fed) pax)
:_ ^- (list move)
?. ver ~
?~ ole ~
[ost %diff %twit-feed (flop ole)]~
=- `move`[ost %them peer/pax ~ `hiss`-]
=+ opt=?~(ole ~ ['since_id' (lutt:twit id.i.ole)]~)
=+ aut=any-auth
?- -.pax
%user (stat-user:aut [(to-sd p.pax)]~ opt)
:: %home (stat-home:auth ~ opt)
==
::
++ to-sd :: parse user name/numb
|= a=span ^- sd:twit
~| [%not-user a]
%+ rash a
;~(pose (stag %user-id dem) (stag %screen-name user:twir))
::
:: ++ pull :: release subscription
:: |= ost=bone
:: ?. (~(has by sup) ost) `+>.$ :: XX should not occur
:: =+ [his pax]=(~(got by sup) ost)
:: ?: (lth 1 ~(wyt in (~(get ju pus) pax)))
:: `+>.$
:: =: ran (~(del by ran) [%peer pax])
:: fed (~(del by fed) pax)
:: ==
:: `+>.$
::
++ spam :: send by path
|= [a=path b=(list gift)] ^- (list move)
%- zing ^- (list (list move))
%+ turn (~(tap by sup))
|= [ost=bone @ pax=path]
?. =(pax a) ~
(turn b |=(c=gift [ost c]))
::
++ print
|=(mes=tape [ost %poke / [our %talk] (said our %twit now eny leaf/mes ~)])
--

View File

@ -472,7 +472,7 @@
;input#ship.mono(contenteditable "", placeholder "planet");
==
;input#pass.mono(type "password", placeholder "passcode");
;h2.advice: Your passcode code has been printed to your console.
;h2.advice: Type +{;code:("+code")} in your dojo for your passcode.
;pre:code#err;
==
==
@ -1347,8 +1347,7 @@
?. ?| (~(has in aut.yac) him.ham)
?~(paz.ham | =(u.paz.ham load-secret))
==
~& code=`@t`load-secret
~|([%try 'code' %in %console] !!) :: XX security
~|(%auth-fail !!)
=^ jon ..ya stat-json:(logon:yac him.ham)
=. cug.yac :_(cug.yac (set-cookie %ship (scot %p him.ham)))
(give-json 200 cug.yac jon)
@ -1356,7 +1355,6 @@
::
++ show-login-page
|= ses/(unit hole) ^- (each pest _done)
%- (slog leaf+"login code for {(scow %p our)}: {(trip load-secret)}" ~)
?. ?=($@($~ {$~ $html}) p.pok)
[%& %red ~]
?~ ses
@ -1690,6 +1688,11 @@
+12.q
=+ ato=(sky [151 %noun] %cx (tope root-beak [%atom (flop %_(dom . sec+dom))]))
=+ key=?~(ato '' ;;(@t u.ato)) :: XX jael
=. key
?~ key ''
%- (bond |.(~&(bad-key+[dom key] '')))
=+ (slaw %uw key)
?~(- ~ (de:crua load-secret u)) :: XX clay permissions
`(bale)`[[our now (shas %bale eny) root-beak] [usr dom] key]
==
::

View File

@ -1395,6 +1395,7 @@
|=(val/* `vase`[typ val])
::
++ meow :: assemble
:: =+ dyv=0
|= {how/beam arg/coin}
=| $: rop/(map term (pair hoof twig)) :: structures
bil/(map term (pair hoof twig)) :: libraries
@ -1428,6 +1429,9 @@
|= {cof/cafe hyd/hood}
^- (bolt _..apex)
%+ cope (body cof src.hyd)
::=. dyv +(dyv)
::~& [`term`(cat 3 %apex (fil 4 dyv ' ')) `path`(flop s.how) libs]
::=- ~& [`term`(cat 3 %xepa (fil 4 dyv ' ')) `path`(flop s.how)] -
|= {cof/cafe sel/_..apex}
=. ..apex sel
%+ cope (neck cof lib.hyd)
@ -1445,6 +1449,7 @@
|= {cof/cafe sel/_..body}
^$(src t.src, ..body sel, cof cof)
::
:: ++ libs `(set term)`(silt (turn (~(tap by bil)) head.is))
++ chad :: atomic list
|= {cof/cafe bax/vase doe/term hon/horn}
^- (bolt vase)
@ -1661,7 +1666,9 @@
=. ..neck
%= sel
how how
bil (~(put by bil) p.i.bir [i.bir [%tow (flop boy.sel)]])
bil %+ ~(put by (~(uni by bil) bil.sel))
p.i.bir
[i.bir [%tow (flop boy.sel)]]
==
^^^$(cof cof, bir t.bir)
::

View File

@ -509,6 +509,7 @@
|= {dap/dude pry/prey cub/club}
^+ +>
?: |(!(~(has by bum) dap) (~(has by wub) dap))
~& >> [%mo-not-running dap -.cub]
:: ~& [%mo-club-qeu dap cub]
=+ syf=(fall (~(get by wub) dap) *sofa)
+>.$(wub (~(put by wub) dap syf(kys (~(put to kys.syf) [hen pry cub]))))
@ -807,19 +808,19 @@
++ ap-move-hiss :: pass %hiss
|= {sto/bone vax/vase}
^- {(each cove tang) _+>}
?. &(?=({p/* q/* r/@ s/^} q.vax) ((sane %tas) r.q.vax))
?. &(?=({p/* q/* r/@ s/{p/@ *}} q.vax) ((sane %tas) r.q.vax))
=+ args="[%hiss wire (unit knot) mark cage]"
:_(+>.$ [%| (ap-suck "hiss: bad hiss ask.{args}")])
=^ gaw vel (~(slot wa vel) 15 vax)
?. &(?=({p/@ q/^} q.gaw) ((sane %tas) p.q.gaw))
?. &(?=({p/@ *} q.gaw) ((sane %tas) p.q.gaw))
:_(+>.$ [%| (ap-suck "hiss: malformed cage")])
=^ paw vel (~(stop wa vel) 3 gaw)
=+ usr=((soft (unit knot)) q.q.vax)
?. &(?=(^ usr) ?~(u.usr & ((sane %ta) u.u.usr)))
:_(+>.$ [%| (ap-suck "hiss: malformed (unit knot)")])
=+ pux=((soft path) p.q.vax)
?. &(?=(^ pux) (levy u.pux (sane %ta)))
:_(+>.$ [%| (ap-suck "hiss: malformed path")])
=^ paw vel (~(stop wa vel) 3 gaw)
:_ +>.$
:^ %& sto %pass
:- [(scot %p q.q.pry) %cay u.pux]

View File

@ -1,146 +0,0 @@
:: %jael, secret storage
::
:::: /hoon/jael/arvo
::
!? 164
::::
:: %jael is logically homogeneous, but please follow these conventions:
::
:: /cap :: foreign app keys
:: /service :: service name, eg %face for FB
:: /appid :: your ship's app-id
:: /@uvH :: by hash
:: /@ud :: by number
:: /@tas :: by name
::
:: /key :: foreign user secrets
:: /service :: service name, eg %face
:: /userid :: user identity
::
:: /urb :: urbit secrets
:: /tok/hash
|= pit=vase
=> =~
:: structures
|%
++ axle :: %jael state
$: %0 :: %jael version
ent=@ :: entropy
sef=safe :: secret tree
red=(map duct (set path)) :: reverse subscribers
== ::
++ gift :: out result <-$
$% [%dead p=path] :: key expired
[%live p=path q=@] :: key created
== ::
++ kiss :: in request ->$
$% [%kill p=path] :: discard secret
[%make p=@uw q=(unit ,@da) r=@ud s=path] :: generate random
[%nuke ~] :: erase subscriber
[%tell p=@uw q=(unit ,@da) r=path] :: save secret
== ::
++ move ,[p=duct q=(wind note gift)] :: typed move
++ note :: out request $->
$% $: %b :: to %behn
$% [%wait p=@da] ::
[%rest p=@da] ::
== == == ::
++ perm (pair ,@ud (list ,@ud)) :: prime definition
++ safe ::
$: nub=(unit ,@uw) :: secret
dex=(unit ,@da) :: expiration
sud=(set duct) :: subscribers
kin=(map term safe) :: children
== ::
-- ::
:: programs
|%
++ bu
|_ $: xap=path
fes=(list safe)
moz=(list move)
==
axle
::
++ bu-abet :: resolve
^- axle
?~ xap +<+
%= bu-abet
xap t.xap
fes t.fes
sef %= i.fes
kin
?: =(*safe sef)
(~(del by kin.i.fes) i.xap)
(~(put by kin.i.fes) i.xap sef)
==
==
::
++ bu-kill :: destroy
^+ .
=+ dus=(~(tap by
::
++ bu-ajar :: descend
|= pax=path
^+ +>
?~ pax +>.$
%= $
pax t.pax
xap [i.pax xap]
fes [sef fes]
sef (fall (~(get by kin.sef) i.pax) *safe)
==
--
++ bury
|= [pax=path lex=axle]
(~(bu-ajar bu [~ ~ ~] tof.lex lex) pax)
--
. ==
=| axle
|= [now=@da eny=@ ski=sled] :: activate
^? :: opaque core
|% ::
++ call :: request
|= [hen=duct hic=(hypo (hobo kiss))]
^- [p=(list move) q=_..^$]
=> .(q.hic ?.(?=(%soft -.q.hic) q.hic ((hard kiss) p.q.hic)))
=^ moz +>+>-
=< bu-abet
?- -.p.q.hic
%kill
kill:(bury p.p.q.hic +>+>-)
::
%make
%nuke
%tell
==
::
++ doze
|= [now=@da hen=duct]
^- (unit ,@da)
~
::
++ load :: highly forgiving
|= old=*
=+ lox=((soft axle) old)
^+ ..^$
?~ lox
~& %jael-reset
..^$
..^$(+>- u.lox)
::
++ scry
|= [fur=(unit (set monk)) ren=@tas who=ship syd=desk lot=coin tyl=path]
^- (unit (unit (pair mark ,*)))
:: actually scry
~
::
++ stay :: save w+o cache
`axle`+>-.$(pol (~(run by pol) |=(a=baby [tad.a dym.a ~])))
::
++ take :: response
|= [tea=wire hen=duct hin=(hypo noun)]
!!
--

View File

@ -1,103 +0,0 @@
:: %kahn, social state
::
:::: /hoon/kahn/arvo
::
!? 164
::::
|= pit=vase
=> =~
:: structures
|%
++ axle :: %kahn state
$: %0 ::
soc=(map monk node) :: social graph
red=(map duct (set monk)) :: reverse subscribers
== ::
++ cert (each will ,*) :: urbit or other
++ gift :: out result <-$
$: [%then p=node] :: propagate change
== ::
++ node :: social identity
$: tin=(map monk link) :: inbound links
oud=(map monk link) :: outbound links
cet=cert :: certificate
sud=(set duct) :: subscribers
== ::
++ khan ,[p=@tas q=@ta] :: foreign identity
++ kiss :: social update
$: [%cert p=monk q=cert] :: set certificate
[%hear p=monk] :: watch identity
[%know p=monk q=(map monk link)] :: set forward links
[%nuke ~] :: erase subscriber
== ::
++ link (pair rank ,@da) :: trust+expiration
++ monk (each ship khan) :: general identity
++ rank :: privilege ring
$? %0 :: complete trust
%1 :: structural trust
%2 :: social trust
%3 :: neutral trust
%4 :: negative trust
== ::
-- ::
. ==
=| axle
=* lex -
|= [now=@da eny=@ ski=sled] :: activate
^? :: opaque core
|% ::
++ call :: request
|= [hen=duct hic=(hypo (hobo kiss))]
^- [p=(list move) q=_..^$]
=> .(q.hic ?.(?=(%soft -.q.hic) q.hic ((hard kiss) p.q.hic)))
!!
::
++ doze
|= [now=@da hen=duct]
^- (unit ,@da)
~
::
++ load :: highly forgiving
|= old=*
=+ lox=((soft axle) old)
^+ ..^$
?~ lox
~& %khan-reset
..^$
..^$(+>- u.lox)
::
++ scry
|= [fur=(unit (set monk)) ren=@tas who=ship syd=desk lot=coin tyl=path]
^- (unit (unit (pair mark ,*)))
?. =(big [~ who]) ~
=+ ^= yub ^- [(unit monk)
?: =(%urb syd)
?. ?=([* ~] tyl) ~
=+ goy=(slaw %p
?+ ?=([%$ %da @]
?+ lot ~
[%$ %ud @]
%+ bind
(perm who u.hun q.p.lot [syd t.tyl])
|=(a=* [%noun a])
::
?. =(now q.p.lot) ~
%+ bind
(temp who u.hun [syd t.tyl])
|=(a=* [%noun a])
==
?. ?=([%da
=+ mok ^- (unit monk)
?: =(%urb face)
(
::
++ stay :: save w+o cache
`axle`+>-.$
::
++ take :: response
|= [tea=wire hen=duct hin=(hypo noun)]
!!
--

View File

@ -1,104 +0,0 @@
:: %lunt, fleet job control
::
:::: /hoon/lunt/arvo
::
!? 164
::::
|= pit=vase
=> =~
:: structures
|%
++ axle :: %lunt state
$: %0 ::
all=(map ship axil) :: state by owner
== ::
++ born ,[p=brat q=(unit ship)] :: task identity
++ brat ,@ud :: task number
++ bulb ::
$: p=@p :: ship identity
q=home :: server data
== ::
++ home :: storage access
$: pad=@uvH :: passcode
huc=husk :: log server
sog=hulk :: storage server
== ::
++ hulk :: checkpoint service
$% [%astr p=@ud q=@ud] :: S3
== ::
++ husk :: log server
$: pro=@tas :: protocol
cap=@uvH :: access code
srv=(list (pair ,@ud clip)) :: server cluster
== ::
++ gift :: result
$: [%die p=brat] :: kill
[%int p=brat] :: interrupt
[%run p=brat q=@p r=home] :: load
[%say p=brat q=(list ovum)] :: send events
[%new p=brat q=@p r=home s=(list ovum)] :: create
== ::
++ kiss :: request
$: [%com p=@p] :: toggle compute svr
[%end p=brat] :: local end
[%fan p=@ud] :: set local fanout
[%kil ~] :: terminate ship
[%int ~] :: interrupt ship
[%new p=@p q=(set ,@p) q=home r=@uvI] :: create ship
[%run p=@p q=home] :: run existing ship
[%say p=(list ovum)] :: remote events
[%sto p=husk] :: toggle logger
== ::
++ axil ::
$: bus=(unit ,@p) :: master
loc=@ud :: local resources
hen=(unit duct) :: effect duct
ent=@ :: entropy
seq=@ :: brat sequence
why=(map duct born) :: hosted ships
how=(map born duct) :: reverse why
hut=(map born home) :: storage control
ham=(set hulk) :: block stores
sto=(set husk) :: log stores
com=(set ship) :: compute resources
== ::
-- ::
. ==
=| axle
=* lex -
|= [now=@da eny=@ ski=sled] :: activate
^? :: opaque core
|% ::
++ call :: request
|= [hen=duct hic=(hypo (hobo kiss))]
^- [p=(list move) q=_..^$]
=> .(q.hic ?.(?=(%soft -.q.hic) q.hic ((hard kiss) p.q.hic)))
!!
::
++ doze
|= [now=@da hen=duct]
^- (unit ,@da)
~
::
++ load :: highly forgiving
|= old=*
=+ lox=((soft axle) old)
^+ ..^$
?~ lox
~& %lunt-reset
..^$
..^$(+>- u.lox)
::
++ scry
|= [fur=(unit (set monk)) ren=@tas who=ship syd=desk lot=coin tyl=path]
^- (unit (unit (pair mark ,*)))
~
::
++ stay :: save w+o cache
`axle`+>-.$
::
++ take :: response
|= [tea=wire hen=duct hin=(hypo noun)]
!!
--

View File

@ -1,94 +0,0 @@
:: %musk, realm management
::
:::: /hoon/musk/arvo
::
!? 164
::::
|= pit=vase
=> =~
:: structures
|%
++ axle :: %musk state
$: %0 ::
all=(map ship axil) :: state by owner
== ::
++ axil ::
$: kid=(map ship girl) :: daughters
deq=(map narc ship) :: reverse address
siq=(map ship (list clan)) :: ship to clans
kes=(map clan (list ship)) :: clan to ships
== ::
++ clan ,@tas :: group identity
++ narc :: contact address
$: [%$ p=ship] :: urbit
[%m p=@t q=@t] :: email p@q
[%f p=@t] :: facebook
[%g p=@t] :: google
[%p p=@t] :: phone message
[%t p=@t] :: twitter
== ::
++ pony :: daughter status
$% [%cold ~] :: virginal
[%dead ~] :: written off
[%fake ~] :: virtual
[%free ~] :: downloaded
[%here ~] :: hosted
[%left p=(unit ship)] :: run away to
== ::
++ rank :: relative privilege
$? %0 :: enemy
%1 :: neighbor
%2 :: guest+customer
%3 :: friend+employee
%4 :: officer+family
%5 :: self+admin
== ::
++ girl ::
$: hop=pony :: status
tag=(unit ,@tas) :: petname
tip=rank :: rank
fig=(set narc) :: identities
loc=(unit ,[p=@da q=@ud r=clip]) :: last position
sym=(set ,[p=@ q=@uvH]) :: symmetric keys?
wyl=will :: crypto will
== ::
-- ::
. ==
=| axle
=* lex -
|= [now=@da eny=@ ski=sled] :: activate
^? :: opaque core
|% ::
++ call :: request
|= [hen=duct hic=(hypo (hobo kiss))]
^- [p=(list move) q=_..^$]
=> .(q.hic ?.(?=(%soft -.q.hic) q.hic ((hard kiss) p.q.hic)))
!!
::
++ doze
|= [now=@da hen=duct]
^- (unit ,@da)
~
::
++ load :: highly forgiving
|= old=*
=+ lox=((soft axle) old)
^+ ..^$
?~ lox
~& %lunt-reset
..^$
..^$(+>- u.lox)
::
++ scry
|= [fur=(unit (set monk)) ren=@tas who=ship syd=desk lot=coin tyl=path]
^- (unit (unit (pair mark ,*)))
~
::
++ stay :: save w+o cache
`axle`+>-.$
::
++ take :: response
|= [tea=wire hen=duct hin=(hypo noun)]
!!
--

View File

@ -404,7 +404,7 @@
=+ op=(fil 3 64 0x5c)
=+ ^= kex
?: (gth (met 3 key) 64)
(lsh 3 44 (shan (swap 3 key)))
(lsh 3 44 (shan key))
(lsh 3 (sub 64 (met 3 key)) (swap 3 key))
=+ inn=(shan (swap 3 (cat 3 (swap 3 mes) (mix ip kex))))
(shan (swap 3 (cat 3 inn (mix op kex))))

17
gen/code.hoon Normal file
View File

@ -0,0 +1,17 @@
::
:::: /hoon/code/gen
::
/- sole
=+ sole
:- %ask
|= $: {now/@da eny/@uvI bec/beak}
$~
$~
==
^- (sole-result)
%+ sole-yo
:- %leaf
%+ slag 1
%+ scow %p
.^(@p %a /(scot %p p.bec)/code/(scot %da now)/(scot %p p.bec))
sole-no

14
gen/curl-hiss.hoon Normal file
View File

@ -0,0 +1,14 @@
::
:::: /hoon/curl/gen
::
/? 310
/- sole
[sole]
:- %get |= {^ {a/hiss $~} $~}
^- (sole-request (cask httr))
?. ?=($get p.q.a)
~| %only-get-requests-supported-in-generators :: XX enforced?
!!
:- *tang
:+ %| `hiss`a
|=(hit/httr (sole-so %httr hit))

View File

@ -0,0 +1,33 @@
::
:::: /hoon/init-auth-basic/hood/gen
::
/? 314
/- sole
::
::::
!:
[sole .]
:- %ask
|= $: {now/@da eny/@uvI bec/beak}
{arg/$@($~ {dom/path $~})}
$~
==
^- (sole-result {$write-sec-atom p/host q/@})
=- ?~ arg -
(fun.q.q [%& dom.arg])
%+ sole-lo
[%& %oauth-hostname "api hostname: https://"]
%+ sole-go thos:urlp
|= hot/host
?: ?=($| -.hot)
~|(%ips-unsupported !!)
%+ sole-lo
[%& %auth-user "username: "]
%+ sole-go (boss 256 (star ;~(less col prn)))
|= usr/@t
%+ sole-lo
[%| %auth-passwd "password: "]
%+ sole-go (boss 256 (star prn))
|= pas/@t
%+ sole-so %write-sec-atom :: XX typed pair
[hot (crip (sifo (rap 3 usr ':' pas ~)))]

33
gen/hood/init-oauth1.hoon Normal file
View File

@ -0,0 +1,33 @@
::
:::: /hoon/init-oauth1/hood/gen
::
/? 314
/- sole
::
::::
!:
[sole .]
:- %ask
|= $: {now/@da eny/@uvI bec/beak}
{arg/$@($~ {dom/path $~})}
$~
==
^- (sole-result {$write-sec-atom p/host q/@})
=- ?~ arg -
(fun.q.q [%& dom.arg])
%+ sole-lo
[%& %oauth-hostname "api hostname: https://"]
%+ sole-go thos:urlp
|= hot/host
?: ?=($| -.hot)
~|(%ips-unsupported !!)
%+ sole-lo
[%& %oauth-client "consumer key: "]
%+ sole-go (boss 256 (star prn))
|= key/@t
%+ sole-lo
[%& %oauth-secret "consumer secret: "]
%+ sole-go (boss 256 (star prn))
|= sec/@t
%+ sole-so %write-sec-atom :: XX typed pair
[hot (role key sec ~)]

10
gen/twit/as.hoon Normal file
View File

@ -0,0 +1,10 @@
/- twitter
::
::::
::
[twitter .]
:- %say
|= $: [now=@da eny=@uvI bec=beak]
[[who=span msg=cord ~] ~]
==
[%twit-do [who %post eny msg]]

23
gen/twit/auth.hoon Normal file
View File

@ -0,0 +1,23 @@
:: Input twitter keys
/- sole, twitter
!:
[sole twitter .]
|%
++ baz64 (cook crip (star alp))
--
!:
:- %ask
|= $: [now=@da eny=@uvI bec=beak]
[~ ~]
==
^- (sole-result (cask twit-do))
%+ sole-lo [%& %$ "User: "] %+ sole-go urs:ab |= acc=span
%+ sole-lo [%& %$ "App token: "] %+ sole-go baz64 |= ctok=cord
%+ sole-lo [%& %$ "App secret: "] %+ sole-go baz64 |= csec=cord
%+ sole-lo [%& %$ "User token: "] %+ sole-go baz64 |= atok=cord
%+ sole-lo [%& %$ "User secret: "] %+ sole-go baz64 |= asec=cord
(sole-so %twit-do [acc %auth [ctok csec] atok asec])

View File

@ -0,0 +1,5 @@
hoontap
AP3G1t8ki6rPzeeAqdWCTw03F
VV784LPwZSaAxtF16RWWTnST4F85BHN8VqQKNyv7MprCkA0xZD
2821727326-BAABHUpwCuoeVjINTHTVvfPlJlGHmigqKywlLcE
o6TCNfQhhUkzx6fKIC3CGi2cWn3YbEoQVCVgg210YYTtV

13
gen/twit/tweet.hoon Normal file
View File

@ -0,0 +1,13 @@
/+ sh-utils
!:
|_ [hide ~]
++ peer ,_`.
++ poke--args
%+ add-subs [[our /twit] our /post/(scot %uv eny)]
%^ gate-mess .
|=([a=span b=cord ~] [/twit %twit-do !>([a %post eny b])])
,_`.
++ posh-twit-stat
(args-into-gate . |=([@ @ a=@da @] tang/~[leaf/"Tweet recieved {<a>}"]))
++ pour |*([ost=@ * sih=[@ ^]] :_(+>.$ [ost %give +.sih]~))
--

View File

@ -0,0 +1,23 @@
:: Display twitter feed
::
:::: /hook/core/twitter-feed/app
::
/+ sh-utils
!:
::
:::: ~fyr
::
|_ [hide ~]
++ stat ,[id=@u who=@ta now=@da txt=@t]
++ rens
:- %say
|=(stat rose/[": " `~]^~[leaf/"{<now>} @{(trip who)}" leaf/(trip txt)])
++ peer ,_`.
++ poke--args
|= [ost=bone his=ship who=span ~]
%.(+< (add-subs [[our /twit] our /user/[who]] ,_`+>.$))
::
++ posh-twit-feed
(args-into-gate . |=(a=(list stat) tang/(turn a rens)))
:: ++ pour |*([ost=@ * sih=[@ ^]] :_(+>.$ [ost %give +.sih]~))
--

View File

@ -1,6 +1,8 @@
!:
=+ keys=@t
|= bal/(bale keys)
?~ key.bal
~|(%basic-auth-no-key ~_(leaf+"Run |init-auth-basic {<`path`dom.bal>}" !!))
=+ aut=authorization+(cat 3 'Basic ' key.bal)
~& aut=`{@tas @t}`aut
|=(a/hiss [%send %_(a q.q (~(add ja q.q.a) -.aut +.aut))])

1
lib/httr-to-json.hoon Normal file
View File

@ -0,0 +1 @@
|=(hit/httr ~|(hit ?>(?=($2 (div p.hit 100)) (need (poja q:(need r.hit))))))

259
lib/oauth1.hoon Normal file
View File

@ -0,0 +1,259 @@
:: OAuth 1.0 %authorization header
::
:::: /hoon/oauth1/lib
::
|%
++ keys cord:{key/@t sec/@t} :: app key pair
++ token :: user keys
$@ $~ :: none
$% {$request-token oauth-token/@t token-secret/@t} :: intermediate
{$access-token oauth-token/@t token-secret/@t} :: full
==
++ quay-enc (list tape):quay :: partially rendered query string
--
::
::::
::
|%
++ fass :: rewrite quay
|= a/quay
%+ turn a
|= {p/@t q/@t} ^+ +<
[(gsub '-' '_' p) q]
::
++ gsub :: replace chars
|= {a/@t b/@t t/@t}
^- @t
?: =('' t) t
%+ mix (lsh 3 1 $(t (rsh 3 1 t)))
=+ c=(end 3 1 t)
?:(=(a c) b c)
::
++ join
|= {a/cord b/(list cord)}
?~ b ''
(rap 3 |-([i.b ?~(t.b ~ [a $(b t.b)])]))
::
++ joint :: between every pair
|= {a/tape b/wall} ^- tape
?~(b b |-(?~(t.b i.b :(weld i.b a $(b t.b)))))
::
++ join-urle |=(a/(list tape) (joint "&" (turn a urle)))
:: query string in oauth1 'k1="v1", k2="v2"' form
++ to-header
|= a/quay ^- tape
%+ joint ", "
(turn a |=({k/@t v/@t} `tape`~[k '="' v '"'])) :: normalized later
::
:: partial tail:earn for sorting
++ encode-pairs
|= a/quay ^- quay-enc
%+ turn a
|= {k/@t v/@t} ^- tape
:(weld (urle (trip k)) "=" (urle (trip v)))
::
++ parse-pairs :: x-form-urlencoded
|= bod/(unit octs) ^- quay-enc
~| %parsing-body
?~ bod ~
(rash q.u.bod (more pam (plus ;~(less pam prn))))
::
++ post-quay
|= {a/purl b/quay} ^- hiss
=- [a %post - ?~(b ~ (some (tact +:(tail:earn b))))]
(my content-type+['application/x-www-form-urlencoded']~ ~)
::
::
++ mean-wall !.
|= {a/term b/tape} ^+ !!
=- (mean (flop `tang`[>a< -]))
(turn (lore (crip b)) |=(c/cord leaf+(trip c)))
::
++ dbg-post `purl`[`hart`[| `6.000 [%& /localhost]] `pork``/testing `quay`/]
++ bad-response |=(a/@u ?:(=(2 (div a 100)) | ~&(bad-httr+a &)))
++ quay-keys |-($@(knot {$ $})) :: improper tree
++ grab-quay :: ?=({@t @t @t} ((grab-quay *httr) %key1 %key2 %key3))
|* {a/httr b/quay-keys}
~| bad-quay+r.a
=+ quy=(rash q:(need r.a) yquy:urlp)
~| quy
=+ all=(malt quy)
%. b
|* b/quay-keys
?@ b ~|(b (~(got by all) b))
[(..$ -.b) (..$ +.b)]
::
++ parse-url
|= a/$@(cord:purl purl) ^- purl
?^ a a
~| bad-url+a
(rash a auri:epur)
::
++ interpolate-url
|= {a/$@(cord purl) b/(unit hart) c/(list (pair term knot))}
^- purl
?@ a $(a (parse-url a)) :: deal with cord
%_ a
p ?^(b u.b p.a)
q.q (interpolate-path q.q.a c)
==
::
++ interpolate-path :: [/a/:b/c [%b 'foo']~] -> /a/foo/c
|= {a/path b/(list (pair term knot))} ^- path
?~ a ?~(b ~ ~|(unused-values+b !!))
=+ (rush i.a ;~(pfix col sym))
?~ - [i.a $(a t.a)] :: not interpolable
?~ b ~|(no-value+u !!)
?. =(u p.i.b) ~|(mismatch+[u p.i.b] !!)
[q.i.b $(a t.a, b t.b)]
--
!:
::::
::
|= {request/$@(@t purl) dialog/$@(@t purl) code-exchange/$@(@t purl)}
=+ :+ dialog-url=(parse-url dialog)
exchange-url=(parse-url code-exchange)
token-reqs-url=(parse-url request)
|_ {done/* (bale keys) tok/token}
+- core-move $^({sec-move _done} sec-move) :: stateful
++ consumer-key key:decode-keys
++ consumer-secret sec:decode-keys
++ decode-keys :: XX from bale w/ typed %jael
^- {key/@t sec/@t $~}
?. =(~ `@`key)
~| %oauth-bad-keys
((hard {cid/@t cis/@t $~}) (lore key))
%+ mean-wall %oauth-no-keys
"""
Run |init-oauth1 {<`path`dom>}
If necessary, obtain consumer keys configured for a oauth_callback of
{(trip oauth-callback)}
"""
::
++ our-host .^(hart %e /(scot %p our)/host/fake)
++ oauth-callback
~& [%oauth-warning "Make sure this urbit ".
"is running on {(earn our-host `~ ~)}"]
%- crip %- earn
%^ interpolate-url 'https://our-host/~/ac/:domain/:user/in'
`our-host
:~ domain+(join '.' (flop dom))
user+(scot %ta usr)
==
::
::
++ toke-url
|= quy/quay ^- purl
%_ dialog-url
r (fass ?~(usr quy [screen-name+usr quy]))
==
::
++ token-exchange (post-quay exchange-url ~)
++ token-request (post-quay token-reqs-url oauth-callback+oauth-callback ~)
::
:: use token to sign authorization header. requires:
:: ++ res (res-handle-reqt handle-token) :: take request token
:: ++ bak (res-save-access handle-token) :: obtained access token
++ out-math
^- $-(hiss $%({$send hiss} {$show purl}))
?~ tok
_[%send (add-auth ~ token-request)]
?: ?=($request-token -.tok)
_[%show (toke-url oauth-token+oauth-token.tok ~)]
|= a/hiss ^- {$send hiss}
[%send (add-auth [oauth-token+oauth-token.tok]~ a)]
::
++ in-oauth-token
|= a/quay ^- sec-move
=. a (sort a aor)
?. ?=({{$'oauth_token' oauth-token/@t} {$'oauth_verifier' @t} $~} a)
~|(no-token+a !!)
?~ tok
~|(%no-secret-for-token !!)
?. =(oauth-token.tok oauth-token.q.i.a)
~| wrong-token+[id=usr q.i.a]
~|(%multiple-tokens-unsupported !!)
[%send (add-auth a token-exchange)]
::
++ token-response ['oauth_token' 'oauth_token_secret']
+- bak-save-access
|= handle/$-(token _done)
%- (res-parse token-response)
|= access-token/{tok/@t sec/@t} ^- core-move
[[%redo ~] (handle `token`[%access-token access-token])]
::
+- res-parse
|* para/quay-keys
|= handle/$-(_?~(para ~ (grab-quay *httr para)) core-move)
|= a/httr ^- core-move
?: (bad-response p.a)
[%give a]
:: [%redo ~] :: handle 4xx?
(handle (grab-quay a para))
::
++ res-give |=(a/httr [%give a])
+- res-handle-reqt
|= handle/$-(token _done) ^- $-(httr core-move)
?~ tok
(res-save-reqt handle)
res-give
::
+- res-save-reqt
|= handle/$-(token _done) ^- $-(httr core-move)
%- (res-parse token-response 'oauth_callback_confirmed')
|= {request-token/{tok/@t sec/@t} cof/term} ^- core-move
?. =(%true cof)
~|(%callback-rejected !!)
[[%redo ~] (handle `token`[%request-token request-token])]
::
::
++ add-auth
=< |= $: auq/quay :: extra oauth parameters
hiz/{purl meth hed/math (unit octs)}
==
^- hiss
~& add-auth+(earn -.hiz)
%_ hiz
hed (~(add ja hed.hiz) %authorization (authorization auq hiz))
==
|%
++ authorization
|= {auq/quay url/purl med/meth math bod/(unit octs)}
=^ quy url [r.url url(r ~)] :: query string handled separately
=. auq (fass (weld auq auth-quay))
=+ ^- qen/quay-enc :: semi-encoded for sorting
%+ weld (parse-pairs bod)
(encode-pairs (weld auq quy))
=+ bay=(base-string med url qen)
=+ sig=(sign signing-key bay)
=. auq ['oauth_signature'^(crip (urle sig)) auq]
(crip "OAuth {(to-header auq)}")
::
++ auth-quay
^- quay
:~ oauth-consumer-key+consumer-key
oauth-nonce+(scot %uw (shaf %non eny))
oauth-signature-method+'HMAC-SHA1'
oauth-timestamp+(rsh 3 2 (scot %ui (unt now)))
oauth-version+'1.0'
==
++ base-string
|= {med/meth url/purl qen/quay-enc} ^- tape
=. qen (sort qen aor)
%- join-urle
:~ (trip (cuss (trip `@t`med)))
(earn url)
(joint "&" qen)
==
++ sign
|= {key/cord bay/tape} ^- tape
(sifo (swap 3 (hmac key (crip bay))))
::
++ signing-key
%- crip
%- join-urle :~
(trip consumer-secret)
(trip ?^(tok token-secret.tok ''))
==
--
--

View File

@ -12,8 +12,8 @@
|= {a/@t b/@t t/@t}
^- @t
?: =('' t) t
%+ add (lsh 3 1 $(t (rsh 3 1 t)))
=+ c=(mod t (bex 8))
%+ mix (lsh 3 1 $(t (rsh 3 1 t)))
=+ c=(end 3 1 t)
?:(=(a c) b c)
::
++ join
@ -84,7 +84,7 @@
((hard {cid/@t cis/@t $~}) (lore key))
%+ mean-wall %oauth-no-keys
"""
Run |init-oauth2
Run |init-oauth2 {<`path`dom>}
If necessary, obtain client keys configured for a redirect_uri of
{(trip redirect-uri)}
"""
@ -113,6 +113,7 @@
user+?:(state-usr '_state' (scot %ta usr))
==
::
::
++ out-filtered
|= {tok/token aut/$-(hiss hiss)}
|= a/hiss ^- sec-move

165
lib/twitter.hoon Normal file
View File

@ -0,0 +1,165 @@
:: A Twitter API library.
::
:::: /hoon/twitter/lib
::
/? 314
/- twitter
=+ sur-twit:^twitter :: XX
!:
:::: functions
::
|%
++ fass :: rewrite path
|= a/path
%+ turn a
|=(b/@t (gsub '-' '_' b))
::
++ gsub :: replace chars
|= {a/@t b/@t t/@t}
^- @t
?: =('' t) t
%+ mix (lsh 3 1 $(t (rsh 3 1 t)))
=+ c=(end 3 1 t)
?:(=(a c) b c)
::
++ join
|= {a/char b/(list @t)} ^- @t
%+ rap 3
?~ b ~
|-(?~(t.b b [i.b a $(b t.b)]))
::
++ interpolate-some :: [/a/:b/c [d+'bar' b+'foo']~] -> [/a/foo/c [d+'bar']~]
|= {pax/path quy/quay} ^- {path quay}
=+ ^= inline :: required names
%- ~(gas in *(set term))
(murn pax replacable:interpolate-path)
=^ inter quy
(skid quy |=({a/knot @} (~(has in inline) a)))
[(interpolate-path pax inter) quy]
::
++ interpolate-path :: [/a/:b/c [%b 'foo']~] -> /a/foo/c
=+ replacable=|=(a/knot `(unit term)`(rush a ;~(pfix col sym)))
|= {a/path b/(list (pair term knot))} ^- path
?~ a ?~(b ~ ~|(unused-values+b !!))
=+ (replacable i.a)
?~ - [i.a $(a t.a)] :: literal value
?~ b ~|(no-value+u !!)
?. =(u p.i.b) ~|(mismatch+[u p.i.b] !!)
[q.i.b $(a t.a, b t.b)]
::
++ valve :: produce request
|= {med/?($get $post) pax/path quy/quay}
^- hiss
=+ url=(scan "https://api.twitter.com/1.1/.json" auri:epur) :: base path
=. q.q.url (welp q.q.url pax)
=. r.url quy
^- hiss
?- med
$get [url med *math ~]
$post
=+ hed=(my content-type+['application/x-www-form-urlencoded']~ ~)
[url(r ~) med hed (some (tact +:(tail:earn r.url)))]
==
::
++ find-req
=+ all=doc-data-dry:reqs
|= a/_-:*endpoint:reqs ^- {?($get $post) path}
?~ all ~|(endpoint-lost+a !!) :: type error, should never happen
?: =(a -:*typ.i.all)
+.i.all
$(all t.all)
--
!:
:::: library
::
|%
++ render :: response printers
|%
++ mean
|= {msg/@t num/@ud} ^- tank
rose+[": " `~]^~[leaf+"Error {<num>}" leaf+(trip msg)]
--
++ parse :: json reparsers
|%
++ ce |*({a/_* b/fist:jo} (cu:jo |=(c/a c) b)) :: output type
++ fasp |*(a/{@tas *} [(gsub '-' '_' -.a) +.a]) :: XX usable electroplating
++ user (cook crip (plus ;~(pose aln cab)))
++ mean (ot errors+(ar (ot message+so code+ni ~)) ~):jo
++ stat
=+ jo
%+ ce stat:sur-twit
%- ot
:~ id+ni
user+(ot (fasp screen-name+(su user)) ~)
(fasp created-at+da)
text+so
==
++ usel
=+ jo
%+ ce (list who/@ta)
=- (ot users+(ar -) ~)
(ot (fasp screen-name+(su user)) ~)
--
++ print
=+ args:reqs
|%
++ tid |=(@u `@t`(rsh 3 2 (scot %ui +<)))
++ scr |=(@t +<)
++ lsc
|= a/$@(^scr ^lsc) ^- @t
?@(a `@t`a (join ',' a))
::
++ lst
|= a/$@(@t ^lst) ^- @t
?@(a `@t`a (join ',' a))
::
++ lid
|= a/$@(^tid (list ^tid)) ^- @t
?~ a ~|(%nil-id !!)
?@(a (tid a) (join ',' (turn `(list ^tid)`a tid)))
--
++ request
=< apex
=+ args:reqs
|%
++ apex
|= {a/endpoint b/quay}
=+ [med pax]=(find-req -.a)
(valve med (cowl pax +.a b))
::
++ lutt |=(@u `@t`(rsh 3 2 (scot %ui +<)))
++ llsc
:: => args:reqs
|= a/$@(scr (list scr)) ^- @t
?@(a `@t`a (join ',' a))
::
++ llst
|= a/$@(@t (list @t)) ^- @t
?@(a `@t`a (join ',' a))
::
++ llid
:: =+ args:reqs
|= a/$@(tid (list tid)) ^- @t
?~ a ~|(%nil-id !!)
?@(a (lutt a) (join ',' (turn `(list tid)`a lutt)))
::
++ cowl :: handle parameters
|= $: pax/path
ban/(list param)
quy/quay
==
^- {path quay}
%+ interpolate-some (fass pax)
=- (weld - quy)
%+ turn ban
|= p/param
^- {@t @t}
:- (gsub '-' '_' -.p)
?+ -.p p.p :: usually plain text
?($source-id $target-id) (tid:print p.p)
?($follow $id $name $user-id) (lid:print p.p)
$track (lst:print p.p)
$screen-name (lsc:print p.p)
==
--
--

View File

@ -51,9 +51,16 @@
==
(poke--data [`%md pax] %mime / (taco txt))
::
++ ames-secret
^- @t
=- (crip +:<.^(@p %a pax)>)
pax=/(scot %p our)/code/(scot %da now)/(scot %p our)
::
++ poke-sec-atom
|= {hot/host dat/@}
?> ?=($& -.hot)
=. p.hot (scag 2 p.hot) :: ignore subdomain
=. dat (scot %uw (en:crua ames-secret dat)) :: XX clay permissions
(poke--data [`%atom [%sec p.hot]] %mime / (taco dat))
::
++ poke--data

17
mar/twit/feed.hoon Normal file
View File

@ -0,0 +1,17 @@
:: Twitter statuses
::
:::: /hoon/feed/twit/mar
::
/+ twitter, httr-to-json
|_ (list stat:twitter)
++ grab
|%
++ noun (list stat:twitter)
++ json (corl need (ar:jo stat:parse:twitter))
++ httr (cork httr-to-json json) :: XX mark translation
--
++ grow
|%
++ tank >[+<]<
--
--

15
mar/twit/req.hoon Normal file
View File

@ -0,0 +1,15 @@
:: Twitter api request
::
:::: /hoon/req/twit/mar
::
/+ twitter
|_ {req/endpoint:reqs:twitter quy/quay}
++ grab
|%
++ noun {endpoint:reqs:twitter quay}
--
++ grow
|%
++ hiss (request:twitter req quy)
--
--

17
mar/twit/status.hoon Normal file
View File

@ -0,0 +1,17 @@
:: Twitter status
::
:::: /hoon/stat/twit/mar
::
/+ twitter, httr-to-json
|_ stat:twitter
++ grab
|%
++ noun stat:twitter
++ json (corl need stat:parse:twitter)
++ httr (cork httr-to-json json) :: XX mark translation
--
++ grow
|%
++ tank >[+<]<
--
--

17
mar/twit/usel.hoon Normal file
View File

@ -0,0 +1,17 @@
:: List of twitter users
::
:::: /hoon/usel/twit/mar
::
/+ twitter, httr-to-json
|_ (list who/@ta)
++ grab
|%
++ noun (list who/@ta)
++ json (corl need usel:parse:twitter)
++ httr (cork httr-to-json json) :: XX mark translation
--
++ grow
|%
++ tank >[+<]<
--
--

View File

@ -1 +1 @@
cGhpbGlwY21vbmt0ZXN0OjEzMzdwYXNzd29yZA==
0wy-6.mDQa9.1XfY5.XF0tQ.28rEc.A6A40.T7YoZ.NdPMT.WifG3.82OJT.FrjnC.gLrsz.wO2sX.0Xi7h.Xv8cg.KFTTy.dFYMr.QMIsq.Y~ydB.zJIuK.NIGqU.ftlaD.-QpVd.zTWuY.XgeS~.qndM4

22
sec/com/twitter.hoon Normal file
View File

@ -0,0 +1,22 @@
:: Test url +https://api.twitter.com/1.1/account/verify_credentials.json
::
:::: /hoon/twitter/com/sec
::
/+ oauth1
!:
::::
::
=+ ^= aut
%^ oauth1
'https://api.twitter.com/oauth/request_token'
'https://api.twitter.com/oauth/authorize'
'https://api.twitter.com/oauth/access_token'
|_ {(bale keys:oauth1) tok/token:oauth1}
++ aut ~(. ^aut . +<- +<+) :: XX electroplating
++ out out-math:aut
++ in in-oauth-token:aut
++ bak (bak-save-access:aut save-token)
++ res (res-handle-reqt:aut save-token)
++ save-token |=(tok/token:aut +>(tok tok))
::++ wyp ~
--

196
sur/twitter.hoon Normal file
View File

@ -0,0 +1,196 @@
|%
++ stat {id/@u who/@ta now/@da txt/@t} :: recieved tweet
++ keys :: twitter-key type
$: con/{tok/@t sec/@t} :: user key pair
acc/{tok/@t sec/@t} :: app key pair
==
::
++ command :: poke action
$% {$auth p/keys} :: set API keys
{$post p/@uvI q/cord} :: post a tweet
==
++ sur-twit . :: XX
::
++ reqs
|%
++ args
|%
++ dev @t :: device name
++ gat @t :: grant type
++ lat @t :: latitude
++ lid (list tid) :: screen names
++ lon @t :: longitude
++ lsc (list scr) ::
++ lst (list @t)
++ nam @t :: location name
++ pla @t :: place-id
++ scr @t :: screen name
++ slu @t :: category name
++ tid @u :: user id
++ tok @t :: oauth token
++ url @t :: callback url
--
++ param
=> args
=< $? de fo gr id is la lo na os pl qq sc
sd ss sl si st te ti ts tr ur ui us
==
|%
++ de {$device p/dev}
++ fo {$follow p/lid}
++ gr {$grant-type p/gat}
++ id {$id p/tid}
++ is {$id p/lid}
++ la {$lat p/lat}
++ lo {$long p/lon}
++ na {$name p/lid}
++ os {$source-screen-name p/scr}
++ pl {$place-id p/pla}
++ qq {$q p/@t}
++ sc {$screen-name p/scr}
++ sd ?(ui sc)
++ ss {$screen-name p/lsc}
++ sl {$slug p/slu}
++ si {$source-id p/tid}
++ st {$status p/@t}
++ te {$text p/@t}
++ ti {$target-id p/tid}
++ ts {$target-screen-name p/scr}
++ tr {$track p/lst}
++ ur {$url p/url}
++ ui {$user-id p/tid}
++ us {$user-id p/lid}
--
::
:: the head of every element in ++doc-data is a hoon type for an endpoint
:: ++endpoint is the grand union of all of them
++ endpoint (normalize (fork-clams (heads doc-data)))
++ heads |*(a/(pole) ?~(a a [-<.a (heads +.a)]))
++ fork-clams
|* a/{_{term *} (pole _{term *})} :: ^- _{term *}
?~ +.a -.a
?(-.a (fork-clams +.a))
::
++ normalize :: XX smarter pretty-printing
|* a/_{@ *} :: ^+ a
|= b/*
^+ [?@(- . .)]:(a b)
(a b)
::
++ doc-data-dry :: staticly typed for endpoint lookup
^- (list {typ/_{term (list param)} met/?($get $post) pax/path}):param
doc-data
::
++ doc-data :: scraped from api docs, used to create types and requests
:: ^- (pole {_{term _(pole *param)} ?($get $post) path})
=> param
:~
[ {$stat-ment $~} %get /statuses/mentions-timeline ]
[ {$stat-user sd $~} %get /statuses/user-timeline ]
[ {$stat-home $~} %get /statuses/home-timeline ]
[ {$stat-retw $~} %get /statuses/retweets-of-me ]
[ {$stat-rets-iddd id $~} %get /statuses/retweets/':id' ]
[ {$stat-show id $~} %get /statuses/show ]
[ {$stat-dest-iddd id $~} %post /statuses/destroy/':id' ]
[ {$stat-upda st $~} %post /statuses/update ]
[ {$stat-retw-iddd id $~} %post /statuses/retweet/':id' ]
[ {$stat-oemb-iddd id $~} %get /statuses/oembed ]
[ {$stat-oemb-urll ur $~} %get /statuses/oembed ]
[ {$stat-retw-idss id $~} %get /statuses/retweeters/ids ]
[ {$sear-twee qq $~} %get /search/tweets ]
:- {$stat-filt-foll ?(fo tr) $~}
[%post /statuses/filter]
::
[ {$stat-samp $~} %get /statuses/sample ]
[ {$stat-fire $~} %get /statuses/firehose ]
[ {$dire $~} %get /direct-messages ]
[ {$dire-sent $~} %get /direct-messages/sent ]
[ {$dire-show id $~} %get /direct-messages/show ]
[ {$dire-dest id $~} %post /direct-messages/destroy ]
[ {$dire-neww sd te $~} %post /direct-messages/new ]
[ {$frie-nore-idss $~} %get /friendships/no-retweets/ids ]
[ {$frie-idss sd $~} %get /friends/ids ]
[ {$foll-idss sd $~} %get /followers/ids ]
[ {$frie-inco $~} %get /friendships/incoming ]
[ {$frie-outg $~} %get /friendships/outgoing ]
[ {$frie-crea sd $~} %post /friendships/create ]
[ {$frie-dest sd $~} %post /friendships/destroy ]
[ {$frie-upda sd $~} %post /friendships/update ]
:- {$frie-show ?(si os) ?(ti ts) $~}
[%get /friendships/show]
::
[ {$frie-list sd $~} %get /friends/list ]
[ {$foll-list sd $~} %get /followers/list ]
[ {$frie-look ?(us ss) $~} %get /friendships/lookup ]
[ {$acco-sett-gett $~} %get /account/settings ]
[ {$acco-veri $~} %get /account/verify-credentials ]
[ {$acco-sett-post $~} %post /account/settings ]
[ {$acco-upda-deli de $~} %post /account/update-delivery-device ]
[ {$acco-upda-prof $~} %post /account/update-profile ]
:- {$acco-upda-prof-back $~}
[%post /account/update-profile-background-image]
::
[ {$acco-upda-prof-colo $~} %post /account/update-profile-colors ]
[ {$bloc-list $~} %get /blocks/list ]
[ {$bloc-idss $~} %get /blocks/ids ]
[ {$bloc-crea sd $~} %post /blocks/create ]
[ {$bloc-dest sd $~} %post /blocks/destroy ]
[ {$user-look ?(us ss) $~} %get /users/lookup ]
[ {$user-show sd $~} %get /users/show ]
[ {$user-sear qq $~} %get /users/search ]
[ {$user-cont-tees sd $~} %get /users/contributees ]
[ {$user-cont-tors sd $~} %get /users/contributors ]
[ {$acco-remo $~} %post /account/remove-profile-banner ]
[ {$user-prof sd $~} %get /users/profile-banner ]
[ {$mute-user-crea sd $~} %post /mutes/users/create ]
[ {$mute-user-dest sd $~} %post /mutes/users/destroy ]
[ {$mute-user-idss $~} %get /mutes/users/ids ]
[ {$mute-user-list $~} %get /mutes/users/list ]
[ {$user-sugg-slug sl $~} %get /users/suggestions ]
[ {$user-sugg $~} %get /users/suggestions ]
[ {$favo-list $~} %get /favorites/list ]
[ {$favo-dest id $~} %post /favorites/destroy ]
[ {$favo-crea id $~} %post /favorites/create ]
[ {$list-list $~} %get /lists/list ]
[ {$list-stat $~} %get /lists/statuses ]
[ {$list-memb-dest $~} %post /lists/members/destroy ]
[ {$list-memb-hips sd $~} %get /lists/memberships ]
[ {$list-subs-bers $~} %get /lists/subscribers ]
[ {$list-subs-crea $~} %post /lists/subscribers/create ]
[ {$list-subs-show sd $~} %get /lists/subscribers/show ]
[ {$list-subs-dest $~} %post /lists/subscribers/destroy ]
:- {$list-memb-crea-alll ?(us ss) $~}
[%post /lists/members/create-all]
::
[ {$list-memb-show sd $~} %get /lists/members/show ]
[ {$list-memb-bers $~} %get /lists/members ]
[ {$list-memb-crea sd $~} %post /lists/members/create ]
[ {$list-dest $~} %post /lists/destroy ]
[ {$list-upda $~} %post /lists/update ]
[ {$list-crea na $~} %post /lists/create ]
[ {$list-show $~} %get /lists/show ]
[ {$list-subs-ions sd $~} %get /lists/subscriptions ]
:- {$list-memb-dest-alll ?(us ss) $~}
[%post /lists/members/destroy-all]
::
[ {$list-owne sd $~} %get /lists/ownerships ]
[ {$save-list $~} %get /saved-searches/list ]
[ {$save-show-iddd id $~} %get /saved-searches/show/':id' ]
[ {$save-crea qq $~} %post /saved-searches/create ]
[ {$save-dest-iddd id $~} %post /saved-searches/destroy/':id' ]
[ {$geoo-iddd-plac id $~} %get /geo/id/':id' ]
[ {$geoo-reve la lo $~} %get /geo/reverse-geocode ]
[ {$geoo-sear $~} %get /geo/search ]
[ {$geoo-simi la lo na $~} %get /geo/similar-places ]
[ {$tren-plac id $~} %get /trends/place ]
[ {$tren-avai $~} %get /trends/available ]
[ {$tren-clos la lo $~} %get /trends/closest ]
[ {$user-repo sd $~} %post /users/report-spam ]
[ {$help-conf $~} %get /help/configuration ]
[ {$help-lang $~} %get /help/languages ]
[ {$help-priv $~} %get /help/privacy ]
[ {$help-toss $~} %get /help/tos ]
[ {$appl-rate $~} %get /application/rate-limit-status ]
==
--
--