commit 02c08e81e11a967c4025e7e66193e86acaaa8f00
parent 779e61fd93805d67b2086a831193fe9b448ef756
Author: n0tr1v <n0tr1v@protonmail.com>
Date: Thu, 7 Dec 2023 19:28:19 -0500
fixes
Diffstat:
1 file changed, 22 insertions(+), 1 deletion(-)
diff --git a/pkg/web/handlers/poker/poker.go b/pkg/web/handlers/poker/poker.go
@@ -122,6 +122,7 @@ type PokerGame struct {
sync.Mutex
PlayersEventCh chan PlayerEvent
Players []*PokerStandingPlayer
+ PlayersMtx sync.RWMutex
Ongoing *Ongoing
DealerIdx int
smallBlindIdx int
@@ -282,6 +283,8 @@ func rotateIdx[T any](players []T) int {
}
func (g *PokerGame) SitPlayer(authUser *database.User, pos int) error {
+ g.PlayersMtx.Lock()
+ defer g.PlayersMtx.Unlock()
for _, p := range g.Players {
if p != nil && p.Username == authUser.Username.String() {
return errors.New("player already seated")
@@ -304,11 +307,13 @@ func NewOngoing(g *PokerGame) *Ongoing {
utils.Shuffle(deck)
players := make([]*PokerPlayer, 0)
+ g.PlayersMtx.RLock()
for idx, p := range g.Players {
if p != nil && p.Cash > 0 {
players = append(players, &PokerPlayer{Username: p.Username, Cash: p.Cash, SeatIdx: idx})
}
}
+ g.PlayersMtx.RUnlock()
return &Ongoing{Deck: deck, Players: players, WaitTurnEvent: PokerWaitTurnEvent{Idx: -1}}
}
@@ -720,7 +725,7 @@ END:
mainPot := g.Ongoing.MainPot
g.Ongoing.MainPotMtx.RUnlock()
- winnersStr, winnerHand, playersGain := processPot(winners, len(g.Players), mainPot)
+ winnersStr, winnerHand, playersGain := processPot(winners, len(g.Ongoing.Players), mainPot)
for _, el := range playersGain {
el.Player.Cash += el.Gain
}
@@ -730,6 +735,7 @@ END:
g.Ongoing.MainPotMtx.Unlock()
// Sync "ongoing players" with "room players" objects
+ g.PlayersMtx.RLock()
for idx := range g.Players {
if g.Players[idx] != nil {
op := g.Ongoing.GetPlayer(g.Players[idx].Username)
@@ -744,6 +750,7 @@ END:
}
}
}
+ g.PlayersMtx.RUnlock()
g.IsGameDone.Store(true)
PokerPubSub.Pub(roomTopic, GameIsDoneEvent{DeckStr: strings.Join(g.Ongoing.Deck, ""), Winner: winnersStr, WinnerHand: winnerHand})
@@ -865,6 +872,8 @@ func (g *PokerGame) Deal(db *database.DkfDB, roomID string, authUser *database.U
}
func (g *PokerGame) CountEligibleSeated() (count int) {
+ g.PlayersMtx.RLock()
+ defer g.PlayersMtx.RUnlock()
for _, p := range g.Players {
if p != nil && p.Cash >= BigBlindBet {
count++
@@ -874,6 +883,8 @@ func (g *PokerGame) CountEligibleSeated() (count int) {
}
func (g *PokerGame) CountSeated() (count int) {
+ g.PlayersMtx.RLock()
+ defer g.PlayersMtx.RUnlock()
for _, p := range g.Players {
if p != nil {
count++
@@ -883,6 +894,8 @@ func (g *PokerGame) CountSeated() (count int) {
}
func (g *PokerGame) IsSeated(player string) (bool, int) {
+ g.PlayersMtx.RLock()
+ defer g.PlayersMtx.RUnlock()
isSeated := false
pos := 0
for idx, p := range g.Players {
@@ -1005,6 +1018,7 @@ func PokerUnSitHandler(c echo.Context) error {
if c.Request().Method == http.MethodPost {
var idx int
found := false
+ g.PlayersMtx.Lock()
for i, p := range g.Players {
if p != nil && p.Username == authUser.Username.String() {
g.Players[i] = nil
@@ -1013,6 +1027,7 @@ func PokerUnSitHandler(c echo.Context) error {
break
}
}
+ g.PlayersMtx.Unlock()
if found {
myTopic := "room_" + roomID
PokerPubSub.Pub(myTopic, PokerSeatLeftEvent{Idx: idx + 1})
@@ -1149,6 +1164,8 @@ func buildActionsDiv(roomID string) (html string) {
}
func buildSeatsHtml(g *PokerGame) string {
+ g.PlayersMtx.RLock()
+ defer g.PlayersMtx.RUnlock()
seats := `
<div>`
for i, p := range g.Players {
@@ -1183,6 +1200,8 @@ func drawGameStartedEvent(evt GameStartedEvent) string {
}
func drawGameIsDoneHtml(g *PokerGame, evt GameIsDoneEvent) (html string) {
+ g.PlayersMtx.RLock()
+ defer g.PlayersMtx.RUnlock()
html += `<style>`
html += `#deckStr:before { content: "` + evt.DeckStr + `"; }`
for i, p := range g.Players {
@@ -1222,6 +1241,8 @@ func drawResetCardsEvent() (html string) {
func drawSeatsHtml(authUser *database.User, g *PokerGame) string {
html := "<style>"
seated, _ := g.IsSeated(authUser.Username.String())
+ g.PlayersMtx.RLock()
+ defer g.PlayersMtx.RUnlock()
for i, p := range g.Players {
if p != nil || seated {
html += `.takeSeat` + itoa(i+1) + ` { display: none; }`