diff options
author | Julien Dessaux | 2025-02-14 00:14:15 +0100 |
---|---|---|
committer | Julien Dessaux | 2025-02-14 00:14:15 +0100 |
commit | d97985a694b218713ddf63ed684b6a509f931f3b (patch) | |
tree | 84609f4e242419bf89301e0ead4927f450d7bfe5 /golang/pkg/agent/init.go | |
parent | [golang] Bootstrap contracting and refactor the agent code (diff) | |
download | spacetraders-d97985a694b218713ddf63ed684b6a509f931f3b.tar.gz spacetraders-d97985a694b218713ddf63ed684b6a509f931f3b.tar.bz2 spacetraders-d97985a694b218713ddf63ed684b6a509f931f3b.zip |
[golang] implement automation loop and add contract accepting
Diffstat (limited to '')
-rw-r--r-- | golang/pkg/agent/init.go | 60 |
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 +} |