| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586 |
- 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", "", b)
- 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
- }
|