feat: add frame

This commit is contained in:
2026-07-08 12:34:21 +03:30
parent 525cd554ef
commit b5420bac21
12 changed files with 280 additions and 13 deletions
+2 -1
View File
@@ -391,10 +391,11 @@ func (h *Hub) removeFromTable(t *pendingTable, c *Client) {
func (h *Hub) broadcastLobby(t *pendingTable) {
players := make([]lobbyPlayer, len(t.clients))
for i, cl := range t.clients {
_, _, avatar := h.settler.PlayerProfile(cl.UserID)
_, _, avatar, frame := h.settler.PlayerProfile(cl.UserID)
players[i] = lobbyPlayer{
Name: cl.Name,
Avatar: avatar,
Frame: frame,
Host: cl.UserID == t.host,
Seat: t.seatOf(i),
}
+2
View File
@@ -29,6 +29,7 @@ type chatMsg struct {
type lobbyPlayer struct {
Name string `json:"name"`
Avatar string `json:"avatar"` // seed آواتارِ کاربر
Frame string `json:"frame"` // قابِ آواتارِ انتخابی
Host bool `json:"host"`
Seat int `json:"seat"` // جایگاهِ مطلق (۰..۳)
}
@@ -66,6 +67,7 @@ type PlayerInfo struct {
Coins int64 `json:"coins"`
RankTier string `json:"rank_tier"` // bronze..king (برای نشانِ رتبه)
Avatar string `json:"avatar"` // seed آواتارِ کاربر
Frame string `json:"frame"` // قابِ آواتارِ انتخابی (کازمتیک)
}
// matchedMsg به کلاینت پس از تشکیل میز.
+3 -2
View File
@@ -40,6 +40,7 @@ type seatInfo struct {
coins int64 // برای نمایش سرِ میز
rankTier string // نشانِ رتبه برای نمایش سرِ میز
avatar string // seed آواتارِ انتخابیِ کاربر (برای نمایش سرِ میز)
frame string // قابِ آواتارِ انتخابیِ کاربر (کازمتیک)
}
// auto مشخص می‌کند جایگاه باید خودکار بازی شود (بات یا قطع‌شده).
@@ -147,7 +148,7 @@ func (r *Room) start() {
if s.isBot || s.userID == 0 {
continue
}
s.coins, s.rankTier, s.avatar = r.settler.PlayerProfile(s.userID)
s.coins, s.rankTier, s.avatar, s.frame = r.settler.PlayerProfile(s.userID)
}
for seat, s := range r.seats {
if s.client != nil {
@@ -547,7 +548,7 @@ func (r *Room) playersInfo() []PlayerInfo {
out[i] = PlayerInfo{
Seat: i, Name: s.name, Bot: s.isBot,
Connected: s.isBot || s.connected,
Coins: s.coins, RankTier: s.rankTier, Avatar: s.avatar,
Coins: s.coins, RankTier: s.rankTier, Avatar: s.avatar, Frame: s.frame,
}
}
return out
+3 -3
View File
@@ -12,8 +12,8 @@ type Settler interface {
RecordHand(userID int64, won, kot, asHakem bool) // پایان یک هَند
RecordCut(userID int64) // بُرِش با حکم
RecordGameResult(userID int64, won bool) // پایان بازی (برد/باخت)
// PlayerProfile سکه، نشانِ رتبه و seedِ آواتارِ بازیکن را برای نمایش سرِ میز برمی‌گرداند.
PlayerProfile(userID int64) (coins int64, rankTier string, avatar string)
// PlayerProfile سکه، نشانِ رتبه، آواتار و قابِ انتخابیِ بازیکن را برای نمایش سرِ میز برمی‌گرداند.
PlayerProfile(userID int64) (coins int64, rankTier string, avatar string, frame string)
// ChargeTicket یک بلیت برای بُرِ مجدد در فازِ انتخابِ حکم مصرف می‌کند.
ChargeTicket(userID int64) error
// ChargeCoins/AwardCoins برای شرطِ سکه‌ایِ میزِ خصوصی (pot). Charge در صورتِ
@@ -38,7 +38,7 @@ func (noopSettler) RecordGame(string, string, int, bool) {}
func (noopSettler) RecordHand(int64, bool, bool, bool) {}
func (noopSettler) RecordCut(int64) {}
func (noopSettler) RecordGameResult(int64, bool) {}
func (noopSettler) PlayerProfile(int64) (int64, string, string) { return 0, "", "" }
func (noopSettler) PlayerProfile(int64) (int64, string, string, string) { return 0, "", "", "" }
func (noopSettler) ChargeTicket(int64) error { return nil }
func (noopSettler) ChargeCoins(int64, int64, string) error { return nil }
func (noopSettler) AwardCoins(int64, int64, string) {}
+1 -1
View File
@@ -481,7 +481,7 @@ func (s *recordingSettler) RecordGameResult(int64, bool) {
s.mu.Unlock()
}
func (s *recordingSettler) PlayerProfile(int64) (int64, string, string) { return 0, "", "" }
func (s *recordingSettler) PlayerProfile(int64) (int64, string, string, string) { return 0, "", "", "" }
func (s *recordingSettler) ChargeTicket(int64) error { return nil }
func (s *recordingSettler) ChargeCoins(int64, int64, string) error { return nil }
func (s *recordingSettler) AwardCoins(int64, int64, string) {}