gameserver.go 2.0 KB

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