From 3dad3f60f280289dee1b34ae04744f244d070bf7 Mon Sep 17 00:00:00 2001 From: Julien Dessaux Date: Thu, 13 Feb 2025 21:35:32 +0100 Subject: [golang] Bootstrap contracting and refactor the agent code --- golang/pkg/agent/agent.go | 26 ---------------- golang/pkg/agent/run.go | 78 +++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 78 insertions(+), 26 deletions(-) delete mode 100644 golang/pkg/agent/agent.go create mode 100644 golang/pkg/agent/run.go (limited to 'golang/pkg/agent') diff --git a/golang/pkg/agent/agent.go b/golang/pkg/agent/agent.go deleted file mode 100644 index cf96bef..0000000 --- a/golang/pkg/agent/agent.go +++ /dev/null @@ -1,26 +0,0 @@ -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/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 +} -- cgit v1.2.3