gameserver.go 1.8 KB

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