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.