season.go 2.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161
  1. package battlepass
  2. import (
  3. "encoding/json"
  4. "os"
  5. "sync"
  6. "time"
  7. "bet24.com/log"
  8. platformconfig "bet24.com/servers/micros/platformconfig/proto"
  9. )
  10. const season_config_key = "battlepass_seasons"
  11. const refresh_config_sec = 3600
  12. type seasonmanager struct {
  13. seasons []*BattlePassSeason
  14. configString string
  15. lock *sync.RWMutex
  16. currentSeasonId int
  17. }
  18. func newSeasonManager() *seasonmanager {
  19. ret := new(seasonmanager)
  20. ret.lock = &sync.RWMutex{}
  21. ret.readConf()
  22. return ret
  23. }
  24. func (m *seasonmanager) refreshAndChesk() {
  25. time.AfterFunc(refresh_config_sec*time.Second, m.refreshAndChesk)
  26. m.readConf()
  27. m.checkSeason()
  28. }
  29. func (m *seasonmanager) checkSeason() {
  30. seasonId := 0
  31. s := m.getValidSeason()
  32. if s != nil {
  33. seasonId = s.SeasonId
  34. }
  35. if m.currentSeasonId == seasonId {
  36. return
  37. }
  38. if seasonId == 0 {
  39. mgr.seasonEnd()
  40. } else {
  41. mgr.seasonStart(seasonId)
  42. }
  43. m.currentSeasonId = seasonId
  44. }
  45. func (m *seasonmanager) readConf() {
  46. configString := platformconfig.GetConfig(season_config_key)
  47. if configString == "" {
  48. data, err := os.ReadFile("fishconf/battlepass.json")
  49. if err != nil {
  50. log.Release("battlepass.seasonmanager.loadData read battlepass failed")
  51. return
  52. }
  53. configString = string(data)
  54. if configString != "" {
  55. platformconfig.SetConfig(season_config_key, configString)
  56. }
  57. }
  58. if configString == m.configString {
  59. return
  60. }
  61. m.configString = configString
  62. m.lock.Lock()
  63. err := json.Unmarshal([]byte(configString), &m.seasons)
  64. m.lock.Unlock()
  65. if err != nil {
  66. log.Release("battlepass.manager.loadData Unmarshal failed err:%v", err)
  67. }
  68. }
  69. func (m *seasonmanager) getValidSeason() *BattlePassSeason {
  70. m.lock.RLock()
  71. defer m.lock.RUnlock()
  72. for _, v := range m.seasons {
  73. if v.isValid() {
  74. return v
  75. }
  76. }
  77. return nil
  78. }
  79. func (m *seasonmanager) getMaxExp() int {
  80. s := m.getValidSeason()
  81. if s == nil {
  82. return 0
  83. }
  84. return s.MaxExp
  85. }
  86. func (m *seasonmanager) getMaxDayExp() int {
  87. s := m.getValidSeason()
  88. if s == nil {
  89. return 0
  90. }
  91. return s.MaxDayExp
  92. }
  93. func (m *seasonmanager) getGrowthPacks() []GrowthPack {
  94. var ret []GrowthPack
  95. s := m.getValidSeason()
  96. if s == nil {
  97. return ret
  98. }
  99. return s.Packs
  100. }
  101. func (m *seasonmanager) getGrowthPack(packId int) *GrowthPack {
  102. s := m.getValidSeason()
  103. if s == nil {
  104. return nil
  105. }
  106. for i := 0; i < len(s.Packs); i++ {
  107. if s.Packs[i].Id == packId {
  108. return &s.Packs[i]
  109. }
  110. }
  111. return nil
  112. }
  113. func (m *seasonmanager) getGrowthPackByProduct(productId string) *GrowthPack {
  114. s := m.getValidSeason()
  115. if s == nil {
  116. return nil
  117. }
  118. for i := 0; i < len(s.Packs); i++ {
  119. if s.Packs[i].ProductId == productId || s.Packs[i].FullProductId == productId {
  120. return &s.Packs[i]
  121. }
  122. }
  123. return nil
  124. }
  125. func (m *seasonmanager) getGrowthTerm(growthPackId, index int) *GrowthTerm {
  126. pack := m.getGrowthPack(growthPackId)
  127. if pack == nil {
  128. return nil
  129. }
  130. for _, term := range pack.Terms {
  131. if term.TermIndex == index {
  132. return &term
  133. }
  134. }
  135. return nil
  136. }