gameserver.go 1.7 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586
  1. package games
  2. import (
  3. "encoding/json"
  4. extStomp "github.com/go-stomp/stomp"
  5. )
  6. type GameServer struct {
  7. addGameChan chan *Game
  8. listGamesChan chan Chan
  9. getGameChan chan getGame
  10. }
  11. type Chan chan []*Game
  12. type getGame struct {
  13. id int64
  14. returnChan chan *Game
  15. }
  16. func New() GameServer {
  17. gameServer := GameServer{
  18. addGameChan: make(chan *Game),
  19. listGamesChan: make(chan Chan),
  20. getGameChan: make(chan getGame),
  21. }
  22. go serveGames(gameServer)
  23. return gameServer
  24. }
  25. func serveGames(gameServer GameServer) {
  26. gamesMap := make(map[int64]*Game)
  27. gameCounter := int64(0)
  28. for {
  29. select {
  30. case game := <-gameServer.addGameChan:
  31. game.Id = gameCounter
  32. gameCounter++
  33. gamesMap[game.Id] = game
  34. case r := <-gameServer.listGamesChan:
  35. v := make([]*Game, 0, len(gamesMap))
  36. for _, value := range gamesMap {
  37. v = append(v, value)
  38. }
  39. r <- v
  40. case r := <-gameServer.getGameChan:
  41. r.returnChan <- gamesMap[r.id]
  42. }
  43. }
  44. }
  45. type stompGameStart struct {
  46. Type string `json:"type"`
  47. GameId int64 `json:"gameId"`
  48. }
  49. func (games GameServer) AddGame(x, y int, stompConnection *extStomp.Conn) *Game {
  50. game := NewGame(x, y)
  51. games.addGameChan <- game
  52. stompGameStart := stompGameStart{
  53. Type: "GAME_START",
  54. GameId: game.Id,
  55. }
  56. b, _ := json.Marshal(stompGameStart)
  57. stompConnection.Send("/topic/go-battlecamp.game", "application/json", b)
  58. return game
  59. }
  60. func (games GameServer) ListGames() []*Game {
  61. r := make(chan []*Game)
  62. games.listGamesChan <- r
  63. return <-r
  64. }
  65. func (games GameServer) GetGame(id int64) *Game {
  66. getGame := getGame{
  67. id: id,
  68. returnChan: make(chan *Game),
  69. }
  70. games.getGameChan <- getGame
  71. return <-getGame.returnChan
  72. }