| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164 |
- package level
- import (
- "bet24.com/log"
- "bet24.com/servers/common"
- activityservice "bet24.com/servers/micros/activityservice/proto"
- inventory "bet24.com/servers/micros/item_inventory/proto"
- item "bet24.com/servers/micros/item_inventory/proto"
- notification "bet24.com/servers/micros/notification/proto"
- "bet24.com/servers/micros/userservices/handler/vip"
- pb "bet24.com/servers/micros/userservices/proto"
- "encoding/json"
- "fmt"
- "sync"
- "time"
- )
- type userlevel struct {
- userId int // 用户ID
- pb.LevelBaseInfo // 基本信息
- lock *sync.RWMutex
- }
- func newUserLevel(userId int) *userlevel {
- ul := new(userlevel)
- ul.userId = userId
- ul.lock = &sync.RWMutex{}
- ul.loadUserLevelInfo()
- return ul
- }
- // 初始化用户Vip信息
- func (ul *userlevel) loadUserLevelInfo() {
- ul.LevelBaseInfo = getUserLevel(ul.userId)
- // 如果等级不匹配,保留等级的情况下,清理经验值
- if ul.Level != mgr.getLevelByExperience(ul.Experience) {
- li := mgr.getLevelInfo(ul.Level)
- //log.Release("userlevel.loadUserLevelInfo update user[%d]'s Experience [%d]->[%d] of Level[%d]",
- // ul.userId, ul.Experience, li.Exp, ul.Level)
- ul.Experience = li.Exp
- go ul.updateUserLevel()
- }
- if ul.LevelBaseInfo.LoginAward == pb.Award_Notify {
- go func() {
- time.Sleep(2 * time.Second)
- // 通知客户端
- notification.AddNotification(ul.userId, notification.Notification_Chip, "")
- }()
- }
- }
- func (ul *userlevel) addExperience(value int) int {
- // 非facebook账号
- /*if !ul.IsAdd && !ul.IsFacebook {
- return
- }*/
- if ul.Level >= mgr.maxLevel {
- return 0
- }
- // 额外经验加成
- vipAddRate := vip.GetExtraExperience(ul.userId)
- if vipAddRate > 0 {
- value = value * (100 + vipAddRate) / 100
- }
- ul.Experience += value
- newLevel := mgr.getLevelByExperience(ul.Experience)
- defer ul.updateUserLevel()
- if newLevel == ul.Level {
- ul.broadcastExperience(value)
- return value
- }
- // 处理跨级问题
- var giftPack []item.ItemPack
- for i := ul.Level + 1; i <= newLevel; i++ {
- li := mgr.getLevelInfo(i)
- giftPack = append(giftPack, li.GiftPack...)
- }
- // 等级礼包
- go activityservice.OnUserLevelChange(ul.userId, ul.Level, newLevel)
- ul.Level = newLevel
- ul.broadcastExperience(value)
- if len(giftPack) > 0 {
- ul.sendAward(giftPack, fmt.Sprintf("user level up[%d] award", newLevel), common.LOGTYPE_LEVEL_UPGRADE)
- }
- var levelInfo pb.LevelInfo
- levelInfo.Level = ul.Level
- levelInfo.Exp = ul.Experience
- //levelInfo.GiftPack = giftPack
- d, _ := json.Marshal(levelInfo)
- go notification.AddNotification(ul.userId, notification.Notification_Level, string(d))
- return value
- }
- func (ul *userlevel) broadcastExperience(delta int) {
- var expChange struct {
- Delta int
- Exp int
- }
- expChange.Delta = delta
- expChange.Exp = ul.Experience
- d, _ := json.Marshal(expChange)
- go notification.AddNotification(ul.userId, notification.Notification_Experience, string(d))
- }
- func (ul *userlevel) sendAward(items []item.ItemPack, desc string, logType int) {
- if len(items) <= 0 {
- return
- }
- inventory.AddItems(ul.userId, items, desc, logType)
- }
- func (ul *userlevel) updateUserLevel() {
- go updateUserLevel(ul.userId, ul.Level, ul.Experience, ul.LoginAward)
- }
- // 是否显示大厅
- func (ul *userlevel) isShow() bool {
- // 白名单
- if ul.IsWhite == pb.WhiteList_Black {
- return true
- }
- // 达到条件
- if ul.LoginAward >= pb.Award_Available {
- return true
- }
- return false
- }
- func (ul *userlevel) loginAward() (bool, int) {
- if ul.LoginAward != pb.Award_Available {
- return false, 0
- }
- ul.LoginAward = pb.Award_Received
- retCode, amount := loginAward(ul.userId)
- if !retCode {
- return retCode, 0
- }
- var items []item.ItemPack
- items = append(items, item.ItemPack{
- ItemId: item.Item_Chip,
- Count: amount,
- })
- inventory.AddItems(ul.userId, items, "元宝大厅登录奖励", common.LOGTYPE_LOGIN_AWARD)
- return retCode, amount
- }
- func (ul *userlevel) dump() {
- ul.lock.RLock()
- defer ul.lock.RUnlock()
- log.Debug(" userlevel.dump %d:[%d.%d] IsWhite[%d]", ul.userId, ul.Level, ul.Experience, ul.IsWhite)
- }
|