summaryrefslogtreecommitdiff
path: root/golang/pkg/agent/run.go
diff options
context:
space:
mode:
Diffstat (limited to 'golang/pkg/agent/run.go')
-rw-r--r--golang/pkg/agent/run.go78
1 files changed, 78 insertions, 0 deletions
diff --git a/golang/pkg/agent/run.go b/golang/pkg/agent/run.go
new file mode 100644
index 0000000..db4c614
--- /dev/null
+++ b/golang/pkg/agent/run.go
@@ -0,0 +1,78 @@
+package agent
+
+import (
+ "errors"
+ "fmt"
+ "log/slog"
+
+ "git.adyxax.org/adyxax/spacetraders/golang/pkg/api"
+ "git.adyxax.org/adyxax/spacetraders/golang/pkg/database"
+)
+
+func Run(
+ apiClient *api.Client,
+ db *database.DB,
+ getenv func(string) string,
+) error {
+ accountToken := getenv("SPACETRADERS_ACCOUNT_TOKEN")
+ if accountToken == "" {
+ return fmt.Errorf("the SPACETRADERS_ACCOUNT_TOKEN environment variable is not set")
+ }
+ agent := getenv("SPACETRADERS_AGENT")
+ if agent == "" {
+ return fmt.Errorf("the SPACETRADERS_AGENT environment variable is not set")
+ }
+ faction := getenv("SPACETRADERS_FACTION")
+ if faction == "" {
+ return fmt.Errorf("the SPACETRADERS_FACTION environment variable is not set")
+ }
+ // ----- Get token or register ---------------------------------------------
+ apiClient.SetToken(accountToken)
+ register, err := apiClient.Register(faction, agent)
+ if err != nil {
+ apiError := &api.APIError{}
+ if errors.As(err, &apiError) {
+ switch apiError.Code {
+ case 4111: // Agent symbol has already been claimed
+ token, err := db.GetToken()
+ if err != nil || token == "" {
+ return fmt.Errorf("failed to register and failed to get a token from the database: someone stole our agent's callsign: %w", err)
+ }
+ apiClient.SetToken(token)
+ agent, err := apiClient.MyAgent()
+ if err != nil {
+ return fmt.Errorf("failed to get agent: %w", err)
+ }
+ slog.Info("agent", "/my/agent", agent)
+ default:
+ return fmt.Errorf("failed to register: %w", err)
+ }
+ } else {
+ return fmt.Errorf("failed to register with an invalid apiError: %w", err)
+ }
+ } else {
+ token, err := db.GetToken()
+ if err != nil || token == "" {
+ if err := db.AddToken(register.Token); err != nil {
+ return fmt.Errorf("failed to save token: %w", err)
+ }
+ apiClient.SetToken(register.Token)
+ } else {
+ // We successfully registered but have a tainted database
+ slog.Error("token", "token", register.Token)
+ return fmt.Errorf("TODO server reset not implemented yet")
+ }
+ }
+ // ----- run agent ---------------------------------------------------------
+ contracts, err := apiClient.MyContracts()
+ if err != nil {
+ return err
+ }
+ slog.Info("start", "contract", contracts[0], "err", err)
+ ships, err := apiClient.MyShips()
+ if err != nil {
+ return err
+ }
+ slog.Info("start", "ship", ships[0].Nav.Status, "err", err)
+ return nil
+}