dkforest

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

commit a571e856ae5e038dd65a850d3067600bc1df9cd9
parent c7dca481f4198ac915b4b0e89724478ff8ccf43b
Author: n0tr1v <n0tr1v@protonmail.com>
Date:   Sat,  9 Dec 2023 01:33:06 -0500

dealer token

Diffstat:
Mpkg/web/handlers/poker/events.go | 1+
Mpkg/web/handlers/poker/poker.go | 48+++++++++++++++++++++++++++++++++++++++++++-----
2 files changed, 44 insertions(+), 5 deletions(-)

diff --git a/pkg/web/handlers/poker/events.go b/pkg/web/handlers/poker/events.go @@ -11,6 +11,7 @@ type PokerEvent struct { } type GameStartedEvent struct { + DealerIdx int } type GameIsDoneEvent struct { diff --git a/pkg/web/handlers/poker/poker.go b/pkg/web/handlers/poker/poker.go @@ -139,7 +139,7 @@ type PokerGame struct { Players []*PokerStandingPlayer PlayersMtx sync.RWMutex Ongoing *Ongoing - DealerIdx atomic.Int32 + DealerIdx atomic.Int32 // Dealer seat idx smallBlindIdx int bigBlindIdx int underTheGunIdx int @@ -238,6 +238,15 @@ func (g *Ongoing) GetNextPlayer() *PokerPlayer { return nil } +func (g *Ongoing) GetPlayerBySeatIdx(seatIdx int) *PokerPlayer { + for _, p := range g.Players { + if p.SeatIdx == seatIdx { + return p + } + } + return nil +} + func (g *Ongoing) GetPlayer(player string) *PokerPlayer { for _, p := range g.Players { if p.Username == player { @@ -273,7 +282,12 @@ func isRoundSettled(players []*PokerPlayer) bool { func (g *PokerGame) incrDealerIdx() { nbPlayers := len(g.Ongoing.Players) dealerIdx := g.DealerIdx.Load() - dealerIdx = incrDealerIdx(dealerIdx, nbPlayers) + for { + dealerIdx = (dealerIdx + 1) % NbPlayers + if p := g.Ongoing.GetPlayerBySeatIdx(int(dealerIdx)); p != nil { + break + } + } g.DealerIdx.Store(dealerIdx) g.smallBlindIdx = (int(dealerIdx) + 1) % nbPlayers g.bigBlindIdx = (int(dealerIdx) + 2) % nbPlayers @@ -396,7 +410,8 @@ func waitPlayersActionFn(g *PokerGame, roomID string, skip, minBet int) bool { roomLogsTopic := "room_" + roomID + "_logs" playerAlive := 0 dealerIdx := int(g.DealerIdx.Load()) - playerToPlayIdx := (dealerIdx + skip) % len(g.Ongoing.Players) + dealerPlayer := g.Ongoing.GetPlayerBySeatIdx(dealerIdx) + playerToPlayIdx := (dealerPlayer.SeatIdx + skip) % len(g.Ongoing.Players) lastRaisePlayerIdx := -1 newlyAllInPlayers := make([]*PokerPlayer, 0) @@ -624,6 +639,15 @@ type Seat struct { Left2 int } +var dealerTokenPos = [][]int{ + {125, 714}, + {246, 732}, + {369, 607}, + {388, 379}, + {388, 190}, + {363, 123}, +} + func dealerThread(db *database.DkfDB, g *PokerGame, roomID string) { roomTopic := "room_" + roomID roomLogsTopic := "room_" + roomID + "_logs" @@ -676,7 +700,7 @@ func dealerThread(db *database.DkfDB, g *PokerGame, roomID string) { dealCardIdx++ } - PokerPubSub.Pub(roomTopic, GameStartedEvent{}) + PokerPubSub.Pub(roomTopic, GameStartedEvent{DealerIdx: int(g.DealerIdx.Load())}) newLogEvent(g, roomLogsTopic, fmt.Sprintf("-- New game --")) p := g.Ongoing.Players[g.smallBlindIdx] @@ -1151,6 +1175,15 @@ func colorForCard1(name string) string { return color } +func buildDealerTokenHtml(g *PokerGame) (html string) { + html += `<div id="dealerToken"><div class="inner"></div></div>` + if g.Ongoing != nil { + pos := dealerTokenPos[g.DealerIdx.Load()] + html += `<style>#dealerToken { top: ` + itoa(pos[0]) + `px; left: ` + itoa(pos[1]) + `px; }</style>` + } + return +} + func buildYourCardsHtml(authUser *database.User, g *PokerGame) string { html := ` <div style="position: absolute; top: 550px; left: 300px;"> @@ -1294,7 +1327,8 @@ func drawYourCardEvent(evt YourCardEvent) string { } func drawGameStartedEvent(evt GameStartedEvent) string { - return `` + pos := dealerTokenPos[evt.DealerIdx] + return `<style>#dealerToken { top: ` + itoa(pos[0]) + `px; left: ` + itoa(pos[1]) + `px; }</style>` } func drawGameIsDoneHtml(g *PokerGame, evt GameIsDoneEvent) (html string) { @@ -1592,6 +1626,9 @@ body { #yourCard2 { font-size: 22px; display: inline-block; } #errorMsg { position: absolute; top: 600px; left: 250px; color: darkred; } #eventLogs { position: absolute; bottom: 5px; right: 5px; width: 300px; height: 200px; border: 1px solid black; background-color: #ccc; padding: 3px; } +#dealerToken { top: 125px; left: 714px; width: 20px; height: 20px; background-color: #ccc; border: 1px solid #333; border-radius: 11px; position: absolute; } +#dealerToken .inner { padding: 2px 4px; } +#dealerToken .inner:before { content: "D"; } #table { position: absolute; top: 20px; left: 20px; width: 750px; height: 400px; border-radius: 300px; background: radial-gradient(#449144, #008a00); @@ -1729,6 +1766,7 @@ func PokerHandler(c echo.Context) error { send(buildSeatsHtml(g, roomID)) send(buildActionsDiv(roomID)) send(buildYourCardsHtml(authUser, g)) + send(buildDealerTokenHtml(g)) send(`<iframe src="/poker/` + roomID + `/logs" id="eventLogs"></iframe>`) send(`<div id="errorMsg"></div>`) send(buildMainPotHtml(g))