package rankBase import ( "f1-game/internal/data" "time" cstring "github.com/cherry-game/cherry/extend/string" clog "github.com/cherry-game/cherry/logger" "github.com/cherry-game/cherry/net/parser/pomelo" ) const ( defaultShowCount = 100 // 默认显示数量 defaultSaveInterval = 5 * time.Second // 默认数据保存间隔 5秒 ) // RankTable 排行榜表的接口 type RankTable interface { IsChangeData() bool SetChangeData() Save2Queue() } // RankBase 排行榜基类 type RankBase struct { rankID int32 table RankTable } // Init 初始化排行榜 func (p *RankBase) Init( actorBase pomelo.ActorBase, rankStr string, saveInterval time.Duration, loadTable func(int32) (RankTable, bool), ) { p.rankID, _ = cstring.ToInt32(rankStr) table, found := loadTable(p.rankID) if !found { clog.Warnf("Init rank fail, db error. rankID=%d", p.rankID) return } p.table = table if saveInterval <= 0 { saveInterval = defaultSaveInterval } // 添加数据库保存定时器 actorBase.Timer().Add(saveInterval, p.saveTimer) } // RankID 获取排行榜ID func (p *RankBase) RankID() int32 { return p.rankID } // GetRankLimit 获取排行榜上限 默认上榜数量=默认显示数量 * 2 func (p *RankBase) GetRankLimit() int { rankRow, found := data.Rank.GetByRankID(p.rankID) if !found { return defaultShowCount * 2 } return rankRow.MaxRankCount } // 获取显示数量 func (p RankBase) GetShowCount() int32 { rankRow, found := data.Rank.GetByRankID(p.rankID) if !found { return defaultShowCount } return rankRow.ShowCount } // 获取显示数量 func (p RankBase) GetMinRankValue() int64 { rankRow, found := data.Rank.GetByRankID(p.rankID) if !found { return 0 } return rankRow.MinRankValue } // MarkChange 标记数据已变更 func (p *RankBase) MarkChange() { p.table.SetChangeData() } // saveTimer 定时保存 func (p *RankBase) saveTimer() { if p.table.IsChangeData() { p.table.Save2Queue() clog.Debugf("[saveTimer] save rank data to db. rankID=%d", p.rankID) } } func (p *RankBase) OnStop() { p.saveTimer() clog.Debugf("[OnStop] rank save to db. rankID=%d", p.rankID) }