summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--golang/pkg/agent/contracting.go28
-rw-r--r--golang/pkg/agent/run.go10
-rw-r--r--golang/pkg/agent/utils.go10
-rw-r--r--golang/pkg/agent/visit.go10
-rw-r--r--golang/pkg/api/contracts.go2
-rw-r--r--golang/pkg/api/ships.go20
-rw-r--r--golang/pkg/api/systems.go16
-rw-r--r--golang/pkg/database/shipyards.go4
-rw-r--r--golang/pkg/database/systems.go14
-rw-r--r--golang/pkg/database/transactions.go2
10 files changed, 66 insertions, 50 deletions
diff --git a/golang/pkg/agent/contracting.go b/golang/pkg/agent/contracting.go
index a3eb7aa..6d67d6d 100644
--- a/golang/pkg/agent/contracting.go
+++ b/golang/pkg/agent/contracting.go
@@ -21,12 +21,12 @@ func (a *agent) autoContracting(ship *model.Ship) {
now := time.Now()
if now.Before(contract.Terms.Deadline) {
if err := a.runContract(&contract, ship); err != nil {
- a.channel <- fmt.Errorf("failed to run contracts with ship %s: %w", ship.Symbol, err)
+ a.channel <- fmt.Errorf("failed to run contract %s with ship %s: %w", contract.Id, ship.Symbol, err)
return
}
}
}
- a.channel <- fmt.Errorf("failed to run contracts: negotiating new contracts is not implemented yet")
+ a.channel <- fmt.Errorf("negotiating new contracts is not implemented yet")
// TODO
//for {
// negotiate
@@ -36,14 +36,30 @@ func (a *agent) autoContracting(ship *model.Ship) {
func (a *agent) runContract(contract *model.Contract, ship *model.Ship) error {
if err := a.client.Accept(contract, a.db); err != nil {
- return fmt.Errorf("failed to run contract: %w", err)
+ return fmt.Errorf("failed to accept contract: %w", err)
}
//slog.Info("running contract", "contract", contract, "ship", ship.Symbol)
switch contract.Type {
- // TODO
- //case "PROCUREMENT":
+ case "PROCUREMENT":
+ if err := a.runProcurement(contract, ship); err != nil {
+ return fmt.Errorf("failed to run procurement: %w", err)
+ }
default:
- return fmt.Errorf("failed to run contract: handling contracts of type %s is not implemented yet", contract.Type)
+ return fmt.Errorf("handling contracts of type %s is not implemented yet", contract.Type)
}
return nil
}
+
+func (a *agent) runProcurement(contract *model.Contract, ship *model.Ship) error {
+ deliveryCargo := contract.Terms.Deliver[0].TradeSymbol
+ deliveryWaypoint, err := a.client.GetWaypoint(contract.Terms.Deliver[0].DestinationSymbol, a.db)
+ if err != nil {
+ return fmt.Errorf("failed to get delivery waypoint: %w", err)
+ }
+ for !contract.Fullfilled {
+ _ = deliveryCargo
+ _ = deliveryWaypoint
+ return fmt.Errorf("not implemented")
+ }
+ return fmt.Errorf("not implemented")
+}
diff --git a/golang/pkg/agent/run.go b/golang/pkg/agent/run.go
index 7d7c3a1..0591102 100644
--- a/golang/pkg/agent/run.go
+++ b/golang/pkg/agent/run.go
@@ -44,7 +44,7 @@ func Run(
}
if agent.ships, err = client.MyShips(); err != nil {
- return fmt.Errorf("failed to init the agent's ships: %w", err)
+ return fmt.Errorf("failed to get my ships: %w", err)
}
var state State = start_running_contracts_with_the_command_ship
agent.wg.Add(1)
@@ -58,18 +58,18 @@ func Run(
state++
case visit_all_shipyards_with_the_starting_probe:
if err := agent.visitAllShipyards(&agent.ships[1]); err != nil {
- agent.channel <- fmt.Errorf("failed agent run: %w", err)
+ agent.channel <- fmt.Errorf("failed to visit all shipyards with ship %s: %w", agent.ships[1].Symbol, err)
return
}
state++
case send_the_starting_probe_to_a_shipyard_that_sells_probes:
if err := agent.sendShipToShipyardThatSells(&agent.ships[1], "SHIP_PROBE"); err != nil {
- agent.channel <- fmt.Errorf("failed agent run: %w", err)
+ agent.channel <- fmt.Errorf("failed to send the starting probe to a shipyard that sells probes: %w", err)
return
}
state++
default:
- agent.channel <- fmt.Errorf("agent runner reach an unknown state: %d", state)
+ agent.channel <- fmt.Errorf("state not implemented: %d", state)
return
}
}
@@ -79,7 +79,7 @@ func Run(
go func() {
defer errWg.Done()
for err := range agent.channel {
- slog.Error("error", "err", err)
+ slog.Error("agent run error", "err", err)
}
}()
agent.wg.Wait()
diff --git a/golang/pkg/agent/utils.go b/golang/pkg/agent/utils.go
index 2ad3b44..274e973 100644
--- a/golang/pkg/agent/utils.go
+++ b/golang/pkg/agent/utils.go
@@ -27,7 +27,7 @@ func (a *agent) isThereAShipAtWaypoint(waypointSymbol string) bool {
func (a *agent) listWaypointsInSystemWithTrait(systemSymbol string, trait string) ([]model.Waypoint, error) {
waypoints, err := a.client.ListWaypointsInSystem(systemSymbol, a.db)
if err != nil {
- return nil, fmt.Errorf("failed to list waypoints with trait: %w", err)
+ return nil, fmt.Errorf("failed to list waypoints: %w", err)
}
waypoints = slices.DeleteFunc(waypoints, func(waypoint model.Waypoint) bool {
for _, t := range waypoint.Traits {
@@ -43,13 +43,13 @@ func (a *agent) listWaypointsInSystemWithTrait(systemSymbol string, trait string
func (a *agent) listShipyardsInSystem(systemSymbol string) ([]model.Shipyard, error) {
waypoints, err := a.listWaypointsInSystemWithTrait(systemSymbol, "SHIPYARD")
if err != nil {
- return nil, fmt.Errorf("failed to list shipyards in system %s: %w", systemSymbol, err)
+ return nil, fmt.Errorf("failed to list waypoints in system %s with trait SHIPYARD: %w", systemSymbol, err)
}
var shipyards []model.Shipyard
for i := range waypoints {
shipyard, err := a.client.GetShipyard(&waypoints[i], a.db)
if err != nil {
- return nil, fmt.Errorf("failed to list shipyards in system %s: %w", systemSymbol, err)
+ return nil, fmt.Errorf("failed to get shipyard %s: %w", waypoints[i].Symbol, err)
}
shipyards = append(shipyards, *shipyard)
}
@@ -59,7 +59,7 @@ func (a *agent) listShipyardsInSystem(systemSymbol string) ([]model.Shipyard, er
func (a *agent) sendShipToShipyardThatSells(ship *model.Ship, shipType string) error {
shipyards, err := a.listShipyardsInSystem(ship.Nav.SystemSymbol)
if err != nil {
- return fmt.Errorf("failed to send ship %s to a shipyard that sells %s: %w", ship.Symbol, shipType, err)
+ return fmt.Errorf("failed to list shipyards in system %s: %w", ship.Nav.SystemSymbol, err)
}
// filter out the shipyards that do not sell our ship
shipyards = slices.DeleteFunc(shipyards, func(shipyard model.Shipyard) bool {
@@ -89,7 +89,7 @@ func (a *agent) sendShipToShipyardThatSells(ship *model.Ship, shipType string) e
return cmp.Compare(aPrice, bPrice)
})
if err := a.client.Navigate(ship, shipyards[0].Symbol, a.db); err != nil {
- return fmt.Errorf("failed to send ship %s to a shipyard that sells %s: %w", ship.Symbol, shipType, err)
+ return fmt.Errorf("failed to navigate to %s: %w", shipyards[0].Symbol, err)
}
return nil
}
diff --git a/golang/pkg/agent/visit.go b/golang/pkg/agent/visit.go
index 448b885..4d79fef 100644
--- a/golang/pkg/agent/visit.go
+++ b/golang/pkg/agent/visit.go
@@ -10,7 +10,7 @@ import (
func (a *agent) visitAllShipyards(ship *model.Ship) error {
shipyards, err := a.listShipyardsInSystem(ship.Nav.SystemSymbol)
if err != nil {
- return fmt.Errorf("failed to visit all shipyards: %w", err)
+ 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
@@ -25,22 +25,22 @@ func (a *agent) visitAllShipyards(ship *model.Ship) error {
}
waypoint, err := a.client.GetWaypoint(ship.Nav.WaypointSymbol, a.db)
if err != nil {
- return fmt.Errorf("failed to visit all shipyards: %w", err)
+ 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, a.db)
if err != nil {
- return fmt.Errorf("failed to visit all shipyards: %w", err)
+ 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, a.db); err != nil {
- return fmt.Errorf("failed to visit all shipyards: %w", err)
+ return fmt.Errorf("failed to navigate to %s: %w", waypoints[0].Symbol, err)
}
if _, err := a.client.GetShipyard(&waypoints[0], a.db); err != nil {
- return fmt.Errorf("failed to visit all shipyards: %w", err)
+ return fmt.Errorf("failed to get shipyard %s: %w", waypoints[0].Symbol, err)
}
// TODO get market data
return a.visitAllShipyards(ship)
diff --git a/golang/pkg/api/contracts.go b/golang/pkg/api/contracts.go
index 9478d4f..573d938 100644
--- a/golang/pkg/api/contracts.go
+++ b/golang/pkg/api/contracts.go
@@ -34,7 +34,7 @@ func (c *Client) MyContracts() ([]model.Contract, error) {
uriRef := url.URL{Path: "my/contracts"}
var contracts []model.Contract
if err := c.Send("GET", &uriRef, nil, &contracts); err != nil {
- return nil, fmt.Errorf("failed to get contracts: %w", err)
+ return nil, fmt.Errorf("failed API request: %w", err)
}
return contracts, nil
}
diff --git a/golang/pkg/api/ships.go b/golang/pkg/api/ships.go
index 83b4e7f..67a1ebd 100644
--- a/golang/pkg/api/ships.go
+++ b/golang/pkg/api/ships.go
@@ -20,7 +20,7 @@ func (c *Client) dock(s *model.Ship) error {
}
var response dockResponse
if err := c.Send("POST", &uriRef, nil, &response); err != nil {
- return fmt.Errorf("failed to dock ship %s: %w", s.Symbol, err)
+ return fmt.Errorf("failed API request: %w", err)
}
s.Nav = response.Nav
return nil
@@ -30,7 +30,7 @@ func (c *Client) MyShips() ([]model.Ship, error) {
uriRef := url.URL{Path: "my/ships"}
var ships []model.Ship
if err := c.Send("GET", &uriRef, nil, &ships); err != nil {
- return nil, fmt.Errorf("failed to get ships: %w", err)
+ return nil, fmt.Errorf("failed API request: %w", err)
}
return ships, nil
}
@@ -40,7 +40,7 @@ func (c *Client) Navigate(s *model.Ship, waypointSymbol string, db *database.DB)
return nil
}
if err := c.orbit(s); err != nil {
- return fmt.Errorf("failed to navigate ship %s to %s: %w", s.Symbol, waypointSymbol, err)
+ return fmt.Errorf("failed to orbit: %w", err)
}
// TODO shortest path
// TODO go refuel if necessary
@@ -55,13 +55,13 @@ func (c *Client) Navigate(s *model.Ship, waypointSymbol string, db *database.DB)
}
var response navigateResponse
if err := c.Send("POST", &uriRef, navigateRequest{waypointSymbol}, &response); err != nil {
- return fmt.Errorf("failed to navigate ship %s to %s: %w", s.Symbol, waypointSymbol, err)
+ return fmt.Errorf("failed API request: %w", err)
}
s.Fuel = response.Fuel
s.Nav = response.Nav
select {
case <-c.ctx.Done():
- return fmt.Errorf("failed to navigate ship %s to %s: ctx cancelled", s.Symbol, waypointSymbol)
+ return fmt.Errorf("failed: context cancelled")
case <-time.After(s.Nav.Route.Arrival.Sub(time.Now())):
}
s.Nav.Status = "IN_ORBIT"
@@ -78,7 +78,7 @@ func (c *Client) orbit(s *model.Ship) error {
}
var response orbitResponse
if err := c.Send("POST", &uriRef, nil, &response); err != nil {
- return fmt.Errorf("failed to orbit ship %s: %w", s.Symbol, err)
+ return fmt.Errorf("failed API request: %w", err)
}
s.Nav = response.Nav
return nil
@@ -89,7 +89,7 @@ func (c *Client) refuel(s *model.Ship, db *database.DB) error {
return nil
}
if err := c.dock(s); err != nil {
- return fmt.Errorf("failed to refuel ship %s: %w", s.Symbol, err)
+ return fmt.Errorf("failed to dock: %w", err)
}
uriRef := url.URL{Path: path.Join("my/ships", s.Symbol, "refuel")}
type refuelResponse struct {
@@ -99,14 +99,14 @@ func (c *Client) refuel(s *model.Ship, db *database.DB) error {
}
var response refuelResponse
if err := c.Send("POST", &uriRef, nil, &response); err != nil {
- return fmt.Errorf("failed to refuel ship %s: %w", s.Symbol, err)
+ return fmt.Errorf("failed API request: %w", err)
}
if err := db.SaveAgent(response.Agent); err != nil {
- return fmt.Errorf("failed to refuel ship %s: %w", s.Symbol, err)
+ return fmt.Errorf("failed to save agent: %w", err)
}
s.Fuel = response.Fuel
if err := db.AppendTransaction(response.Transaction); err != nil {
- return fmt.Errorf("failed to refuel ship %s: %w", s.Symbol, err)
+ return fmt.Errorf("failed to append transaction: %w", err)
}
return nil
}
diff --git a/golang/pkg/api/systems.go b/golang/pkg/api/systems.go
index 5f5def6..840f32e 100644
--- a/golang/pkg/api/systems.go
+++ b/golang/pkg/api/systems.go
@@ -16,10 +16,10 @@ func (c *Client) GetSystem(symbol string, db *database.DB) (*model.System, error
uriRef := url.URL{Path: path.Join("systems", symbol)}
var system model.System
if err := c.Send("GET", &uriRef, nil, &system); err != nil {
- return nil, fmt.Errorf("failed to get system %s: %w", symbol, err)
+ return nil, fmt.Errorf("failed API request: %w", err)
}
if err := db.SaveSystem(&system); err != nil {
- return nil, fmt.Errorf("failed to get system %s: %w", symbol, err)
+ return nil, fmt.Errorf("failed to save system %s: %w", system.Symbol, err)
}
return &system, nil
}
@@ -33,10 +33,10 @@ func (c *Client) GetShipyard(waypoint *model.Waypoint, db *database.DB) (*model.
uriRef := url.URL{Path: path.Join("systems", waypoint.SystemSymbol, "waypoints", waypoint.Symbol, "shipyard")}
var shipyard model.Shipyard
if err := c.Send("GET", &uriRef, nil, &shipyard); err != nil {
- return nil, fmt.Errorf("failed to get shipyard at %s: %w", waypoint.Symbol, err)
+ return nil, fmt.Errorf("failed API request: %w", err)
}
if err := db.SaveShipyard(&shipyard); err != nil {
- return nil, fmt.Errorf("failed to get shipyard at %s: %w", waypoint.Symbol, err)
+ return nil, fmt.Errorf("failed to save shipyard %s: %w", shipyard.Symbol, err)
}
return &shipyard, nil
}
@@ -50,10 +50,10 @@ func (c *Client) GetWaypoint(symbol string, db *database.DB) (*model.Waypoint, e
uriRef := url.URL{Path: path.Join("systems", systemSymbol, "waypoints", symbol)}
var waypoint model.Waypoint
if err := c.Send("GET", &uriRef, nil, &waypoint); err != nil {
- return nil, fmt.Errorf("failed to get waypoint %s: %w", symbol, err)
+ return nil, fmt.Errorf("failed API request: %w", err)
}
if err := db.SaveWaypoint(&waypoint); err != nil {
- return nil, fmt.Errorf("failed to get waypoint %s: %w", symbol, err)
+ return nil, fmt.Errorf("failed to save waypoint %s: %w", waypoint.Symbol, err)
}
return &waypoint, nil
}
@@ -66,11 +66,11 @@ func (c *Client) ListWaypointsInSystem(systemSymbol string, db *database.DB) ([]
uriRef := url.URL{Path: path.Join("systems", systemSymbol, "waypoints")}
var waypoints []model.Waypoint
if err := c.Send("GET", &uriRef, nil, &waypoints); err != nil {
- return nil, fmt.Errorf("failed to list waypoints in system %s: %w", systemSymbol, err)
+ return nil, fmt.Errorf("failed API request: %w", err)
}
for _, waypoint := range waypoints {
if err := db.SaveWaypoint(&waypoint); err != nil {
- return nil, fmt.Errorf("failed to list waypoints in system %s: %w", systemSymbol, err)
+ return nil, fmt.Errorf("failed to save waypoint %s: %w", waypoint.Symbol, err)
}
}
return waypoints, nil
diff --git a/golang/pkg/database/shipyards.go b/golang/pkg/database/shipyards.go
index 8dd801e..4d44f9a 100644
--- a/golang/pkg/database/shipyards.go
+++ b/golang/pkg/database/shipyards.go
@@ -12,7 +12,7 @@ import (
func (db *DB) LoadShipyard(symbol string) (*model.Shipyard, error) {
var buf []byte
if err := db.QueryRow(`SELECT data FROM shipyards WHERE data->>'symbol' = ?;`, symbol).Scan(&buf); err != nil {
- return nil, fmt.Errorf("failed to query shipyard: %w", err)
+ return nil, fmt.Errorf("failed to query row: %w", err)
}
var shipyard model.Shipyard
if err := json.Unmarshal(buf, &shipyard); err != nil {
@@ -36,7 +36,7 @@ func (db *DB) SaveShipyard(shipyard *model.Shipyard) error {
sql.Named("updated", time.Now()),
)
if err != nil {
- return fmt.Errorf("failed to append shipyard: %w", err)
+ return fmt.Errorf("failed to exec: %w", err)
}
return nil
}
diff --git a/golang/pkg/database/systems.go b/golang/pkg/database/systems.go
index 92869db..b5d533b 100644
--- a/golang/pkg/database/systems.go
+++ b/golang/pkg/database/systems.go
@@ -12,7 +12,7 @@ import (
func (db *DB) LoadSystem(symbol string) (*model.System, error) {
var buf []byte
if err := db.QueryRow(`SELECT data FROM systems WHERE data->>'symbol' = ?;`, symbol).Scan(&buf); err != nil {
- return nil, fmt.Errorf("failed to query system: %w", err)
+ return nil, fmt.Errorf("failed to query row: %w", err)
}
var system model.System
if err := json.Unmarshal(buf, &system); err != nil {
@@ -27,7 +27,7 @@ func (db *DB) SaveSystem(system *model.System) error {
return fmt.Errorf("failed to marshal system: %w", err)
}
if _, err := db.Exec(`INSERT INTO systems(data) VALUES (json(?));`, data); err != nil {
- return fmt.Errorf("failed to append system: %w", err)
+ return fmt.Errorf("failed to exec: %w", err)
}
return nil
}
@@ -36,7 +36,7 @@ func (db *DB) SaveSystem(system *model.System) error {
func (db *DB) LoadWaypoint(symbol string) (*model.Waypoint, error) {
var buf []byte
if err := db.QueryRow(`SELECT data FROM waypoints WHERE data->>'symbol' = ?;`, symbol).Scan(&buf); err != nil {
- return nil, fmt.Errorf("failed to query waypoint: %w", err)
+ return nil, fmt.Errorf("failed to query row: %w", err)
}
var waypoint model.Waypoint
if err := json.Unmarshal(buf, &waypoint); err != nil {
@@ -48,14 +48,14 @@ func (db *DB) LoadWaypoint(symbol string) (*model.Waypoint, error) {
func (db *DB) LoadWaypointsInSystem(systemSymbol string) ([]model.Waypoint, error) {
rows, err := db.Query(`SELECT data FROM waypoints WHERE data->>'systemSymbol' = ?;`, systemSymbol)
if err != nil {
- return nil, fmt.Errorf("failed to query waypoints: %w", err)
+ return nil, fmt.Errorf("failed to query rows: %w", err)
}
defer rows.Close()
waypoints := make([]model.Waypoint, 0)
for rows.Next() {
var buf []byte
if err := rows.Scan(&buf); err != nil {
- return nil, fmt.Errorf("failed to load waypoint from row: %w", err)
+ return nil, fmt.Errorf("failed to scan row: %w", err)
}
var waypoint model.Waypoint
if err := json.Unmarshal(buf, &waypoint); err != nil {
@@ -64,7 +64,7 @@ func (db *DB) LoadWaypointsInSystem(systemSymbol string) ([]model.Waypoint, erro
waypoints = append(waypoints, waypoint)
}
if err := rows.Err(); err != nil {
- return nil, fmt.Errorf("failed to load waypoints from rows: %w", err)
+ return nil, fmt.Errorf("failed to scan rows: %w", err)
}
return waypoints, nil
}
@@ -75,7 +75,7 @@ func (db *DB) SaveWaypoint(waypoint *model.Waypoint) error {
return fmt.Errorf("failed to marshal waypoint: %w", err)
}
if _, err := db.Exec(`INSERT INTO waypoints(data, updated) VALUES (json(?), ?);`, data, time.Now()); err != nil {
- return fmt.Errorf("failed to append waypoint: %w", err)
+ return fmt.Errorf("failed to exec: %w", err)
}
return nil
}
diff --git a/golang/pkg/database/transactions.go b/golang/pkg/database/transactions.go
index 71719c7..08278a1 100644
--- a/golang/pkg/database/transactions.go
+++ b/golang/pkg/database/transactions.go
@@ -13,7 +13,7 @@ func (db *DB) AppendTransaction(transaction *model.Transaction) error {
return fmt.Errorf("failed to marshal transaction: %w", err)
}
if _, err := db.Exec(`INSERT INTO transactions(data) VALUES (json(?));`, data); err != nil {
- return fmt.Errorf("failed to append transaction: %w", err)
+ return fmt.Errorf("failed to exec: %w", err)
}
return nil
}