|
@@ -0,0 +1,86 @@
|
|
|
|
|
+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
|
|
|
|
|
+}
|