package games import ( "encoding/json" extStomp "github.com/go-stomp/stomp" ) type Games struct { addChan chan *Game listChan chan listChan getChan chan getGame } type listChan chan []*Game type getGame struct { id int64 returnChan chan *Game } func New() Games { games := Games{ addChan: make(chan *Game), listChan: make(chan listChan), getChan: make(chan getGame), } go serveGames(games) return games } func serveGames(games Games) { gamesMap := make(map[int64]*Game) for { select { case game := <-games.addChan: gamesMap[game.Id] = game case r := <-games.listChan: v := make([]*Game, 0, len(gamesMap)) for _, value := range gamesMap { v = append(v, value) } r <- v case r := <-games.getChan: r.returnChan <- gamesMap[r.id] } } } type stompGameStart struct { Type string `json:"type"` GameId int64 `json:"gameid"` } func (games Games) AddGame(game *Game, stompConnection *extStomp.Conn) { games.addChan <- game stompGameStart := stompGameStart{ Type: "GAME_START", GameId: game.Id, } b, _ := json.Marshal(stompGameStart) stompConnection.Send("gopinguin.game", "", b) } func (games Games) ListGames() []*Game { r := make(chan []*Game) games.listChan <- r return <-r } func (games Games) GetGame(id int64) *Game { getGame := getGame{ id: id, returnChan: make(chan *Game), } games.getChan <- getGame return <-getGame.returnChan }