128 lines
4.7 KiB
Go
128 lines
4.7 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)
|
|
}
|
|
}
|
|
|
|
// AwardRank امتیازِ رتبه را در میزِ رتبهبندی بهروزرسانی میکند.
|
|
func (g gameSettler) AwardRank(userID int64, tier string, won bool) {
|
|
t := g.eco.FindTier(tier)
|
|
if t == nil || t.RankReward <= 0 {
|
|
return
|
|
}
|
|
if err := g.eco.AwardRank(context.Background(), userID, t.RankReward, won); err != nil {
|
|
slog.Error("award rank", "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)
|
|
g.eco.AddTournamentPoints(context.Background(), userID, won)
|
|
}
|
|
|
|
// PlayerProfile سکه، نشانِ رتبه و آواتارِ بازیکن را برای نمایش سرِ میز برمیگرداند.
|
|
func (g gameSettler) PlayerProfile(userID int64) (int64, string, string) {
|
|
p, err := g.eco.GetProfile(context.Background(), userID)
|
|
if err != nil || p == nil {
|
|
return 0, "", ""
|
|
}
|
|
return p.Coins, p.RankTier, p.Avatar
|
|
}
|
|
|
|
// ChargeTicket یک بلیت برای بُرِ مجدد مصرف میکند (خطا اگر بلیت کافی نباشد).
|
|
func (g gameSettler) ChargeTicket(userID int64) error {
|
|
return g.eco.Adjust(context.Background(), userID, economy.CurrencyTicket, -1, "reshuffle", "")
|
|
}
|
|
|
|
// ChargeCoins سکهٔ شرطِ میزِ خصوصی را کسر میکند (خطا اگر موجودی کافی نباشد).
|
|
func (g gameSettler) ChargeCoins(userID int64, amount int64, ref string) error {
|
|
if amount <= 0 {
|
|
return nil
|
|
}
|
|
return g.eco.Adjust(context.Background(), userID, economy.CurrencyCoin, -amount, "private_stake", ref)
|
|
}
|
|
|
|
// AwardCoins سهمِ برنده از potِ میزِ خصوصی را اضافه میکند.
|
|
func (g gameSettler) AwardCoins(userID int64, amount int64, ref string) {
|
|
if amount <= 0 {
|
|
return
|
|
}
|
|
if err := g.eco.Adjust(context.Background(), userID, economy.CurrencyCoin, amount, "private_pot", ref); err != nil {
|
|
slog.Error("award coins", "user", userID, "err", err)
|
|
}
|
|
}
|
|
|
|
// 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
|
|
}
|