gameserver.go 2.0 KB

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