gameserver.go 2.0 KB

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