vipmgr.go 7.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314
  1. package vip
  2. import (
  3. "encoding/json"
  4. "strconv"
  5. "sync"
  6. "bet24.com/log"
  7. pb "bet24.com/servers/micros/userservices/proto"
  8. )
  9. var mgr *vipmgr
  10. type vipmgr struct {
  11. lock *sync.RWMutex
  12. userList map[int]*userVip // 个人vip信息
  13. VipList []pb.VipInfo // 系统vip配置
  14. PurchasePackages []pb.PurchasePackage // 礼包
  15. }
  16. func newVipManager() *vipmgr {
  17. mgr = new(vipmgr)
  18. mgr.lock = &sync.RWMutex{}
  19. mgr.userList = make(map[int]*userVip)
  20. mgr.loadConfig()
  21. return mgr
  22. }
  23. // 根据用户ID查询用户vip状态
  24. func (this *vipmgr) getUserVip(userId int, forceCreate bool) *userVip {
  25. this.lock.RLock()
  26. u, ok := this.userList[userId]
  27. this.lock.RUnlock()
  28. if ok {
  29. return u
  30. }
  31. if !forceCreate {
  32. //log.Debug("vipmgr.getUserVip user not found, userId[%d]", userId)
  33. return nil
  34. }
  35. u = newUserVip(userId)
  36. this.lock.Lock()
  37. this.userList[userId] = u
  38. this.lock.Unlock()
  39. return u
  40. }
  41. // 用户进入,创建用户信息,读取用户礼包购买历史,如果是vip,判断是否领取VIP奖励
  42. func (this *vipmgr) onUserEnter(userId int) {
  43. uv := this.getUserVip(userId, true)
  44. uv.onUserEntered()
  45. }
  46. // 将用户标记为离线
  47. func (this *vipmgr) onUserExit(userId int) {
  48. this.lock.Lock()
  49. defer this.lock.Unlock()
  50. _, ret := this.userList[userId]
  51. if ret {
  52. this.userList[userId].userId = 0
  53. }
  54. delete(this.userList, userId)
  55. }
  56. // 获取vip列表,前端展现用
  57. func (this *vipmgr) getVipList() []pb.VipInfo {
  58. return this.VipList
  59. }
  60. // 获取购买礼包列表
  61. func (this *vipmgr) getPurchasePackageList(userId int) []pb.PurchasePackage {
  62. if len(this.PurchasePackages) == 0 {
  63. return nil
  64. }
  65. ret := make([]pb.PurchasePackage, len(this.PurchasePackages))
  66. copy(ret, this.PurchasePackages)
  67. for i := 0; i < len(ret); i++ {
  68. ret[i].BuyAble = this.canBuyPackage(userId, ret[i].ProductId)
  69. //ret[i].Price = ret[i].Price
  70. }
  71. return ret
  72. }
  73. // 根据等级获取vip配置信息
  74. func (this *vipmgr) getVipByLevel(level int) *pb.VipInfo {
  75. for k, v := range this.VipList {
  76. if v.Level == level {
  77. return &this.VipList[k]
  78. }
  79. }
  80. return nil
  81. }
  82. // 获取vip点数对应的等级
  83. func (this *vipmgr) getVipByPoint(point int) int {
  84. ret := 0
  85. for _, v := range this.VipList {
  86. if point < v.Point {
  87. continue
  88. }
  89. if v.Level <= ret {
  90. continue
  91. }
  92. ret = v.Level
  93. }
  94. return ret
  95. }
  96. // 获取礼包信息
  97. func (this *vipmgr) getPurchasePackageInfo(productId string) *pb.PurchasePackage {
  98. for k, v := range this.PurchasePackages {
  99. if v.ProductId == productId {
  100. return &this.PurchasePackages[k]
  101. }
  102. }
  103. return nil
  104. }
  105. // 获取等级特权的数值
  106. func (this *vipmgr) getPrivilegeValue(userId int, privilegeType int) int {
  107. user := this.getUserVip(userId, false)
  108. if user == nil {
  109. //log.Debug("vipmgr.getPrivilegeValue userId=%d not exist", userId)
  110. return pb.VipPrivilege_Invalid
  111. }
  112. if !user.IsVip() {
  113. return pb.VipPrivilege_Invalid
  114. }
  115. vipInfo := mgr.getVipByLevel(user.Level)
  116. if vipInfo == nil {
  117. //log.Debug("vipmgr.getPrivilegeValue vip config not found, level=%d", user.Level)
  118. return pb.VipPrivilege_Invalid
  119. }
  120. return vipInfo.GetPrivilegeParam(privilegeType)
  121. }
  122. // 判断是否能购买礼包
  123. func (this *vipmgr) canBuyPackage(userId int, productId string) bool {
  124. user := this.getUserVip(userId, false)
  125. if user == nil {
  126. log.Debug("vipmgr.canBuyPackage userId=%d not exist", userId)
  127. return false
  128. }
  129. return user.canBuyPackage(productId)
  130. }
  131. // 实际购买礼包(已完成支付),发放道具,添加购买历史记录
  132. func (this *vipmgr) buyPackage(userId int, productId string) {
  133. user := this.getUserVip(userId, true)
  134. // 用户不存在时,不需要直接拦截
  135. user.buyPackage(productId)
  136. }
  137. // 添加vip点数,可能触发升级,升级如果当前是vip,则需要发放登录道具和升级道具
  138. func (this *vipmgr) addVipPoint(userId int, point int) {
  139. user := this.getUserVip(userId, true)
  140. // 用户不存在时,不需要直接拦截
  141. user.addVipPoint(point)
  142. }
  143. // 添加vip时长(已完成支付)
  144. func (this *vipmgr) addVipSeconds(userId int, purchaseSeconds int) {
  145. user := this.getUserVip(userId, true)
  146. // 用户不存在时,不需要直接拦截
  147. user.addVipSeconds(purchaseSeconds)
  148. }
  149. // 检查是否能够领取每日礼包
  150. func (this *vipmgr) checkDailyAward(userId int) (bool, int) {
  151. user := this.getUserVip(userId, true)
  152. if user == nil {
  153. log.Debug("vipmgr.checkDailyAward userId=%d not exist", userId)
  154. return false, -1
  155. }
  156. success, _, code := user.checkDailyAward()
  157. return success, code
  158. }
  159. // 领取每日奖励
  160. func (this *vipmgr) giftDailyAward(userId int) bool {
  161. user := this.getUserVip(userId, true)
  162. if user == nil {
  163. log.Debug("vipmgr.giftDailyAward userId=%d not exist", userId)
  164. return false
  165. }
  166. return user.giftDailyAward()
  167. }
  168. func (this *vipmgr) dumpGetUserVip(param string) {
  169. log.Release("-------------------------------")
  170. log.Release("vipmgr.dumpGetUserVip param:%s", param)
  171. defer func() {
  172. log.Release("+++++++++++++++++++++++++++++++")
  173. log.Release("")
  174. }()
  175. var userId = 0
  176. var err error
  177. if param != "" {
  178. userId, err = strconv.Atoi(param)
  179. if err != nil {
  180. log.Release("vipmgr.dumpGetUserVip param error. err:%v", err)
  181. return
  182. }
  183. }
  184. this.lock.RLock()
  185. for _, value := range this.userList {
  186. if userId > 0 && userId != value.userId {
  187. continue
  188. }
  189. log.Release("vipmgr.dumpGetUserVip userId:%d, userVip:%+v", value.userId, value.UserVip)
  190. value.dumpVipTime()
  191. }
  192. this.lock.RUnlock()
  193. }
  194. func (this *vipmgr) dumpGetVipList() {
  195. log.Release("-------------------------------")
  196. log.Release("vipmgr.dumpGetVipList")
  197. defer func() {
  198. log.Release("+++++++++++++++++++++++++++++++")
  199. log.Release("")
  200. }()
  201. list := this.getVipList()
  202. d, _ := json.Marshal(list)
  203. log.Release(string(d))
  204. }
  205. func (this *vipmgr) dumpGetVipByLevel(param string) {
  206. log.Release("-------------------------------")
  207. log.Release("vipmgr.dumpGetVipByLevel %s", param)
  208. defer func() {
  209. log.Release("+++++++++++++++++++++++++++++++")
  210. log.Release("")
  211. }()
  212. level, err := strconv.Atoi(param)
  213. if err != nil {
  214. log.Release("vipmgr.dumpGetVipByLevel Parameter error. err:%v", err)
  215. return
  216. }
  217. levelInfo := this.getVipByLevel(level)
  218. d, _ := json.Marshal(levelInfo)
  219. log.Release(string(d))
  220. }
  221. func (this *vipmgr) dumpGetPurchasePackageInfo(param string) {
  222. log.Release("-------------------------------")
  223. log.Release("vipmgr.dumpGetPurchasePackageInfo %s", param)
  224. defer func() {
  225. log.Release("+++++++++++++++++++++++++++++++")
  226. log.Release("")
  227. }()
  228. info := this.getPurchasePackageInfo(param)
  229. d, _ := json.Marshal(info)
  230. log.Release(string(d))
  231. }
  232. func (this *vipmgr) dumpGetPurchasePackageList(param string) {
  233. log.Release("-------------------------------")
  234. log.Release("vipmgr.dumpGetPurchasePackageList %s", param)
  235. defer func() {
  236. log.Release("+++++++++++++++++++++++++++++++")
  237. log.Release("")
  238. }()
  239. var userId = 0
  240. var err error
  241. if param != "" {
  242. userId, err = strconv.Atoi(param)
  243. if err != nil {
  244. log.Release("vipmgr.dumpGetPurchasePackageList Parameter error. err:%v", err)
  245. return
  246. }
  247. }
  248. list := this.getPurchasePackageList(userId)
  249. d, _ := json.Marshal(list)
  250. log.Release(string(d))
  251. }
  252. func (this *vipmgr) canKickPrivateRoomUser(userId int, toUserId int) bool {
  253. u1 := this.getUserVip(userId, true)
  254. if u1 == nil || !u1.IsVip() {
  255. log.Debug("canKickPrivateRoomUser [%d] not vip", userId)
  256. return false
  257. }
  258. if this.getPrivilegeValueByLevel(u1.Level, pb.VipPrivilege_PrivateRoomKick) == 0 {
  259. log.Debug("canKickPrivateRoomUser no privilege Level[%d]", u1.Level)
  260. return false
  261. }
  262. u2 := this.getUserVip(toUserId, true)
  263. if u2 == nil {
  264. return true
  265. }
  266. if u2.IsVip() && u2.Level >= u1.Level {
  267. log.Debug("canKickPrivateRoomUser [%d]'s Level[%d] >= [%d]'s Level[%d]", toUserId, u2.Level, userId, u1.Level)
  268. return false
  269. }
  270. return true
  271. }
  272. func (this *vipmgr) getPrivilegeValueByLevel(level int, privilegeType int) int {
  273. vipInfo := mgr.getVipByLevel(level)
  274. if vipInfo == nil {
  275. //log.Debug("vipmgr.getPrivilegeValue vip config not found, level=%d", user.Level)
  276. return pb.VipPrivilege_Invalid
  277. }
  278. return vipInfo.GetPrivilegeParam(privilegeType)
  279. }