summaryrefslogtreecommitdiff
path: root/golang
diff options
context:
space:
mode:
authorJulien Dessaux2025-02-12 23:55:18 +0100
committerJulien Dessaux2025-02-12 23:55:18 +0100
commit01263017fcd03fa9560ddb8a5013fdf786c7d609 (patch)
tree0179ae4f3d013f26f49182aecef65febb1fd56dc /golang
parent[golang] refactor ships api (diff)
downloadspacetraders-01263017fcd03fa9560ddb8a5013fdf786c7d609.tar.gz
spacetraders-01263017fcd03fa9560ddb8a5013fdf786c7d609.tar.bz2
spacetraders-01263017fcd03fa9560ddb8a5013fdf786c7d609.zip
[golang] implement ship refueling
Diffstat (limited to '')
-rw-r--r--golang/pkg/agent/agent.go26
-rw-r--r--golang/pkg/api/ships.go26
-rw-r--r--golang/pkg/database/sql/001_trading.sql30
-rw-r--r--golang/pkg/database/transactions.go19
-rw-r--r--golang/pkg/model/nav.go2
-rw-r--r--golang/pkg/model/register.go4
-rw-r--r--golang/pkg/model/route.go6
-rw-r--r--golang/pkg/model/transaction.go14
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"`
+}