diff --git a/pkg/game/world.go b/pkg/game/world.go index 14311b0..c2639f0 100644 --- a/pkg/game/world.go +++ b/pkg/game/world.go @@ -47,6 +47,16 @@ func (w *World) CreateInstance() uuid.UUID { return id } +// Removes an instance from the game +func (w *World) DestroyInstance(id uuid.UUID) error { + if _, ok := w.Instances[id]; ok { + delete(w.Instances, id) + } else { + return fmt.Errorf("no instance matching id") + } + return nil +} + // GetPosition returns the position of a given instance func (w World) GetPosition(id uuid.UUID) (Position, error) { if i, ok := w.Instances[id]; ok { diff --git a/pkg/game/world_test.go b/pkg/game/world_test.go index e5fd031..af29246 100644 --- a/pkg/game/world_test.go +++ b/pkg/game/world_test.go @@ -2,6 +2,8 @@ package game import ( "testing" + + "github.com/stretchr/testify/assert" ) func TestNewWorld(t *testing.T) { @@ -24,3 +26,19 @@ func TestWorld_CreateInstance(t *testing.T) { t.Errorf("Incorrect number of instances created") } } + +func TestWorld_DestroyInstance(t *testing.T) { + world := NewWorld() + a := world.CreateInstance() + b := world.CreateInstance() + + err := world.DestroyInstance(a) + assert.NoError(t, err, "Error returned from instance destroy") + + // Basic duplicate check + if len(world.Instances) != 1 { + t.Error("Too many instances left in world") + } else if _, ok := world.Instances[b]; !ok { + t.Error("Remaining instance is incorrect") + } +} diff --git a/pkg/server/router.go b/pkg/server/router.go index ff297e1..4131be9 100644 --- a/pkg/server/router.go +++ b/pkg/server/router.go @@ -139,6 +139,9 @@ func (s *Server) HandleRegister(w http.ResponseWriter, r *http.Request) { w.Header().Set("Content-Type", "application/json; charset=UTF-8") w.WriteHeader(http.StatusOK) + // Log the response + fmt.Printf("\tresponse: %+v\n", response) + // Reply with the current status json.NewEncoder(w).Encode(response) } @@ -157,6 +160,12 @@ type SpawnResponse struct { // HandleSpawn will spawn the player entity for the associated account func (s *Server) HandleSpawn(w http.ResponseWriter, r *http.Request) { + // Verify we're hit with a get request + if r.Method != http.MethodPost { + w.WriteHeader(http.StatusMethodNotAllowed) + return + } + fmt.Printf("%s\t%s\n", r.Method, r.RequestURI) // Set up the response @@ -166,35 +175,38 @@ func (s *Server) HandleSpawn(w http.ResponseWriter, r *http.Request) { }, } - // Verify we're hit with a get request - if r.Method != http.MethodPost { - w.WriteHeader(http.StatusMethodNotAllowed) - return - } - // Pull out the incoming info var data SpawnData - err := json.NewDecoder(r.Body).Decode(&data) - if err != nil { + if err := json.NewDecoder(r.Body).Decode(&data); err != nil { fmt.Printf("Failed to decode json: %s\n", err) - response.Error = err.Error() + } else if len(data.Id) == 0 { response.Error = "No account ID provided" + } else if id, err := uuid.Parse(data.Id); err != nil { response.Error = "Provided account ID was invalid" + } else { // log the data sent - fmt.Printf("\tdata: %v\n", data) + fmt.Printf("\tspawn data: %v\n", data) // Create a new instance inst := s.world.CreateInstance() if pos, err := s.world.GetPosition(inst); err != nil { response.Error = fmt.Sprint("No position found for created instance") + } else { if err := s.accountant.AssignPrimary(id, inst); err != nil { response.Error = err.Error() + + // Try and clear up the instance + if err := s.world.DestroyInstance(inst); err != nil { + fmt.Printf("Failed to destroy instance after failed primary assign: %s", err) + } + } else { + // Reply with valid data response.Success = true response.Position = pos } @@ -205,6 +217,9 @@ func (s *Server) HandleSpawn(w http.ResponseWriter, r *http.Request) { w.Header().Set("Content-Type", "application/json; charset=UTF-8") w.WriteHeader(http.StatusOK) + // Log the response + fmt.Printf("\tresponse: %+v\n", response) + // Reply with the current status json.NewEncoder(w).Encode(response) }