Files
back-hokm/internal/economy/catalog.go
T
2026-07-04 21:21:13 +03:30

119 lines
3.8 KiB
Go

package economy
// مقادیر اقتصادی پایه (قابل تنظیم بر اساس بیزینس‌پلن).
const (
DailyReward = 200 // سکه روزانه
AdReward = 50 // سکه به ازای هر تبلیغ rewardedِ کامل
AdDailyCap = 50 // سقف تعداد تبلیغ پاداش‌دار در روز
)
// CoinPackage بسته‌ی سکه با پول واقعی (IAP) — ممکن است VIP هم بدهد.
// SKU شناسه‌ی محصول در پنلِ مایکت/کافه‌بازار (uuid) است.
type CoinPackage struct {
ID string `json:"id"`
Title string `json:"title"`
Coins int64 `json:"coins"`
VIPDays int `json:"vip_days"`
PriceToman int `json:"price_toman"`
BonusPct int `json:"bonus_pct"`
SKU string `json:"sku"`
}
// TicketPackage بسته‌ی بلیط با پول واقعی (IAP).
type TicketPackage struct {
ID string `json:"id"`
Title string `json:"title"`
Tickets int64 `json:"tickets"`
PriceToman int `json:"price_toman"`
SKU string `json:"sku"`
}
// CardSkin اسکین کارت که با سکه باز می‌شود (قیمت ۰ یعنی پیش‌فرض رایگان).
type CardSkin struct {
ID string `json:"id"`
Title string `json:"title"`
PriceCoins int64 `json:"price_coins"`
}
// Booster بوستر XP با پول واقعی (IAP).
type Booster struct {
ID string `json:"id"`
Title string `json:"title"`
Multiplier int `json:"multiplier"`
Hours int `json:"hours"`
PriceToman int `json:"price_toman"`
SKU string `json:"sku"`
}
// VIPPackage بسته‌ی اشتراک VIP با پول واقعی (IAP).
type VIPPackage struct {
ID string `json:"id"`
Title string `json:"title"`
Months int `json:"months"`
PriceToman int `json:"price_toman"`
SKU string `json:"sku"`
}
// TableTier نوع میز: تعداد دست، ورودی، جایزه، XP و جام.
// RankReward > 0 یعنی میزِ رتبه‌بندی است (به برنده امتیازِ رتبه می‌دهد).
type TableTier struct {
ID string `json:"id"`
Title string `json:"title"`
Hands int `json:"hands"`
Entry int64 `json:"entry"`
Prize int64 `json:"prize"`
XP int `json:"xp"`
Trophy int `json:"trophy"`
RankReward int `json:"rank_reward"`
}
// Catalog کل کاتالوگ فروشگاه (برای GET /api/shop). از دیتابیس بارگذاری می‌شود.
type Catalog struct {
CoinPackages []CoinPackage `json:"coin_packages"`
TicketPackages []TicketPackage `json:"ticket_packages"`
CardSkins []CardSkin `json:"card_skins"`
Boosters []Booster `json:"boosters"`
VIPPackages []VIPPackage `json:"vip_packages"`
TableTiers []TableTier `json:"table_tiers"`
}
// rankTiers آستانه‌ی امتیازِ هر نشانِ رتبه (از پایین به بالا).
var rankTiers = []struct {
Name string
Min int64
}{
{"bronze", 0},
{"silver", 500},
{"gold", 1500},
{"diamond", 3000},
{"king", 5000},
}
// RankTier نام و اندیسِ نشانِ رتبه را از امتیازِ رتبه برمی‌گرداند.
func RankTier(points int64) (name string, index int) {
name, index = rankTiers[0].Name, 0
for i, t := range rankTiers {
if points >= t.Min {
name, index = t.Name, i
}
}
return name, index
}
// LevelInfo سطح فعلی، XP درون‌سطح و XP لازم برای سطح بعد را از XP کل محاسبه می‌کند.
// نیاز هر سطح: ۵۰ × شماره سطح (مثلاً سطح ۸ ⇒ ۴۰۰).
func LevelInfo(totalXP int64) (level int, into int64, need int64) {
level = 1
remaining := totalXP
for {
need = int64(50 * level)
if remaining < need {
break
}
remaining -= need
level++
}
into = remaining
return level, into, need
}