diff --git a/comm/const.go b/comm/const.go index a16c17b18..1a6236d3a 100644 --- a/comm/const.go +++ b/comm/const.go @@ -645,3 +645,17 @@ const ( Arena = "arena" Sign = "sign" ) + +// 特权类型 +const ( + PrivilegeType1 = iota + 1 //每日获得 + PrivilegeType2 //金币商店每日免费刷新次数 + PrivilegeType3 //维京远征每日可购买挑战次数 + PrivilegeType4 //狩猎每日可购买挑战次数 + PrivilegeType5 //竞技场每日可购买挑战次数 + PrivilegeType6 //梦境每日可购买挑战次数 + PrivilegeType7 //巨怪商队背包容量 + PrivilegeType8 //美食馆每日最大制作时间 + PrivilegeType9 //武馆每日最大练功时间 + PrivilegeType10 //铁匠铺每日最大锻造时间 +) diff --git a/comm/imodule.go b/comm/imodule.go index ff7b8d225..f5e3afc82 100644 --- a/comm/imodule.go +++ b/comm/imodule.go @@ -281,10 +281,10 @@ type ( RenewPrivilegeCard(session IUserSession, cId string) (code pb.ErrorCode) // 检查特权 CheckPrivilege(session IUserSession, cId string) (privilege *pb.DBPrivilege) - // 查询玩家当前所有特权 返回特权id - QueryPrivilege(session IUserSession) (privilegeID []int32) + // 检查每日特权邮件 + CheckDailyPrivilegeMail(session IUserSession) // 获得vip - AddVipData(session IUserSession) + AddVipData(session IUserSession, oldVip, newVip int32) } //武馆 IMartialhall interface { diff --git a/modules/privilege/model_vip.go b/modules/privilege/model_vip.go index 55742c33d..7d237c5ca 100644 --- a/modules/privilege/model_vip.go +++ b/modules/privilege/model_vip.go @@ -3,12 +3,9 @@ package privilege import ( "go_dreamfactory/comm" "go_dreamfactory/lego/core" - "go_dreamfactory/lego/sys/mgo" "go_dreamfactory/modules" "go_dreamfactory/pb" - "go_dreamfactory/sys/configure" - "go.mongodb.org/mongo-driver/bson/primitive" "go.mongodb.org/mongo-driver/mongo" "go.mongodb.org/mongo-driver/x/bsonx" ) @@ -33,16 +30,8 @@ func (this *ModelVip) Init(service core.IService, module core.IModule, comp core // 获取vip信息 func (this *ModelVip) getVipList(uid string) (vip *pb.DBVip, err error) { vip = &pb.DBVip{} - if err = this.Get(uid, vip); err == mgo.MongodbNil { // 没有数据 直接创建一条 - - vip.Id = primitive.NewObjectID().Hex() - vip.CTime = configure.Now().Unix() - if err = this.Add(uid, vip); err != nil { - this.module.Errorf("err:%v", err) - return - } - err = nil - return vip, err + if err = this.Get(uid, vip); err != nil { + return } return } @@ -53,19 +42,11 @@ func (this *ModelVip) modifyVipData(uid string, data map[string]interface{}) err } // 增加vip信息 -func (this *ModelVip) addVipData(uId string) (vip *pb.DBVip, err error) { +func (this *ModelVip) addVipData(uId string, vip *pb.DBVip) (err error) { - vip, err = this.getVipList(uId) - if err != nil { - return vip, err - } - if vip.Id == "" { - vip.Id = primitive.NewObjectID().Hex() - vip.CTime = configure.Now().Unix() - if err = this.Add(uId, vip); err != nil { - this.module.Errorf("err:%v", err) - return - } + if err = this.Add(uId, vip); err != nil { + this.module.Errorf("err:%v", err) + return } return diff --git a/modules/privilege/module.go b/modules/privilege/module.go index 128c9c468..e2ab5b60b 100644 --- a/modules/privilege/module.go +++ b/modules/privilege/module.go @@ -4,10 +4,10 @@ import ( "go_dreamfactory/comm" "go_dreamfactory/lego/core" "go_dreamfactory/lego/sys/event" + "go_dreamfactory/lego/sys/mgo" "go_dreamfactory/modules" "go_dreamfactory/pb" "go_dreamfactory/sys/configure" - "go_dreamfactory/sys/db" "go_dreamfactory/utils" "go.mongodb.org/mongo-driver/bson/primitive" @@ -46,6 +46,7 @@ func (this *Privilege) OnInstallComp() { this.api_comp = this.RegisterComp(new(apiComp)).(*apiComp) this.modelPrivilege = this.RegisterComp(new(ModelPrivilege)).(*ModelPrivilege) this.configure = this.RegisterComp(new(configureComp)).(*configureComp) + this.modelVip = this.RegisterComp(new(ModelVip)).(*ModelVip) } func (this *Privilege) Start() (err error) { @@ -61,7 +62,7 @@ func (this *Privilege) Start() (err error) { //Event------------------------------------------------------------------------------------------------------------ func (this *Privilege) EventUserOffline(session comm.IUserSession) { - this.modelPrivilege.DelByUId(session.GetUserId(), db.SetDBMgoLog(false)) + //this.modelPrivilege.DelByUId(session.GetUserId(), db.SetDBMgoLog(false)) } // 购买了一个新的特权 @@ -82,20 +83,23 @@ func (this *Privilege) CreatePrivilegeCard(session comm.IUserSession, cId string } for _, v := range list { if v.CId == cId { + update := map[string]interface{}{} if v.ETime > configure.Now().Unix() { // 加时间 - v.ETime += int64(conf.AssertDay) * 24 * 3600 - } else { // 检测能否续费 - if configure.Now().Unix()-v.ETime <= int64(conf.RenewDay)*24*3600 { - v.ETime = configure.Now().Unix() + int64(conf.AssertDay)*24*3600 - } else { + if v.ETime-configure.Now().Unix() > int64(conf.RenewDay)*24*3600 { + code = pb.ErrorCode_PayRenewTimeErr return } + v.ETime += int64(conf.AssertDay) * 24 * 3600 + update["eTime"] = v.ETime + } else { // 过期了 + v.CTime = configure.Now().Unix() + v.ETime = v.CTime + int64(conf.AssertDay)*24*3600 + update["cTime"] = v.CTime + update["eTime"] = v.ETime } - if err = this.modelPrivilege.Change(session.GetUserId(), map[string]interface{}{ - "eTime": v.ETime, - }); err != nil { + if err = this.modelPrivilege.Change(session.GetUserId(), update); err != nil { this.Errorf("err:%v", err) return } @@ -103,36 +107,55 @@ func (this *Privilege) CreatePrivilegeCard(session comm.IUserSession, cId string break } } - if !bFind { + if !bFind { // 创建一条新的信息 data := &pb.DBPrivilege{ - Id: primitive.NewObjectID().Hex(), - Uid: session.GetUserId(), - CId: cId, - + Id: primitive.NewObjectID().Hex(), + Uid: session.GetUserId(), + CId: cId, CTime: configure.Now().Unix(), - ETime: 0, + ETime: configure.Now().Unix() + int64(conf.AssertDay*24*3600), // 设置过期时间 RewardTime: configure.Now().Unix(), } - data.ETime = configure.Now().Unix() + int64(conf.AssertDay*24*3600) // 设置过期时间 - // 特权插入 vip, err := this.modelVip.getVipList(session.GetUserId()) - if err == nil { + if err != nil && err == mgo.MongodbNil { // 没有数据 直接创建一条 + vip = &pb.DBVip{ + Id: primitive.NewObjectID().Hex(), + Uid: session.GetUserId(), + Reward: map[int32]bool{}, + Privilege: map[int32]*pb.PrivilegeData{}, + CTime: configure.Now().Unix(), + RewardTime: 0, + } + if err = this.modelVip.addVipData(session.GetUserId(), vip); err != nil { + this.Errorf("err:%v", err) + return + } + } + if vip.Id != "" { update := map[string]interface{}{} for _, v := range conf.PrivilegeId { conf := this.configure.GetPrivilegeData(v) if conf != nil { - if _, ok := vip.Privilege[conf.PrivilegeType]; ok { - vip.Privilege[conf.PrivilegeType].PrivilegeID = append(vip.Privilege[conf.PrivilegeType].PrivilegeID, v) + // 过滤重复的特权 + bRepeat := false + for _, v1 := range vip.Privilege[conf.PrivilegeType].PrivilegeID { + if v1 == v { + bRepeat = true + break + } + } + if !bRepeat { + vip.Privilege[conf.PrivilegeType].PrivilegeID = append(vip.Privilege[conf.PrivilegeType].PrivilegeID, v) + } } else { sz := &pb.PrivilegeData{} sz.PrivilegeID = append(sz.PrivilegeID, v) vip.Privilege[conf.PrivilegeType] = sz } } - } update["privilege"] = vip.Privilege this.modelVip.modifyVipData(session.GetUserId(), update) @@ -141,7 +164,7 @@ func (this *Privilege) CreatePrivilegeCard(session comm.IUserSession, cId string this.modelPrivilege.addNewPrivilegeData(session.GetUserId(), data) this.SendDailyMail(session, cId, 1, conf.PType) } - + // 即使奖励 马上发送 if code = this.DispenseRes(session, conf.DisposableReward, true); code != pb.ErrorCode_Success { return } @@ -206,8 +229,8 @@ func (this *Privilege) CheckPrivilege(session comm.IUserSession, cId string) (pr return } -// 查询特权信息,把过期的特权清除掉 -func (this *Privilege) QueryPrivilege(session comm.IUserSession) (privilegeID []int32) { +// 检查特权 并发送每日邮件 +func (this *Privilege) CheckDailyPrivilegeMail(session comm.IUserSession) { privilgeList, err := this.modelVip.getVipList(session.GetUserId()) if err != nil { return @@ -219,13 +242,10 @@ func (this *Privilege) QueryPrivilege(session comm.IUserSession) (privilegeID [] for _, v := range list { conf, err := this.configure.GetPrivilegeCard(v.CId) if err != nil { - return nil + return } if v.ETime < configure.Now().Unix() { // 判断当前特权是否过期 - if err := this.modelPrivilege.DelListlds(session.GetUserId(), v.Id); err != nil { - this.Errorf("delete privilege failed:%v", err) - } update := map[string]interface{}{} for _, id := range conf.PrivilegeId { // 找到过期的特权 并删除 data := this.configure.GetPrivilegeData(id) @@ -302,8 +322,46 @@ func (this *Privilege) SendDailyMail(session comm.IUserSession, cId string, coun } } -func (this *Privilege) AddVipData(session comm.IUserSession) { - vip, err := this.modelVip.addVipData(session.GetUserId()) +func (this *Privilege) AddVipData(session comm.IUserSession, oldVip, newVip int32) { + if newVip <= oldVip { + return + } + vip, err := this.modelVip.getVipList(session.GetUserId()) + if err != nil && err == mgo.MongodbNil { // 没有数据 直接创建一条 + vip = &pb.DBVip{ + Id: primitive.NewObjectID().Hex(), + Uid: session.GetUserId(), + Reward: map[int32]bool{}, + Privilege: map[int32]*pb.PrivilegeData{}, + CTime: configure.Now().Unix(), + RewardTime: 0, + } + if err = this.modelVip.addVipData(session.GetUserId(), vip); err != nil { + this.Errorf("err:%v", err) + return + } + } + update := map[string]interface{}{} + for i := oldVip; i < newVip; i++ { + conf := this.configure.GetVipConfigureData(i) + if conf != nil { + for _, v := range conf.VipPrivilege { + data := this.configure.GetPrivilegeData(v) + if data != nil { + + if _, ok := vip.Privilege[data.PrivilegeType]; ok { + vip.Privilege[data.PrivilegeType].PrivilegeID = append(vip.Privilege[data.PrivilegeType].PrivilegeID, v) + } else { + sz := &pb.PrivilegeData{} + sz.PrivilegeID = append(sz.PrivilegeID, v) + vip.Privilege[data.PrivilegeType] = sz + } + } + } + } + } + update["privilege"] = vip.Privilege + this.modelVip.modifyVipData(session.GetUserId(), update) if err != nil { // 推送 session.SendMsg(string(this.GetType()), PrivilegeGetListResp, &pb.PrivilegeVipListResp{Data: vip}) } diff --git a/modules/user/api_login.go b/modules/user/api_login.go index 78d0b90fa..2ad67e0fd 100644 --- a/modules/user/api_login.go +++ b/modules/user/api_login.go @@ -148,8 +148,7 @@ func (this *apiComp) Login(session comm.IUserSession, req *pb.UserLoginReq) (cod // 日常登录任务 this.module.ModuleRtask.SendToRtask(session, comm.Rtype7, 1) - // 检查特权 并发送每日邮件 - // this.module.ModulePrivilege.QueryPrivilege(session) + this.module.ModulePrivilege.CheckDailyPrivilegeMail(session) //推送登录公告 if this.module.modelUser.isLoginFirst(lastLoginTime) { this.chat.SendSysChatToUser(session, comm.ChatSystem2, 0, 0) diff --git a/modules/user/model_user.go b/modules/user/model_user.go index f11ddd3f3..6ab8d82e0 100644 --- a/modules/user/model_user.go +++ b/modules/user/model_user.go @@ -211,8 +211,8 @@ func (this *ModelUser) ChangeVipExp(event interface{}, next func(event interface } } // - if ul.viplv == 0 && vipLv > 0 { // 新获得了vip - this.module.ModulePrivilege.AddVipData(ul.session) + if ul.viplv != vipLv { // 新获得了vip + this.module.ModulePrivilege.AddVipData(ul.session, ul.viplv, vipLv) } // 推送玩家vip 经验变化 ul.session.SendMsg(string(this.module.GetType()), UserSubTypeVipChangedPush,