commit aa34c0734be03a3e51f573f97ddecc28216dfd20
parent c2e2ab9748b15c988665b37846da405d4aa40127
Author: n0tr1v <n0tr1v@protonmail.com>
Date: Thu, 14 Dec 2023 02:12:31 -0500
implement poker rake
Diffstat:
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 {