summaryrefslogtreecommitdiff
path: root/golang/pkg/agent/visit.go
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--golang/pkg/agent/visit.go45
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)
}