initial commit
This commit is contained in:
commit
ac9aa86d33
14 changed files with 1021 additions and 0 deletions
80
internal/store/store.go
Normal file
80
internal/store/store.go
Normal file
|
|
@ -0,0 +1,80 @@
|
|||
package store
|
||||
|
||||
import (
|
||||
"github.com/danyel/go-fish/internal/game"
|
||||
"sync"
|
||||
)
|
||||
|
||||
type PlayerStore struct {
|
||||
mu sync.Mutex
|
||||
players map[string]*game.Player
|
||||
games map[string]*game.Game // keyed by player ID
|
||||
}
|
||||
|
||||
func NewPlayerStore() *PlayerStore {
|
||||
return &PlayerStore{
|
||||
players: make(map[string]*game.Player),
|
||||
games: make(map[string]*game.Game),
|
||||
}
|
||||
}
|
||||
|
||||
func (s *PlayerStore) AddPlayer(id, name string) *game.Player {
|
||||
s.mu.Lock()
|
||||
defer s.mu.Unlock()
|
||||
p := game.NewPlayer(id, name)
|
||||
s.players[id] = p
|
||||
return p
|
||||
}
|
||||
|
||||
func (s *PlayerStore) GetPlayer(id string) (*game.Player, bool) {
|
||||
s.mu.Lock()
|
||||
defer s.mu.Unlock()
|
||||
p, ok := s.players[id]
|
||||
return p, ok
|
||||
}
|
||||
|
||||
func (s *PlayerStore) GetAvailablePlayers() []*game.Player {
|
||||
s.mu.Lock()
|
||||
defer s.mu.Unlock()
|
||||
var available []*game.Player
|
||||
for _, p := range s.players {
|
||||
if p.Connected && len(p.Hand) < 7 {
|
||||
available = append(available, p)
|
||||
}
|
||||
}
|
||||
return available
|
||||
}
|
||||
|
||||
func (s *PlayerStore) RemovePlayer(id string) {
|
||||
s.mu.Lock()
|
||||
defer s.mu.Unlock()
|
||||
delete(s.players, id)
|
||||
delete(s.games, id)
|
||||
}
|
||||
|
||||
func (s *PlayerStore) MarkPlaying(id string) bool {
|
||||
s.mu.Lock()
|
||||
defer s.mu.Unlock()
|
||||
p, ok := s.players[id]
|
||||
if !ok {
|
||||
return false
|
||||
}
|
||||
p.Connected = false // player is now in a game
|
||||
return true
|
||||
}
|
||||
|
||||
func (s *PlayerStore) GetGame(id string) (*game.Game, bool) {
|
||||
s.mu.Lock()
|
||||
defer s.mu.Unlock()
|
||||
g, ok := s.games[id]
|
||||
return g, ok
|
||||
}
|
||||
|
||||
func (s *PlayerStore) CreateGame(playerID string, g *game.Game) {
|
||||
s.mu.Lock()
|
||||
defer s.mu.Unlock()
|
||||
// Store game under the player's ID so ask handler can find it
|
||||
s.games[playerID] = g
|
||||
// Also store under game ID
|
||||
s.games[g.ID] = g
|
||||
}
|
||||
Loading…
Add table
Add a link
Reference in a new issue