commit 35283ee2a509f0311e06be78400965311bd157b6
parent 8f5ea42cd6376ee7ce1a51461e8db1667b7592dc
Author: n0tr1v <n0tr1v@protonmail.com>
Date: Thu, 21 Dec 2023 20:17:00 -0500
fix possible crash
Diffstat:
1 file changed, 26 insertions(+), 13 deletions(-)
diff --git a/pkg/web/handlers/poker/poker.go b/pkg/web/handlers/poker/poker.go
@@ -161,6 +161,18 @@ func (p seatedPlayers) get(userID database.UserID) (out *seatedPlayer) {
return
}
+func (g *PokerGame) getEligibles() (out seatedPlayers) {
+ eligiblePlayers := make(seatedPlayers, 0)
+ g.Players.RWith(func(gPlayers seatedPlayers) {
+ for _, p := range gPlayers {
+ if p.isEligible(g.PokerTableMinBet) {
+ eligiblePlayers = append(eligiblePlayers, p)
+ }
+ }
+ })
+ return eligiblePlayers
+}
+
type seatedPlayer struct {
seatIdx int
userID database.UserID
@@ -558,15 +570,11 @@ func generateDeck() []string {
return deck
}
-func newOngoing(g *PokerGame) *ongoingGame {
+func newOngoing(eligiblePlayers seatedPlayers) *ongoingGame {
players := make([]*pokerPlayer, 0)
- g.Players.RWith(func(gPlayers seatedPlayers) {
- for _, p := range gPlayers {
- if p.isEligible(g.PokerTableMinBet) {
- players = append(players, &pokerPlayer{seatedPlayer: p})
- }
- }
- })
+ for _, p := range eligiblePlayers {
+ players = append(players, &pokerPlayer{seatedPlayer: p})
+ }
return &ongoingGame{
deck: generateDeck(),
players: players,
@@ -1001,7 +1009,11 @@ func resetPlayersBet(ongoing *ongoingGame) (sum database.PokerChip) {
}
func refundUncalledBet(db *database.DkfDB, ongoing *ongoingGame, pokerTableID int64, roomTopic string) {
- newArray := make([]*pokerPlayer, len(ongoing.players))
+ lenPlayers := len(ongoing.players)
+ if lenPlayers < 2 {
+ return
+ }
+ newArray := make([]*pokerPlayer, lenPlayers)
copy(newArray, ongoing.players)
sort.Slice(newArray, func(i, j int) bool { return newArray[i].getBet() > newArray[j].getBet() })
firstPlayer := newArray[0]
@@ -1127,8 +1139,8 @@ func computeAllInMaxGain(ongoing *ongoingGame, newlyAllInPlayers []*pokerPlayer,
}
}
-func dealerThread(g *PokerGame) {
- g.ongoing = newOngoing(g)
+func dealerThread(g *PokerGame, eligiblePlayers seatedPlayers) {
+ g.ongoing = newOngoing(eligiblePlayers)
roomID := g.roomID
roomTopic := roomID.Topic()
@@ -1478,7 +1490,8 @@ func cardToPokerCard(name string) string {
func (g *PokerGame) Deal(roomID RoomID, userID database.UserID) {
roomTopic := roomID.Topic()
roomUserTopic := roomID.UserTopic(userID)
- if g.countEligibleSeated() < 2 {
+ eligiblePlayers := g.getEligibles()
+ if len(eligiblePlayers) < 2 {
PokerPubSub.Pub(roomUserTopic, ErrorMsgEvent{Message: "need at least 2 players"})
return
}
@@ -1491,7 +1504,7 @@ func (g *PokerGame) Deal(roomID RoomID, userID database.UserID) {
PokerPubSub.Pub(roomTopic, ResetCardsEvent{})
time.Sleep(animationTime)
- go dealerThread(g)
+ go dealerThread(g, eligiblePlayers)
}
func (g *PokerGame) countEligibleSeated() (count int) {