dkforest

A forum and chat platform (onion)
git clone https://git.dasho.dev/n0tr1v/dkforest.git
Log | Files | Refs | LICENSE

commit 02c08e81e11a967c4025e7e66193e86acaaa8f00
parent 779e61fd93805d67b2086a831193fe9b448ef756
Author: n0tr1v <n0tr1v@protonmail.com>
Date:   Thu,  7 Dec 2023 19:28:19 -0500

fixes

Diffstat:
Mpkg/web/handlers/poker/poker.go | 23++++++++++++++++++++++-
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; }`