diff options
author | Julien Dessaux | 2025-02-12 23:55:18 +0100 |
---|---|---|
committer | Julien Dessaux | 2025-02-12 23:55:18 +0100 |
commit | 01263017fcd03fa9560ddb8a5013fdf786c7d609 (patch) | |
tree | 0179ae4f3d013f26f49182aecef65febb1fd56dc /golang/pkg | |
parent | [golang] refactor ships api (diff) | |
download | spacetraders-01263017fcd03fa9560ddb8a5013fdf786c7d609.tar.gz spacetraders-01263017fcd03fa9560ddb8a5013fdf786c7d609.tar.bz2 spacetraders-01263017fcd03fa9560ddb8a5013fdf786c7d609.zip |
[golang] implement ship refueling
Diffstat (limited to '')
-rw-r--r-- | golang/pkg/agent/agent.go | 26 | ||||
-rw-r--r-- | golang/pkg/api/ships.go | 26 | ||||
-rw-r--r-- | golang/pkg/database/sql/001_trading.sql | 30 | ||||
-rw-r--r-- | golang/pkg/database/transactions.go | 19 | ||||
-rw-r--r-- | golang/pkg/model/nav.go | 2 | ||||
-rw-r--r-- | golang/pkg/model/register.go | 4 | ||||
-rw-r--r-- | golang/pkg/model/route.go | 6 | ||||
-rw-r--r-- | golang/pkg/model/transaction.go | 14 |
8 files changed, 121 insertions, 6 deletions
diff --git a/golang/pkg/agent/agent.go b/golang/pkg/agent/agent.go new file mode 100644 index 0000000..cf96bef --- /dev/null +++ b/golang/pkg/agent/agent.go @@ -0,0 +1,26 @@ +package agent + +import ( + "sync" + + "git.adyxax.org/adyxax/spacetraders/golang/pkg/model" +) + +type Agent struct { + data *model.Agent + mutex sync.Mutex +} + +var agent Agent + +func GetAgent() *model.Agent { + agent.mutex.Lock() + defer agent.mutex.Unlock() + return agent.data +} + +func SetAgent(data *model.Agent) { + agent.mutex.Lock() + defer agent.mutex.Unlock() + agent.data = data +} diff --git a/golang/pkg/api/ships.go b/golang/pkg/api/ships.go index 08d41ac..0674b3d 100644 --- a/golang/pkg/api/ships.go +++ b/golang/pkg/api/ships.go @@ -6,6 +6,7 @@ import ( "path" "git.adyxax.org/adyxax/spacetraders/golang/pkg/agent" + "git.adyxax.org/adyxax/spacetraders/golang/pkg/database" "git.adyxax.org/adyxax/spacetraders/golang/pkg/model" ) @@ -49,3 +50,28 @@ func (c *Client) Orbit(s *model.Ship) error { s.Nav = response.Nav return nil } + +func (c *Client) Refuel(s *model.Ship, db *database.DB) error { + if s.Fuel.Current == s.Fuel.Capacity { + return nil + } + if err := c.Dock(s); err != nil { + return fmt.Errorf("failed to refuel ship %s: %w", s.Symbol, err) + } + uriRef := url.URL{Path: path.Join("my/ships", s.Symbol, "refuel")} + type RefuelResponse struct { + Agent *model.Agent `json:"agent"` + Fuel *model.Fuel `json:"fuel"` + Transaction *model.Transaction `json:"transaction"` + } + 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) + } + agent.SetAgent(response.Agent) + 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 nil +} diff --git a/golang/pkg/database/sql/001_trading.sql b/golang/pkg/database/sql/001_trading.sql new file mode 100644 index 0000000..fa8cbfe --- /dev/null +++ b/golang/pkg/database/sql/001_trading.sql @@ -0,0 +1,30 @@ +CREATE TABLE markets ( + id INTEGER PRIMARY KEY, + systemSymbol TEXT NOT NULL, + data JSON NOT NULL, + updated DATE NOT NULL +); +CREATE INDEX markets_systemSymbol on markets (systemSymbol); +CREATE UNIQUE INDEX markets_data_symbol on markets(json_extract(data, '$.symbol')); + +CREATE TABLE systems ( + id INTEGER PRIMARY KEY, + data JSON NOT NULL +); +CREATE UNIQUE INDEX systems_data_symbol on systems (json_extract(data, '$.symbol')); + +CREATE TABLE transactions ( + id INTEGER PRIMARY KEY, + data JSON NOT NULL +); +CREATE UNIQUE INDEX transactions_data_symbol on transactions (json_extract(data, '$.symbol')); +CREATE INDEX transactions_data_type on transactions (json_extract(data, '$.type')); +CREATE INDEX transactions_data_shipSymbol on transactions (json_extract(data, '$.shipSymbol')); +CREATE INDEX transactions_data_waypointSymbol on transactions (json_extract(data, '$.waypointSymbol')); + +CREATE TABLE waypoints ( + id INTEGER PRIMARY KEY, + data JSON NOT NULL, + updated DATE NOT NULL +); +CREATE UNIQUE INDEX waypoints_data_symbol on waypoints(json_extract(data, '$.symbol')); diff --git a/golang/pkg/database/transactions.go b/golang/pkg/database/transactions.go new file mode 100644 index 0000000..71719c7 --- /dev/null +++ b/golang/pkg/database/transactions.go @@ -0,0 +1,19 @@ +package database + +import ( + "encoding/json" + "fmt" + + "git.adyxax.org/adyxax/spacetraders/golang/pkg/model" +) + +func (db *DB) AppendTransaction(transaction *model.Transaction) error { + data, err := json.Marshal(transaction) + if err != nil { + 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 nil +} diff --git a/golang/pkg/model/nav.go b/golang/pkg/model/nav.go index f9bb930..a0b65c6 100644 --- a/golang/pkg/model/nav.go +++ b/golang/pkg/model/nav.go @@ -2,7 +2,7 @@ package model type Nav struct { FlightMode string `json:"flightMode"` - Route Route `json:"route"` + Route *Route `json:"route"` Status string `json:"status"` SystemSymbol string `json:"systemSymbol"` WaypointSymbol string `json:"waypointSymbol"` diff --git a/golang/pkg/model/register.go b/golang/pkg/model/register.go index cf48b8b..36604cf 100644 --- a/golang/pkg/model/register.go +++ b/golang/pkg/model/register.go @@ -1,9 +1,9 @@ package model type Register struct { - Agent Agent `json:"agent"` + Agent *Agent `json:"agent"` //contract //faction - Ship Ship `json:"ship"` + Ship *Ship `json:"ship"` Token string `json:"token"` } diff --git a/golang/pkg/model/route.go b/golang/pkg/model/route.go index 0533e61..0d104b2 100644 --- a/golang/pkg/model/route.go +++ b/golang/pkg/model/route.go @@ -3,9 +3,9 @@ package model import "time" type Route struct { - Arrival time.Time `json:"arrival"` - DepartureTime time.Time `json:"departureTime"` - Destination RouteEndpoint `json:"destination"` + Arrival time.Time `json:"arrival"` + DepartureTime time.Time `json:"departureTime"` + Destination *RouteEndpoint `json:"destination"` } type RouteEndpoint struct { diff --git a/golang/pkg/model/transaction.go b/golang/pkg/model/transaction.go new file mode 100644 index 0000000..ed98636 --- /dev/null +++ b/golang/pkg/model/transaction.go @@ -0,0 +1,14 @@ +package model + +import "time" + +type Transaction struct { + PricePerUnit int `json:"pricePerUnit"` + ShipSymbol string `json:"shipSymbol"` + Timestamp time.Time `json:"timestamp"` + TotalPrice int `json:"totalPrice"` + TradeSymbol string `json:"tradeSymbol"` + Type string `json:"type"` + Units int `json:"units"` + WaypointSymbol string `json:"waypointSymbol"` +} |