videomgr.go 5.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259
  1. package video
  2. import (
  3. "encoding/json"
  4. "sort"
  5. "strconv"
  6. "sync"
  7. "bet24.com/log"
  8. item "bet24.com/servers/micros/item_inventory/proto"
  9. )
  10. type videomgr struct {
  11. sys_lock *sync.RWMutex
  12. user_lock *sync.RWMutex
  13. sys_videolist map[int]*video
  14. user_videolist map[int]*user_video
  15. sysSettle_videolist []*settleVideo
  16. }
  17. func newVideoMgr() *videomgr {
  18. ret := new(videomgr)
  19. ret.sys_lock = &sync.RWMutex{}
  20. ret.user_lock = &sync.RWMutex{}
  21. ret.sys_videolist = make(map[int]*video)
  22. ret.user_videolist = make(map[int]*user_video)
  23. //获取系统数值
  24. ret.loadSysVideoList()
  25. ret.loadSettleVideoList()
  26. return ret
  27. }
  28. func (this *videomgr) loadSysVideoList() {
  29. list := getSysVideoList()
  30. this.sys_lock.Lock()
  31. defer this.sys_lock.Unlock()
  32. this.sys_videolist = list
  33. }
  34. func (this *videomgr) loadSettleVideoList() {
  35. list := getSysSettleVideoList()
  36. if len(list) > 1 {
  37. //从大到小排序
  38. sort.SliceStable(list, func(i, j int) bool {
  39. return list[i].LoseAmount > list[j].LoseAmount
  40. })
  41. }
  42. this.sys_lock.Lock()
  43. defer this.sys_lock.Unlock()
  44. this.sysSettle_videolist = list
  45. }
  46. func (this *videomgr) onUserEnter(userId int) {
  47. this.getUserVideo(userId)
  48. }
  49. func (this *videomgr) onUserExit(userId int) {
  50. this.user_lock.Lock()
  51. defer this.user_lock.Unlock()
  52. delete(this.user_videolist, userId)
  53. }
  54. func (this *videomgr) getSysVideo(videoId int) *video {
  55. this.sys_lock.RLock()
  56. defer this.sys_lock.RUnlock()
  57. ret, ok := this.sys_videolist[videoId]
  58. if !ok {
  59. log.Debug("videomgr.getSysVideo videoId[%d] not found", videoId)
  60. return nil
  61. }
  62. return ret
  63. }
  64. func (this *videomgr) getUserVideo(userId int) *user_video {
  65. this.user_lock.RLock()
  66. uv, ok := this.user_videolist[userId]
  67. this.user_lock.RUnlock()
  68. if ok {
  69. return uv
  70. }
  71. uv = newUserVideo(userId)
  72. this.user_lock.Lock()
  73. this.user_videolist[userId] = uv
  74. this.user_lock.Unlock()
  75. return uv
  76. }
  77. func (this *videomgr) play(userId, videoId int) (bool, int, []item.ItemPack) {
  78. uv := this.getUserVideo(userId)
  79. if uv == nil {
  80. return false, 0, nil
  81. }
  82. return uv.play(videoId)
  83. }
  84. func (this *videomgr) getInfo(userId, videoId int) (bool, int, int, []item.ItemPack) {
  85. uv := this.getUserVideo(userId)
  86. if uv == nil {
  87. return false, 0, 0, nil
  88. }
  89. myPlayTimes := 0
  90. sysPlayTimes := 0
  91. var awards []item.ItemPack
  92. success, v, s := uv.getInfo(videoId)
  93. if v != nil {
  94. myPlayTimes = v.PlayTimes
  95. }
  96. if s != nil {
  97. sysPlayTimes = s.PlayTimes
  98. awards = s.Awards
  99. }
  100. return success, myPlayTimes, sysPlayTimes, awards
  101. }
  102. func (this *videomgr) getSettleInfo(userId, gameId, settleAmount int) *settleInfo_resp {
  103. uv := this.getUserVideo(userId)
  104. if uv == nil {
  105. return &settleInfo_resp{}
  106. }
  107. var list []*settleVideo
  108. // 先找出符合条件的结算信息
  109. for _, v := range this.sysSettle_videolist {
  110. if v.GameID != 0 && v.GameID != gameId {
  111. continue
  112. }
  113. if v.LoseAmount > settleAmount {
  114. continue
  115. }
  116. list = append(list, v)
  117. }
  118. // 没有数据
  119. if len(list) == 0 {
  120. log.Debug("videomgr.getSettleInfo userId=%d gameId=%d settleAmount=%d len(list)=0 uv=%+v",
  121. userId, gameId, settleAmount, uv)
  122. return &settleInfo_resp{}
  123. }
  124. // 2条以上数据,做排序
  125. if len(list) > 1 {
  126. // settleAmount 大到小排序
  127. sort.SliceStable(list, func(i, j int) bool {
  128. return list[i].LoseAmount > list[j].LoseAmount
  129. })
  130. // gameId 大到小排序
  131. sort.SliceStable(list, func(i, j int) bool {
  132. return list[i].GameID > list[j].GameID
  133. })
  134. }
  135. // 取第一条数据
  136. return uv.getSettleInfo(gameId, settleAmount, list[0])
  137. }
  138. func (this *videomgr) settle(userId, ts int) (bool, int) {
  139. uv := this.getUserVideo(userId)
  140. if uv == nil {
  141. return false, 0
  142. }
  143. return uv.settle(ts)
  144. }
  145. // 游戏返还视频列表
  146. func (this *videomgr) getGameSettleVideoList(userId int) []*settleVideoInfo {
  147. uv := this.getUserVideo(userId)
  148. if uv == nil {
  149. return nil
  150. }
  151. return uv.getGameSettleVideoList()
  152. }
  153. // 游戏返还视频奖励
  154. func (this *videomgr) awardGameSettleVideo(userId, settleId int) *awardRetInfo {
  155. uv := this.getUserVideo(userId)
  156. if uv == nil {
  157. return nil
  158. }
  159. return uv.awardGameSettleVideo(settleId)
  160. }
  161. // 小红点提醒
  162. func (this *videomgr) checkTip(userId int) bool {
  163. uv := this.getUserVideo(userId)
  164. if uv == nil {
  165. return false
  166. }
  167. return uv.checkTip()
  168. }
  169. func (this *videomgr) dumpSys(param string) {
  170. log.Release("-------------------------------")
  171. log.Release("videomgr.dumpSys %s", param)
  172. defer func() {
  173. log.Release("+++++++++++++++++++++++++++++++")
  174. log.Release("")
  175. }()
  176. d, _ := json.Marshal(struct {
  177. Sys_videolist map[int]*video
  178. SysSettle_videolist []*settleVideo
  179. }{
  180. Sys_videolist: this.sys_videolist,
  181. SysSettle_videolist: this.sysSettle_videolist,
  182. })
  183. log.Release(string(d))
  184. }
  185. func (this *videomgr) dumpUser(param string) {
  186. log.Release("-------------------------------")
  187. log.Release("videomgr.dumpUser %s", param)
  188. defer func() {
  189. log.Release("+++++++++++++++++++++++++++++++")
  190. log.Release("")
  191. }()
  192. if param != "" {
  193. var userId int
  194. var err error
  195. if userId, err = strconv.Atoi(param); err != nil {
  196. log.Release("atoi error %v", err)
  197. return
  198. }
  199. si := this.getUserVideo(userId)
  200. if si == nil {
  201. log.Release("user %d not exist", userId)
  202. return
  203. }
  204. d, _ := json.Marshal(si)
  205. log.Release(string(d))
  206. return
  207. }
  208. for k, v := range this.user_videolist {
  209. for _, s := range v.video_list {
  210. log.Release("video_list userId=%d ==> %+v", k, s)
  211. }
  212. for _, s := range v.settle_list {
  213. log.Release("settle_list userId=%d ==> %+v", k, s)
  214. }
  215. }
  216. return
  217. }