diff options
Diffstat (limited to '')
-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) } |