Try and clean up a failed primary instance creation

This commit is contained in:
Marc Di Luzio 2020-06-03 12:31:52 +01:00
parent 78774329a8
commit a0657b32e7
3 changed files with 53 additions and 10 deletions

View file

@ -47,6 +47,16 @@ func (w *World) CreateInstance() uuid.UUID {
return id 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 // GetPosition returns the position of a given instance
func (w World) GetPosition(id uuid.UUID) (Position, error) { func (w World) GetPosition(id uuid.UUID) (Position, error) {
if i, ok := w.Instances[id]; ok { if i, ok := w.Instances[id]; ok {

View file

@ -2,6 +2,8 @@ package game
import ( import (
"testing" "testing"
"github.com/stretchr/testify/assert"
) )
func TestNewWorld(t *testing.T) { func TestNewWorld(t *testing.T) {
@ -24,3 +26,19 @@ func TestWorld_CreateInstance(t *testing.T) {
t.Errorf("Incorrect number of instances created") 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")
}
}

View file

@ -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.Header().Set("Content-Type", "application/json; charset=UTF-8")
w.WriteHeader(http.StatusOK) w.WriteHeader(http.StatusOK)
// Log the response
fmt.Printf("\tresponse: %+v\n", response)
// Reply with the current status // Reply with the current status
json.NewEncoder(w).Encode(response) json.NewEncoder(w).Encode(response)
} }
@ -157,6 +160,12 @@ type SpawnResponse struct {
// HandleSpawn will spawn the player entity for the associated account // HandleSpawn will spawn the player entity for the associated account
func (s *Server) HandleSpawn(w http.ResponseWriter, r *http.Request) { 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) fmt.Printf("%s\t%s\n", r.Method, r.RequestURI)
// Set up the response // 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 // Pull out the incoming info
var data SpawnData var data SpawnData
err := json.NewDecoder(r.Body).Decode(&data) if err := json.NewDecoder(r.Body).Decode(&data); err != nil {
if err != nil {
fmt.Printf("Failed to decode json: %s\n", err) fmt.Printf("Failed to decode json: %s\n", err)
response.Error = err.Error() response.Error = err.Error()
} else if len(data.Id) == 0 { } else if len(data.Id) == 0 {
response.Error = "No account ID provided" response.Error = "No account ID provided"
} else if id, err := uuid.Parse(data.Id); err != nil { } else if id, err := uuid.Parse(data.Id); err != nil {
response.Error = "Provided account ID was invalid" response.Error = "Provided account ID was invalid"
} else { } else {
// log the data sent // log the data sent
fmt.Printf("\tdata: %v\n", data) fmt.Printf("\tspawn data: %v\n", data)
// Create a new instance // Create a new instance
inst := s.world.CreateInstance() inst := s.world.CreateInstance()
if pos, err := s.world.GetPosition(inst); err != nil { if pos, err := s.world.GetPosition(inst); err != nil {
response.Error = fmt.Sprint("No position found for created instance") response.Error = fmt.Sprint("No position found for created instance")
} else { } else {
if err := s.accountant.AssignPrimary(id, inst); err != nil { if err := s.accountant.AssignPrimary(id, inst); err != nil {
response.Error = err.Error() 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 { } else {
// Reply with valid data
response.Success = true response.Success = true
response.Position = pos 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.Header().Set("Content-Type", "application/json; charset=UTF-8")
w.WriteHeader(http.StatusOK) w.WriteHeader(http.StatusOK)
// Log the response
fmt.Printf("\tresponse: %+v\n", response)
// Reply with the current status // Reply with the current status
json.NewEncoder(w).Encode(response) json.NewEncoder(w).Encode(response)
} }