Try and clean up a failed primary instance creation
This commit is contained in:
parent
78774329a8
commit
a0657b32e7
3 changed files with 53 additions and 10 deletions
|
@ -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 {
|
||||||
|
|
|
@ -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")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
|
@ -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)
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Reference in a new issue