wheelmanager.go 5.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237
  1. package dailywheel
  2. import (
  3. "encoding/json"
  4. "math/rand"
  5. "os"
  6. "strconv"
  7. "time"
  8. "bet24.com/log"
  9. "bet24.com/servers/common"
  10. pb "bet24.com/servers/micros/activityservice/proto"
  11. dotservice "bet24.com/servers/micros/dotservice/proto"
  12. item "bet24.com/servers/micros/item_inventory/proto"
  13. platformconfig "bet24.com/servers/micros/platformconfig/proto"
  14. task "bet24.com/servers/micros/task/proto"
  15. )
  16. var mgr *wheelmanager
  17. const config_key = "activity_dailywheel"
  18. const refresh_config_sec = 600
  19. func getManager() *wheelmanager {
  20. if mgr == nil {
  21. mgr = new(wheelmanager)
  22. mgr.ctor()
  23. }
  24. return mgr
  25. }
  26. type wheelmanager struct {
  27. configString string
  28. WheelItems []pb.WheelItem
  29. Price item.ItemPack
  30. DailyTaskCount int
  31. RefreshTaskCost item.ItemPack
  32. }
  33. func (wm *wheelmanager) ctor() {
  34. log.Debug("dailywheel running")
  35. wm.readConf()
  36. getFreeMgr()
  37. }
  38. func (wm *wheelmanager) readConf() {
  39. time.AfterFunc(time.Second*refresh_config_sec, wm.readConf)
  40. configString := platformconfig.GetConfig(config_key)
  41. //if configString == "" {
  42. data, err := os.ReadFile("serviceconf/activity_dailywheel.json")
  43. if err != nil {
  44. log.Release("wheelmanager.loadData read config failed")
  45. return
  46. }
  47. configString = string(data)
  48. if configString != "" {
  49. platformconfig.SetConfig(config_key, configString)
  50. }
  51. //}
  52. if configString == wm.configString {
  53. return
  54. }
  55. wm.configString = configString
  56. // 读取配置
  57. err = json.Unmarshal([]byte(configString), &wm)
  58. if err != nil {
  59. log.Release("wheelmanager.loadData Unmarshal failed %s", configString)
  60. }
  61. }
  62. func (wm *wheelmanager) dumpUser(param string) {
  63. log.Release("-------------------------------")
  64. log.Release("wheelmanager.dumpUser %s", param)
  65. defer func() {
  66. log.Release("+++++++++++++++++++++++++++++++")
  67. log.Release("")
  68. }()
  69. var userId int
  70. var err error
  71. if userId, err = strconv.Atoi(param); err != nil {
  72. log.Release("atoi error %v", err)
  73. return
  74. }
  75. log.Release("userId = %d", userId)
  76. log.Release("info = %s", wm.getWheelInfo(userId))
  77. }
  78. func (wm *wheelmanager) dumpSys(param string) {
  79. log.Release("-------------------------------")
  80. log.Release("wheelmanager.dumpSys")
  81. defer func() {
  82. log.Release("+++++++++++++++++++++++++++++++")
  83. log.Release("")
  84. }()
  85. log.Release(" Price:%v", wm.Price)
  86. for _, v := range wm.WheelItems {
  87. log.Release(" Index[%d]Odds[%d]Items%v", v.Index, v.Odds, v.Prize)
  88. }
  89. }
  90. func (wm *wheelmanager) onUserEnter(userId int) {
  91. task.CreateRandomTasksByScene(userId, task.TaskScene_DailyWheel, wm.DailyTaskCount, false)
  92. }
  93. func (wm *wheelmanager) getWheelInfoBase(userId int) pb.UserWheelInfo {
  94. var info pb.UserWheelInfo
  95. info.Price = wm.Price
  96. info.Items = make([]pb.WheelItem, len(wm.WheelItems))
  97. copy(info.Items, wm.WheelItems)
  98. for k := range info.Items {
  99. info.Items[k].Odds = 0
  100. info.Items[k].MaxCount = 0
  101. }
  102. info.IsFree = getFreeMgr().isFree(userId)
  103. info.Owned = item.GetItemCount(userId, wm.Price.ItemId)
  104. info.RefreshTaskCost = wm.RefreshTaskCost
  105. return info
  106. }
  107. func (wm *wheelmanager) getWheelInfo(userId int) string {
  108. info := wm.getWheelInfoBase(userId)
  109. // 打点统计
  110. go dotservice.AddDot(userId, dotservice.DotScope{
  111. Scene: dotservice.Scene_DailyWheel,
  112. Action: dotservice.Action_Click,
  113. })
  114. d, _ := json.Marshal(info)
  115. return string(d)
  116. }
  117. func (wm *wheelmanager) doWheel(userId int) string {
  118. log.Debug("wheelmanager.doWheel userId[%d]", userId)
  119. var result pb.WheelResult
  120. // 先扣道具
  121. if !getFreeMgr().isFree(userId) {
  122. result.Success, result.ErrorMsg = item.Consume(userId, wm.Price.ItemId, common.LOGTYPE_DAILY_WHEEL, wm.Price.Count, 0)
  123. if !result.Success {
  124. log.Debug("wheelmanager.doWheel userId[%d] failed %s", userId, result.ErrorMsg)
  125. d, _ := json.Marshal(result)
  126. return string(d)
  127. }
  128. } else {
  129. result.Success = true
  130. getFreeMgr().useFree(userId)
  131. }
  132. var itm *pb.WheelItem
  133. for {
  134. itm = wm.GetRandomItem()
  135. if itm == nil {
  136. log.Debug("wheelmanager.doWheel userId[%d] failed no random item gen", userId)
  137. continue
  138. }
  139. if !getFreeMgr().isItemAvailable(itm.Index, itm.MaxCount) {
  140. continue
  141. } else {
  142. getFreeMgr().addItemResult(itm.Index, itm.MaxCount)
  143. }
  144. break
  145. }
  146. prize := itm.Prize
  147. if prize.Count == 0 {
  148. log.Debug("wheelmanager.doWheel userId[%d] failed no prize gen", userId)
  149. return ""
  150. }
  151. result.Index = itm.Index
  152. result.Items = prize
  153. // 添加道具
  154. item.AddItems(userId, []item.ItemPack{prize}, "dailywheel", common.LOGTYPE_DAILY_WHEEL)
  155. // 打点统计
  156. go dotservice.AddDot(userId, dotservice.DotScope{
  157. Scene: dotservice.Scene_DailyWheel,
  158. Action: dotservice.Action_Complete,
  159. })
  160. d, _ := json.Marshal(result)
  161. log.Debug("wheelmanager.doWheel userId[%d] %s", userId, string(d))
  162. return string(d)
  163. }
  164. func (wm *wheelmanager) GetRandomItem() *pb.WheelItem {
  165. total := 0
  166. for _, v := range wm.WheelItems {
  167. total += v.Odds
  168. }
  169. if total == 0 {
  170. return nil
  171. }
  172. r := rand.Intn(total)
  173. inc := 0
  174. for i := 0; i < len(wm.WheelItems); i++ {
  175. inc += wm.WheelItems[i].Odds
  176. if r < inc {
  177. return &wm.WheelItems[i]
  178. }
  179. }
  180. log.Release("wheelmanager.GetRandomItem return nil total[%d]r[%d]inc[%d]", total, r, inc)
  181. return nil
  182. }
  183. func (wm *wheelmanager) refreshTask(userId int) bool {
  184. if task.IsAllTaskFinished(userId, task.TaskScene_DailyWheel) {
  185. log.Debug("wheelmanager.refreshTask [%d] all task finished", userId)
  186. return false
  187. }
  188. // 扣钱
  189. if wm.RefreshTaskCost.Count > 0 {
  190. ok, errMsg := item.Consume(userId, wm.RefreshTaskCost.ItemId, common.LOGTYPE_DAILY_WHEEL, wm.RefreshTaskCost.Count, 0)
  191. if !ok {
  192. log.Release("refreshTask userId[%d] consume failed %s", userId, errMsg)
  193. return false
  194. }
  195. }
  196. task.CreateRandomTasksByScene(userId, task.TaskScene_DailyWheel, wm.DailyTaskCount, true)
  197. return true
  198. }
  199. func (wm *wheelmanager) isDailyWheelFree(userId int) bool {
  200. return getFreeMgr().isFree(userId)
  201. }