Files
back-hokm/cmd/server/settler.go
T

83 lines
2.8 KiB
Go

package main
import (
"context"
"log/slog"
"hakemsho/internal/economy"
)
// gameSettler اینترفیس ws.Settler را با سرویس اقتصاد پیاده می‌کند.
// tier را به ورودی/جایزه/XP/جام نگاشت کرده و تراکنش سکه را انجام می‌دهد.
type gameSettler struct {
eco *economy.Service
}
func (g gameSettler) ChargeEntry(userID int64, tier string) error {
t := g.eco.FindTier(tier)
if t == nil {
return nil // tier ناشناخته ⇒ بدون ورودی
}
return g.eco.ChargeEntry(context.Background(), userID, t.Entry, "tier:"+tier)
}
func (g gameSettler) Refund(userID int64, tier string) {
t := g.eco.FindTier(tier)
if t == nil {
return
}
if err := g.eco.Refund(context.Background(), userID, t.Entry, "tier:"+tier); err != nil {
slog.Error("refund", "user", userID, "err", err)
}
}
func (g gameSettler) AwardWinner(userID int64, tier string) {
t := g.eco.FindTier(tier)
if t == nil {
return
}
if err := g.eco.AwardWinner(context.Background(), userID, t.Prize, t.XP, t.Trophy, "tier:"+tier); err != nil {
slog.Error("award winner", "user", userID, "err", err)
}
}
func (g gameSettler) RecordGame(room, playersJSON string, winnerTeam int, kot bool) {
if err := g.eco.RecordGame(context.Background(), room, playersJSON, winnerTeam, kot); err != nil {
slog.Error("record game", "room", room, "err", err)
}
}
// RecordHand آمار یک هَندِ پایان‌یافته را برای کاربر ثبت می‌کند.
func (g gameSettler) RecordHand(userID int64, won, kot, asHakem bool) {
g.eco.RecordHand(context.Background(), userID, won, kot, asHakem)
}
// RecordCut آمار بُرِش با حکم را برای کاربر ثبت می‌کند.
func (g gameSettler) RecordCut(userID int64) {
g.eco.RecordCut(context.Background(), userID)
}
// RecordGameResult آمار پایان بازی (برد/باخت) را ثبت می‌کند.
func (g gameSettler) RecordGameResult(userID int64, won bool) {
g.eco.RecordGameResult(context.Background(), userID, won)
}
// ChargePrivateTable یک میز خصوصیِ رایگان را برای کاربر مصرف می‌کند.
func (g gameSettler) ChargePrivateTable(userID int64) error {
return g.eco.ConsumePrivateTable(context.Background(), userID)
}
// PrivateTableInfo باقیمانده‌ی میزهای رایگان و نامحدود بودن را برمی‌گرداند.
func (g gameSettler) PrivateTableInfo(userID int64) (int, bool) {
return g.eco.PrivateTableInfo(context.Background(), userID)
}
// TargetHands تعداد هَندِ لازم برای برد بازی در این tier (مثلاً مبتدی=۳).
func (g gameSettler) TargetHands(tier string) int {
t := g.eco.FindTier(tier)
if t == nil || t.Hands <= 0 {
return 7
}
return t.Hands
}