base.go 2.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107
  1. package rankBase
  2. import (
  3. "f1-game/internal/data"
  4. "time"
  5. cstring "github.com/cherry-game/cherry/extend/string"
  6. clog "github.com/cherry-game/cherry/logger"
  7. "github.com/cherry-game/cherry/net/parser/pomelo"
  8. )
  9. const (
  10. defaultShowCount = 100 // 默认显示数量
  11. defaultSaveInterval = 5 * time.Second // 默认数据保存间隔 5秒
  12. )
  13. // RankTable 排行榜表的接口
  14. type RankTable interface {
  15. IsChangeData() bool
  16. SetChangeData()
  17. Save2Queue()
  18. }
  19. // RankBase 排行榜基类
  20. type RankBase struct {
  21. rankID int32
  22. table RankTable
  23. }
  24. // Init 初始化排行榜
  25. func (p *RankBase) Init(
  26. actorBase pomelo.ActorBase,
  27. rankStr string,
  28. saveInterval time.Duration,
  29. loadTable func(int32) (RankTable, bool),
  30. ) {
  31. p.rankID, _ = cstring.ToInt32(rankStr)
  32. table, found := loadTable(p.rankID)
  33. if !found {
  34. clog.Warnf("Init rank fail, db error. rankID=%d", p.rankID)
  35. return
  36. }
  37. p.table = table
  38. if saveInterval <= 0 {
  39. saveInterval = defaultSaveInterval
  40. }
  41. // 添加数据库保存定时器
  42. actorBase.Timer().Add(saveInterval, p.saveTimer)
  43. }
  44. // RankID 获取排行榜ID
  45. func (p *RankBase) RankID() int32 {
  46. return p.rankID
  47. }
  48. // GetRankLimit 获取排行榜上限 默认上榜数量=默认显示数量 * 2
  49. func (p *RankBase) GetRankLimit() int {
  50. rankRow, found := data.Rank.GetByRankID(p.rankID)
  51. if !found {
  52. return defaultShowCount * 2
  53. }
  54. return rankRow.MaxRankCount
  55. }
  56. // 获取显示数量
  57. func (p RankBase) GetShowCount() int32 {
  58. rankRow, found := data.Rank.GetByRankID(p.rankID)
  59. if !found {
  60. return defaultShowCount
  61. }
  62. return rankRow.ShowCount
  63. }
  64. // 获取显示数量
  65. func (p RankBase) GetMinRankValue() int64 {
  66. rankRow, found := data.Rank.GetByRankID(p.rankID)
  67. if !found {
  68. return 0
  69. }
  70. return rankRow.MinRankValue
  71. }
  72. // MarkChange 标记数据已变更
  73. func (p *RankBase) MarkChange() {
  74. p.table.SetChangeData()
  75. }
  76. // saveTimer 定时保存
  77. func (p *RankBase) saveTimer() {
  78. if p.table.IsChangeData() {
  79. p.table.Save2Queue()
  80. clog.Debugf("[saveTimer] save rank data to db. rankID=%d", p.rankID)
  81. }
  82. }
  83. func (p *RankBase) OnStop() {
  84. p.saveTimer()
  85. clog.Debugf("[OnStop] rank save to db. rankID=%d", p.rankID)
  86. }