shotgun/lobby/lobby.go

53 lines
1.1 KiB
Go
Raw Normal View History

2024-01-21 04:35:21 -06:00
package lobby
2024-01-21 01:33:44 -06:00
import (
"sync"
2024-01-21 12:48:29 -06:00
"github.com/google/uuid"
2024-01-21 01:33:44 -06:00
"git.sunturtle.xyz/studio/shotgun/game"
2024-01-21 12:48:29 -06:00
"git.sunturtle.xyz/studio/shotgun/player"
2024-01-21 12:28:46 -06:00
"git.sunturtle.xyz/studio/shotgun/serve"
2024-01-21 01:33:44 -06:00
)
2024-01-21 12:28:46 -06:00
type GameID = serve.GameID
2024-01-21 01:33:44 -06:00
// Lobby is a set of active games.
type Lobby struct {
mu sync.Mutex
// games is the set of all active games in the lobby.
games map[GameID]*game.Game
}
func New() *Lobby {
return &Lobby{
games: make(map[GameID]*game.Game),
}
}
// Game returns the game with the given ID.
func (l *Lobby) Game(id GameID) *game.Game {
l.mu.Lock()
defer l.mu.Unlock()
return l.games[id]
}
2024-01-21 12:48:29 -06:00
// Start begins a new game in the lobby.
// The caller must be able to distinguish the dealer's and challenger's conns
// in order to provide correct game start DTOs to each.
func (l *Lobby) Start(dealer, challenger player.ID) GameID {
id := uuid.New()
g := game.New(dealer, challenger)
l.mu.Lock()
defer l.mu.Unlock()
l.games[id] = g
return id
}
2024-01-21 01:33:44 -06:00
// Finish removes a game from the lobby.
func (l *Lobby) Finish(id GameID) {
l.mu.Lock()
defer l.mu.Unlock()
delete(l.games, id)
}