Here's an example of a thread that scries ames for the IP address & port of a ship and nicely prints it:
get-ip.hoon
/- spider/+ strandio=, strand=strand:spider=, strand-fail=strand-fail:libstrand:spider|%++ process-lanes|= [target=@p lanes=(list lane:ames)]=/ m (strand ,~)^- form:m?~ `(list lane:ames)`lanes%- (slog leaf+"No route for {(scow %p target)}." ~)(pure:m ~)=/ lroute (skip lanes |=(a=lane:ames -.a))?~ lroute%- (slog leaf+"No direct route for {(scow %p target)}." ~)(pure:m ~)=/ ip +:(scow %if p.i.lroute)=/ port (skip (scow %ud (cut 5 [1 1] p.i.lroute)) |=(a=@tD =(a '.')))%- (slog leaf+"{ip}:{port}" ~)(pure:m ~)--^- thread:spider|= arg=vase=/ m (strand ,vase)^- form:m=/ utarget !< (unit @p) arg?~ utarget(strand-fail %no-arg ~)=/ target u.utarget;< lanes=(list lane:ames) bind:m (scry:strandio (list lane:ames) /ax//peers/(scot %p target)/forward-lane);< ~ bind:m (process-lanes target lanes)(pure:m !>(~))
Note: Pretty useless on a fake ship.
Save as ted/get-ip.hoon
in the %base
desk, |commit %base
, and run it with -get-ip ~bitbet-bolbel
. You should see something like:
34.83.113.220:60659
Analysis
Here we use the strandio
function scry
which takes an argument of [mold path]
where:
mold
is the return type of the scrypath
is the scry path formatted like:- vane letter and care
- desk if scrying arvo or agent if scrying a gall agent
- rest of path
In our case the mold is (list lane:ames)
and the path is /ax//peers/(scot %p target)/forward-lane
like:
;< lanes=(list lane:ames) bind:m (scry:strandio (list lane:ames) /ax//peers/(scot %p target)/forward-lane)
After that we just process the result in ++ process-lanes
and print it.