games.go 1.4 KB

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