diff options
author | Julien Dessaux | 2025-02-17 00:40:43 +0100 |
---|---|---|
committer | Julien Dessaux | 2025-02-17 00:40:43 +0100 |
commit | bd2fb50c819c2b180758308ef3751e7ea73e6ab7 (patch) | |
tree | 19632f7098691a1147357039a5efedf7c40a8d53 /golang/pkg/agent/visit.go | |
parent | [golang] handle paginated requests (diff) | |
download | spacetraders-bd2fb50c819c2b180758308ef3751e7ea73e6ab7.tar.gz spacetraders-bd2fb50c819c2b180758308ef3751e7ea73e6ab7.tar.bz2 spacetraders-bd2fb50c819c2b180758308ef3751e7ea73e6ab7.zip |
[golang] implement shipyards visits
Diffstat (limited to 'golang/pkg/agent/visit.go')
-rw-r--r-- | golang/pkg/agent/visit.go | 45 |
1 files changed, 38 insertions, 7 deletions
diff --git a/golang/pkg/agent/visit.go b/golang/pkg/agent/visit.go index 019a6e5..2401b8d 100644 --- a/golang/pkg/agent/visit.go +++ b/golang/pkg/agent/visit.go @@ -2,7 +2,7 @@ package agent import ( "fmt" - "log/slog" + "slices" "git.adyxax.org/adyxax/spacetraders/golang/pkg/model" ) @@ -12,13 +12,44 @@ func (a *agent) visitAllShipyards(ship *model.Ship) error { if err != nil { return fmt.Errorf("failed to visit all shipyards: %w", err) } - waypoints, err := a.client.ListWaypointsInSystem(system, a.db) + shipyards, err := a.listShipyardsInSystem(system) if err != nil { return fmt.Errorf("failed to visit all shipyards: %w", err) } - //slog.Info("get system", "system", system.Waypoints, "err", err) - //waypoint, err := a.client.GetWaypoint("X1-RR14-J88", a.db) - slog.Info("get waypoint", "waypoint", waypoints[0]) - - return fmt.Errorf("failed to visit all shipyards: not implemented yet") + shipyards = slices.DeleteFunc(shipyards, func(shipyard model.Shipyard) bool { + // filter out shipyards for which we already have ships prices + if shipyard.Ships != nil { + return true + } + // filter out shipyards for which a ship is either present or inbound + waypoint, err := a.client.GetWaypoint(shipyard.Symbol, a.db) + if err != nil { + panic(fmt.Errorf("failed to visit all shipyards: %w", err)) + } + return a.isThereAShipAtWaypoint(waypoint) + }) + if len(shipyards) == 0 { + return nil + } + waypoint, err := a.client.GetWaypoint(ship.Nav.WaypointSymbol, a.db) + if err != nil { + return fmt.Errorf("failed to visit all shipyards: %w", err) + } + waypoints := make([]model.Waypoint, 0) + for i := range shipyards { + waypoint, err := a.client.GetWaypoint(shipyards[i].Symbol, a.db) + if err != nil { + return fmt.Errorf("failed to visit all shipyards: %w", err) + } + waypoints = append(waypoints, *waypoint) + } + sortByDistanceFrom(*waypoint, waypoints) + if err := a.client.Navigate(ship, &waypoints[0], a.db); err != nil { + return fmt.Errorf("failed to visit all shipyards: %w", err) + } + if _, err := a.client.GetShipyard(&waypoints[0], a.db); err != nil { + return fmt.Errorf("failed to visit all shipyards: %w", err) + } + // TODO get market data + return a.visitAllShipyards(ship) } |