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) } // PlayerProfile سکه و نشانِ رتبه‌ی بازیکن را برای نمایش سرِ میز برمی‌گرداند. func (g gameSettler) PlayerProfile(userID int64) (int64, string) { p, err := g.eco.GetProfile(context.Background(), userID) if err != nil || p == nil { return 0, "" } return p.Coins, p.RankTier } // 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 }