dkforest

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

commit 948afed69f8df10b258fa65d8a8634bff9720a79
parent ea132a9e82f14acde7e63ebab3548e61b4703c9b
Author: n0tr1v <n0tr1v@protonmail.com>
Date:   Tue,  5 Dec 2023 15:11:01 -0500

check bets / auto fold...

Diffstat:
Mpkg/web/handlers/poker.go | 99+++++++++++++++++++++++++++++++++++++++++++++++++++++--------------------------
1 file changed, 67 insertions(+), 32 deletions(-)

diff --git a/pkg/web/handlers/poker.go b/pkg/web/handlers/poker.go @@ -142,42 +142,77 @@ func (g *PokerGame) Deal(roomID string) { go func() { waitPlayersActionFn := func() { - for i, p := range g.Ongoing.Players { - if p == nil { - continue - } - player := g.Ongoing.GetPlayer(p.Username) - if player.Folded { - continue - } - evt := PokerWaitTurnEvent{Idx: i} - PokerPubSub.Pub(roomTopic, evt) - g.Ongoing.WaitTurnEvent = evt - fmt.Println("WAIT FOR ACTION", p) - waitCh := time.After(MaxUserCountdown * time.Second) - LOOP: - for { - var evt PlayerEvent - select { - case evt = <-g.PlayersEventCh: - case <-waitCh: - fmt.Println("WAIT TOO LONG, either auto check, or fold") - break LOOP + for { + minBet := 0 + for i, p := range g.Ongoing.Players { + if p == nil { + continue } - if evt.Player != p.Username { + player := g.Ongoing.GetPlayer(p.Username) + if player.Folded { continue } - fmt.Println("GOT FROM", evt.Player, evt) - if evt.Fold { - player.Folded = true - PokerPubSub.Pub(roomTopic, PlayerFoldEvent{Card1Idx: player.Cards[0].Idx, Card2Idx: player.Cards[1].Idx}) - } else if evt.Check { - } else if evt.Call { - } else if evt.Bet > 0 { - g.Ongoing.Players[i].Bet += evt.Bet - g.Ongoing.Players[i].Cash -= evt.Bet - PokerPubSub.Pub(roomTopic, PlayerBetEvent{PlayerIdx: i, Player: p.Username, Bet: evt.Bet, TotalBet: g.Ongoing.Players[i].Bet, Cash: g.Ongoing.Players[i].Cash}) + evt := PokerWaitTurnEvent{Idx: i} + PokerPubSub.Pub(roomTopic, evt) + g.Ongoing.WaitTurnEvent = evt + fmt.Println("WAIT FOR ACTION", p) + waitCh := time.After(MaxUserCountdown * time.Second) + LOOP: + for { + var evt PlayerEvent + select { + case evt = <-g.PlayersEventCh: + case <-waitCh: + fmt.Println("WAIT TOO LONG, either auto check, or fold") + if p.Bet < minBet { + player.Folded = true + PokerPubSub.Pub(roomTopic, PlayerFoldEvent{Card1Idx: player.Cards[0].Idx, Card2Idx: player.Cards[1].Idx}) + } + break LOOP + } + if evt.Player != p.Username { + continue + } + fmt.Println("GOT FROM", evt.Player, evt) + if evt.Fold { + player.Folded = true + PokerPubSub.Pub(roomTopic, PlayerFoldEvent{Card1Idx: player.Cards[0].Idx, Card2Idx: player.Cards[1].Idx}) + } else if evt.Check { + } else if evt.Call { + } else if evt.Bet > 0 { + if evt.Bet < minBet { + fmt.Println("BET TOO LOW", evt.Bet, minBet) + continue + } + minBet = evt.Bet + g.Ongoing.Players[i].Bet += evt.Bet + g.Ongoing.Players[i].Cash -= evt.Bet + PokerPubSub.Pub(roomTopic, PlayerBetEvent{PlayerIdx: i, Player: p.Username, Bet: evt.Bet, TotalBet: g.Ongoing.Players[i].Bet, Cash: g.Ongoing.Players[i].Cash}) + } + break + } + } + + // All settle when all players have the same bet amount + allSettled := true + b := -1 + for _, p := range g.Ongoing.Players { + if p != nil { + if p.Folded { + continue + } + if b == -1 { + b = p.Bet + } else { + if p.Bet != b { + allSettled = false + break + } + } } + } + + if allSettled { break } }