| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314 |
- package vip
- import (
- "encoding/json"
- "strconv"
- "sync"
- "bet24.com/log"
- pb "bet24.com/servers/micros/userservices/proto"
- )
- var mgr *vipmgr
- type vipmgr struct {
- lock *sync.RWMutex
- userList map[int]*userVip // 个人vip信息
- VipList []pb.VipInfo // 系统vip配置
- PurchasePackages []pb.PurchasePackage // 礼包
- }
- func newVipManager() *vipmgr {
- mgr = new(vipmgr)
- mgr.lock = &sync.RWMutex{}
- mgr.userList = make(map[int]*userVip)
- mgr.loadConfig()
- return mgr
- }
- // 根据用户ID查询用户vip状态
- func (this *vipmgr) getUserVip(userId int, forceCreate bool) *userVip {
- this.lock.RLock()
- u, ok := this.userList[userId]
- this.lock.RUnlock()
- if ok {
- return u
- }
- if !forceCreate {
- //log.Debug("vipmgr.getUserVip user not found, userId[%d]", userId)
- return nil
- }
- u = newUserVip(userId)
- this.lock.Lock()
- this.userList[userId] = u
- this.lock.Unlock()
- return u
- }
- // 用户进入,创建用户信息,读取用户礼包购买历史,如果是vip,判断是否领取VIP奖励
- func (this *vipmgr) onUserEnter(userId int) {
- uv := this.getUserVip(userId, true)
- uv.onUserEntered()
- }
- // 将用户标记为离线
- func (this *vipmgr) onUserExit(userId int) {
- this.lock.Lock()
- defer this.lock.Unlock()
- _, ret := this.userList[userId]
- if ret {
- this.userList[userId].userId = 0
- }
- delete(this.userList, userId)
- }
- // 获取vip列表,前端展现用
- func (this *vipmgr) getVipList() []pb.VipInfo {
- return this.VipList
- }
- // 获取购买礼包列表
- func (this *vipmgr) getPurchasePackageList(userId int) []pb.PurchasePackage {
- if len(this.PurchasePackages) == 0 {
- return nil
- }
- ret := make([]pb.PurchasePackage, len(this.PurchasePackages))
- copy(ret, this.PurchasePackages)
- for i := 0; i < len(ret); i++ {
- ret[i].BuyAble = this.canBuyPackage(userId, ret[i].ProductId)
- //ret[i].Price = ret[i].Price
- }
- return ret
- }
- // 根据等级获取vip配置信息
- func (this *vipmgr) getVipByLevel(level int) *pb.VipInfo {
- for k, v := range this.VipList {
- if v.Level == level {
- return &this.VipList[k]
- }
- }
- return nil
- }
- // 获取vip点数对应的等级
- func (this *vipmgr) getVipByPoint(point int) int {
- ret := 0
- for _, v := range this.VipList {
- if point < v.Point {
- continue
- }
- if v.Level <= ret {
- continue
- }
- ret = v.Level
- }
- return ret
- }
- // 获取礼包信息
- func (this *vipmgr) getPurchasePackageInfo(productId string) *pb.PurchasePackage {
- for k, v := range this.PurchasePackages {
- if v.ProductId == productId {
- return &this.PurchasePackages[k]
- }
- }
- return nil
- }
- // 获取等级特权的数值
- func (this *vipmgr) getPrivilegeValue(userId int, privilegeType int) int {
- user := this.getUserVip(userId, false)
- if user == nil {
- //log.Debug("vipmgr.getPrivilegeValue userId=%d not exist", userId)
- return pb.VipPrivilege_Invalid
- }
- if !user.IsVip() {
- return pb.VipPrivilege_Invalid
- }
- vipInfo := mgr.getVipByLevel(user.Level)
- if vipInfo == nil {
- //log.Debug("vipmgr.getPrivilegeValue vip config not found, level=%d", user.Level)
- return pb.VipPrivilege_Invalid
- }
- return vipInfo.GetPrivilegeParam(privilegeType)
- }
- // 判断是否能购买礼包
- func (this *vipmgr) canBuyPackage(userId int, productId string) bool {
- user := this.getUserVip(userId, false)
- if user == nil {
- log.Debug("vipmgr.canBuyPackage userId=%d not exist", userId)
- return false
- }
- return user.canBuyPackage(productId)
- }
- // 实际购买礼包(已完成支付),发放道具,添加购买历史记录
- func (this *vipmgr) buyPackage(userId int, productId string) {
- user := this.getUserVip(userId, true)
- // 用户不存在时,不需要直接拦截
- user.buyPackage(productId)
- }
- // 添加vip点数,可能触发升级,升级如果当前是vip,则需要发放登录道具和升级道具
- func (this *vipmgr) addVipPoint(userId int, point int) {
- user := this.getUserVip(userId, true)
- // 用户不存在时,不需要直接拦截
- user.addVipPoint(point)
- }
- // 添加vip时长(已完成支付)
- func (this *vipmgr) addVipSeconds(userId int, purchaseSeconds int) {
- user := this.getUserVip(userId, true)
- // 用户不存在时,不需要直接拦截
- user.addVipSeconds(purchaseSeconds)
- }
- // 检查是否能够领取每日礼包
- func (this *vipmgr) checkDailyAward(userId int) (bool, int) {
- user := this.getUserVip(userId, true)
- if user == nil {
- log.Debug("vipmgr.checkDailyAward userId=%d not exist", userId)
- return false, -1
- }
- success, _, code := user.checkDailyAward()
- return success, code
- }
- // 领取每日奖励
- func (this *vipmgr) giftDailyAward(userId int) bool {
- user := this.getUserVip(userId, true)
- if user == nil {
- log.Debug("vipmgr.giftDailyAward userId=%d not exist", userId)
- return false
- }
- return user.giftDailyAward()
- }
- func (this *vipmgr) dumpGetUserVip(param string) {
- log.Release("-------------------------------")
- log.Release("vipmgr.dumpGetUserVip param:%s", param)
- defer func() {
- log.Release("+++++++++++++++++++++++++++++++")
- log.Release("")
- }()
- var userId = 0
- var err error
- if param != "" {
- userId, err = strconv.Atoi(param)
- if err != nil {
- log.Release("vipmgr.dumpGetUserVip param error. err:%v", err)
- return
- }
- }
- this.lock.RLock()
- for _, value := range this.userList {
- if userId > 0 && userId != value.userId {
- continue
- }
- log.Release("vipmgr.dumpGetUserVip userId:%d, userVip:%+v", value.userId, value.UserVip)
- value.dumpVipTime()
- }
- this.lock.RUnlock()
- }
- func (this *vipmgr) dumpGetVipList() {
- log.Release("-------------------------------")
- log.Release("vipmgr.dumpGetVipList")
- defer func() {
- log.Release("+++++++++++++++++++++++++++++++")
- log.Release("")
- }()
- list := this.getVipList()
- d, _ := json.Marshal(list)
- log.Release(string(d))
- }
- func (this *vipmgr) dumpGetVipByLevel(param string) {
- log.Release("-------------------------------")
- log.Release("vipmgr.dumpGetVipByLevel %s", param)
- defer func() {
- log.Release("+++++++++++++++++++++++++++++++")
- log.Release("")
- }()
- level, err := strconv.Atoi(param)
- if err != nil {
- log.Release("vipmgr.dumpGetVipByLevel Parameter error. err:%v", err)
- return
- }
- levelInfo := this.getVipByLevel(level)
- d, _ := json.Marshal(levelInfo)
- log.Release(string(d))
- }
- func (this *vipmgr) dumpGetPurchasePackageInfo(param string) {
- log.Release("-------------------------------")
- log.Release("vipmgr.dumpGetPurchasePackageInfo %s", param)
- defer func() {
- log.Release("+++++++++++++++++++++++++++++++")
- log.Release("")
- }()
- info := this.getPurchasePackageInfo(param)
- d, _ := json.Marshal(info)
- log.Release(string(d))
- }
- func (this *vipmgr) dumpGetPurchasePackageList(param string) {
- log.Release("-------------------------------")
- log.Release("vipmgr.dumpGetPurchasePackageList %s", param)
- defer func() {
- log.Release("+++++++++++++++++++++++++++++++")
- log.Release("")
- }()
- var userId = 0
- var err error
- if param != "" {
- userId, err = strconv.Atoi(param)
- if err != nil {
- log.Release("vipmgr.dumpGetPurchasePackageList Parameter error. err:%v", err)
- return
- }
- }
- list := this.getPurchasePackageList(userId)
- d, _ := json.Marshal(list)
- log.Release(string(d))
- }
- func (this *vipmgr) canKickPrivateRoomUser(userId int, toUserId int) bool {
- u1 := this.getUserVip(userId, true)
- if u1 == nil || !u1.IsVip() {
- log.Debug("canKickPrivateRoomUser [%d] not vip", userId)
- return false
- }
- if this.getPrivilegeValueByLevel(u1.Level, pb.VipPrivilege_PrivateRoomKick) == 0 {
- log.Debug("canKickPrivateRoomUser no privilege Level[%d]", u1.Level)
- return false
- }
- u2 := this.getUserVip(toUserId, true)
- if u2 == nil {
- return true
- }
- if u2.IsVip() && u2.Level >= u1.Level {
- log.Debug("canKickPrivateRoomUser [%d]'s Level[%d] >= [%d]'s Level[%d]", toUserId, u2.Level, userId, u1.Level)
- return false
- }
- return true
- }
- func (this *vipmgr) getPrivilegeValueByLevel(level int, privilegeType int) int {
- vipInfo := mgr.getVipByLevel(level)
- if vipInfo == nil {
- //log.Debug("vipmgr.getPrivilegeValue vip config not found, level=%d", user.Level)
- return pb.VipPrivilege_Invalid
- }
- return vipInfo.GetPrivilegeParam(privilegeType)
- }
|