summaryrefslogtreecommitdiff
path: root/golang/pkg/agent/visit.go
blob: e420186e9dcd725893575acd0f751d74bdd3e924 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
package agent

import (
	"fmt"
	"slices"

	"git.adyxax.org/adyxax/spacetraders/golang/pkg/model"
)

func (a *agent) visitAllShipyards(ship *model.Ship) error {
	shipyards, err := a.listShipyardsInSystem(ship.Nav.SystemSymbol)
	if err != nil {
		return fmt.Errorf("failed to list shipyards in system %s: %w", ship.Nav.SystemSymbol, err)
	}
	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
		return a.isThereAShipAtWaypoint(shipyard.Symbol)
	})
	if len(shipyards) == 0 {
		return nil
	}
	waypoint, err := a.client.GetWaypoint(ship.Nav.WaypointSymbol)
	if err != nil {
		return fmt.Errorf("failed to get nav waypoint %s: %w", ship.Nav.WaypointSymbol, err)
	}
	waypoints := make([]model.Waypoint, 0)
	for i := range shipyards {
		waypoint, err := a.client.GetWaypoint(shipyards[i].Symbol)
		if err != nil {
			return fmt.Errorf("failed to get waypoint %s: %w", shipyards[i].Symbol, err)
		}
		waypoints = append(waypoints, *waypoint)
	}
	sortByDistanceFrom(waypoint, waypoints)
	if err := a.client.Navigate(ship, waypoints[0].Symbol); err != nil {
		return fmt.Errorf("failed to navigate to %s: %w", waypoints[0].Symbol, err)
	}
	if _, err := a.client.GetShipyard(waypoints[0].Symbol); err != nil {
		return fmt.Errorf("failed to get shipyard %s: %w", waypoints[0].Symbol, err)
	}
	// If this waypoint is also a marketplace, get its data
	for _, trait := range waypoints[0].Traits {
		if trait.Symbol == "MARKETPLACE" {
			if _, err := a.client.GetMarket(waypoints[0].Symbol); err != nil {
				return fmt.Errorf("failed to get market %s: %w", waypoints[0].Symbol, err)
			}
			break
		}
	}
	return a.visitAllShipyards(ship)
}