package games import ( "encoding/json" extStomp "github.com/go-stomp/stomp" ) type GameServer struct { addGameChan chan *Game listGamesChan chan Chan getGameChan chan getGame } type Chan chan []*Game type getGame struct { id int64 returnChan chan *Game } func New() GameServer { gameServer := GameServer{ addGameChan: make(chan *Game), listGamesChan: make(chan Chan), getGameChan: make(chan getGame), } go serveGames(gameServer) return gameServer } func serveGames(gameServer GameServer) { gamesMap := make(map[int64]*Game) gameCounter := int64(0) for { select { case game := <-gameServer.addGameChan: game.Id = gameCounter gameCounter++ gamesMap[game.Id] = game case r := <-gameServer.listGamesChan: v := make([]*Game, 0, len(gamesMap)) for _, value := range gamesMap { v = append(v, value) } r <- v case r := <-gameServer.getGameChan: r.returnChan <- gamesMap[r.id] } } } type stompGameStart struct { Type string `json:"type"` GameId int64 `json:"gameId"` } func (games GameServer) AddGame(x, y int, stompConnection *extStomp.Conn) *Game { game := NewGame(x, y) games.addGameChan <- game stompGameStart := stompGameStart{ Type: "GAME_START", GameId: game.Id, } b, _ := json.Marshal(stompGameStart) stompConnection.Send("/topic/go-battlecamp.game", "application/json;charset=utf-8", b, extStomp.SendOpt.NoContentLength) return game } func (games GameServer) ListGames() []*Game { r := make(chan []*Game) games.listGamesChan <- r return <-r } func (games GameServer) GetGame(id int64) *Game { getGame := getGame{ id: id, returnChan: make(chan *Game), } games.getGameChan <- getGame return <-getGame.returnChan }