dkforest

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

commit aa34c0734be03a3e51f573f97ddecc28216dfd20
parent c2e2ab9748b15c988665b37846da405d4aa40127
Author: n0tr1v <n0tr1v@protonmail.com>
Date:   Thu, 14 Dec 2023 02:12:31 -0500

implement poker rake

Diffstat:
Acmd/dkf/migrations/150.sql | 9+++++++++
Mpkg/actions/actions.go | 1+
Apkg/database/tablePokerCasino.go | 25+++++++++++++++++++++++++
Mpkg/web/handlers/poker/poker.go | 33+++++++++++++++++++++++++--------
4 files changed, 60 insertions(+), 8 deletions(-)

diff --git a/cmd/dkf/migrations/150.sql b/cmd/dkf/migrations/150.sql @@ -0,0 +1,9 @@ +-- +migrate Up +CREATE TABLE IF NOT EXISTS poker_casino ( + lock char(1) not null DEFAULT 'X', + id INTEGER NOT NULL DEFAULT 1, + rake INTEGER NOT NULL DEFAULT 0, + constraint pk_poker_casino_RestrictToOneRow PRIMARY KEY (lock), + constraint CK_poker_casino_Locked CHECK (lock='X')); + +-- +migrate Down diff --git a/pkg/actions/actions.go b/pkg/actions/actions.go @@ -63,6 +63,7 @@ func Start(c *cli.Context) error { logrus.Error(err) } + db.GetPokerCasino() settings := db.GetSettings() config.ProtectHome.Store(settings.ProtectHome) config.HomeUsersList.Store(settings.HomeUsersList) diff --git a/pkg/database/tablePokerCasino.go b/pkg/database/tablePokerCasino.go @@ -0,0 +1,25 @@ +package database + +import "fmt" + +// PokerCasino table, should always be one row +type PokerCasino struct { + ID int64 + Rake uint64 +} + +func (PokerCasino) TableName() string { return "poker_casino" } + +func (d *DkfDB) GetPokerCasino() (out PokerCasino) { + if err := d.db.Model(PokerCasino{}).First(&out).Error; err != nil { + if err = d.db.Create(&out).Error; err != nil { + fmt.Println(err) + } + } + return +} + +func (d *DkfDB) IncrPokerCasinoRake(rake PokerChip) (err error) { + err = d.db.Exec(`UPDATE poker_casino SET rake = rake + ? WHERE id = 1`, rake).Error + return +} diff --git a/pkg/web/handlers/poker/poker.go b/pkg/web/handlers/poker/poker.go @@ -769,6 +769,7 @@ func dealerThread(db *database.DkfDB, g *PokerGame, roomID string) { roomTopic := "room_" + roomID roomLogsTopic := "room_" + roomID + "_logs" bigBlindBet := g.PokerTableMinBet + collectRake := false g.incrDealerIdx() @@ -851,6 +852,9 @@ func dealerThread(db *database.DkfDB, g *PokerGame, roomID string) { dealCard(i) } + // No flop, no drop + collectRake = true + // Wait for players to bet/call/check/fold... time.Sleep(time.Second) skip = utils.Ternary(len(g.Ongoing.Players) == 2, 1, 0) @@ -891,12 +895,16 @@ END: winners := g.Ongoing.computeWinners() mainPot := database.PokerChip(g.Ongoing.MainPot.Load()) - playersGain := processPot(winners, mainPot) + playersGain, rake := processPot(winners, mainPot, collectRake) var winnersStr, winnerHand string if len(playersGain) >= 1 { winnerHand = utils.Ternary(len(playersGain) == 1, playersGain[0].HandStr, "Split pot") tx := db.Begin() + + _ = tx.IncrPokerCasinoRake(rake) + newLogEvent(g, roomLogsTopic, fmt.Sprintf("Rake %d", rake)) + for _, el := range playersGain { newLogEvent(g, roomLogsTopic, fmt.Sprintf("Winner #%d: %s %s -> %d", el.Group, el.Player.Username, el.HandStr, el.Gain)) account, _ := tx.GetPokerTableAccount(el.Player.UserID, g.PokerTableID) @@ -906,8 +914,8 @@ END: winnersStr += el.Player.Username.String() + " " el.Player.Cash += el.Gain } - for _, p := range g.Ongoing.Players { - account, _ := tx.GetPokerTableAccount(p.UserID, g.PokerTableID) + for _, op := range g.Ongoing.Players { + account, _ := tx.GetPokerTableAccount(op.UserID, g.PokerTableID) account.AmountBet = 0 account.DoSave(tx) } @@ -916,8 +924,8 @@ END: } else if len(playersGain) == 0 { // No winners, refund bets tx := db.Begin() - for _, p := range g.Ongoing.Players { - account, _ := tx.GetPokerTableAccount(p.UserID, g.PokerTableID) + for _, op := range g.Ongoing.Players { + account, _ := tx.GetPokerTableAccount(op.UserID, g.PokerTableID) account.RefundBetAndSave(tx) } tx.Commit() @@ -951,7 +959,9 @@ type PlayerGain struct { HandStr string } -func processPot(winners []GameResult, mainPot database.PokerChip) (res []PlayerGain) { +const rakePct = 0.07 + +func processPot(winners []GameResult, mainPot database.PokerChip, collectRake bool) (res []PlayerGain, rake database.PokerChip) { newPlayerGain := func(player *PokerPlayer, gain database.PokerChip, groupIdx int, handStr string) PlayerGain { return PlayerGain{Player: player, Gain: gain, Group: groupIdx, HandStr: handStr} } @@ -959,7 +969,14 @@ func processPot(winners []GameResult, mainPot database.PokerChip) (res []PlayerG if len(winners) == 0 { logrus.Error("winners has len 0") return - } else if len(winners) == 1 && len(winners[0].Players) == 1 { + } + + if collectRake { + rake = database.PokerChip(rakePct * float64(mainPot)) + mainPot -= rake + } + + if len(winners) == 1 && len(winners[0].Players) == 1 { // Everyone fold but 1 player player := winners[0].Players[0] piece := mainPot @@ -1034,7 +1051,7 @@ func processPot(winners []GameResult, mainPot database.PokerChip) (res []PlayerG mainPot-- idx = (idx + 1) % len(res) } - return res + return } func cardToPokerCard(name string) string {