summaryrefslogtreecommitdiff
path: root/golang/pkg/agent/init.go
diff options
context:
space:
mode:
authorJulien Dessaux2025-02-14 00:14:15 +0100
committerJulien Dessaux2025-02-14 00:14:15 +0100
commitd97985a694b218713ddf63ed684b6a509f931f3b (patch)
tree84609f4e242419bf89301e0ead4927f450d7bfe5 /golang/pkg/agent/init.go
parent[golang] Bootstrap contracting and refactor the agent code (diff)
downloadspacetraders-d97985a694b218713ddf63ed684b6a509f931f3b.tar.gz
spacetraders-d97985a694b218713ddf63ed684b6a509f931f3b.tar.bz2
spacetraders-d97985a694b218713ddf63ed684b6a509f931f3b.zip
[golang] implement automation loop and add contract accepting
Diffstat (limited to 'golang/pkg/agent/init.go')
-rw-r--r--golang/pkg/agent/init.go60
1 files changed, 60 insertions, 0 deletions
diff --git a/golang/pkg/agent/init.go b/golang/pkg/agent/init.go
new file mode 100644
index 0000000..30b18e9
--- /dev/null
+++ b/golang/pkg/agent/init.go
@@ -0,0 +1,60 @@
+package agent
+
+import (
+ "errors"
+ "fmt"
+ "log/slog"
+
+ "git.adyxax.org/adyxax/spacetraders/golang/pkg/api"
+ "git.adyxax.org/adyxax/spacetraders/golang/pkg/model"
+)
+
+func (a *agent) init() error {
+ token, err := a.db.GetToken()
+ if err == nil && token != "" {
+ a.client.SetToken(token)
+ var agent *model.Agent
+ agent, err = a.client.MyAgent() // we need err to carry over outside this block
+ if err == nil {
+ slog.Info("agent", "/my/agent", agent)
+ } else {
+ slog.Info("failed to get agent, handling server reset", "err", err)
+ a.db.Reset()
+ }
+ }
+ if err != nil || token == "" {
+ // No token or invalid token (since we carry over the error of MyAgent() in the previous if), we need to register
+ accountToken := a.getenv("SPACETRADERS_ACCOUNT_TOKEN")
+ if accountToken == "" {
+ return fmt.Errorf("the SPACETRADERS_ACCOUNT_TOKEN environment variable is not set")
+ }
+ a.client.SetToken(accountToken)
+ agent := a.getenv("SPACETRADERS_AGENT")
+ if agent == "" {
+ return fmt.Errorf("the SPACETRADERS_AGENT environment variable is not set")
+ }
+ faction := a.getenv("SPACETRADERS_FACTION")
+ if faction == "" {
+ return fmt.Errorf("the SPACETRADERS_FACTION environment variable is not set")
+ }
+ register, err := a.client.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
+ return fmt.Errorf("failed to register and failed to get a token from the database: someone stole our agent's callsign: %w", err)
+ default:
+ return fmt.Errorf("failed to register: %w", err)
+ }
+ } else {
+ return fmt.Errorf("failed to register with an invalid apiError: %w", err)
+ }
+ }
+ a.client.SetToken(register.Token)
+ if err := a.db.SaveToken(register.Token); err != nil {
+ return fmt.Errorf("failed to save token %s after a successful registration: %w", register.Token, err)
+ }
+ }
+ return nil
+}