diff --git a/comm/const.go b/comm/const.go index e06c59e68..29daa139c 100644 --- a/comm/const.go +++ b/comm/const.go @@ -534,6 +534,8 @@ const ( //Rpc Rpc_AccountBan core.Rpc_Key = "Rpc_AccountBan" // 账号状态 RPC_GameinviteOffline core.Rpc_Key = "RPC_GameinviteOffline" // 游戏邀请离线通知 + + Rpc_ModuleVikingFigthEnd core.Rpc_Key = "Rpc_ModuleVikingFigthEnd" //维京远征结算 ) // 事件类型定义处 @@ -1019,6 +1021,7 @@ const ( MaxRankList = 50 // 赛季塔 排行榜人数 MaxMailCount = 50 // 当前邮件最大数量 MaxRankNum = 3 + MinRankList = 10 // 排行榜人数 ) // /聊天消息公告类型 diff --git a/modules/timer/vikingrank.go b/modules/timer/vikingrank.go new file mode 100644 index 000000000..fa7e49d27 --- /dev/null +++ b/modules/timer/vikingrank.go @@ -0,0 +1,67 @@ +package timer + +import ( + "context" + "go_dreamfactory/comm" + "go_dreamfactory/lego/base" + "go_dreamfactory/lego/core" + "go_dreamfactory/lego/core/cbase" + "go_dreamfactory/lego/sys/cron" + "go_dreamfactory/lego/sys/timewheel" + "go_dreamfactory/modules" + "go_dreamfactory/pb" + "go_dreamfactory/sys/configure" + "go_dreamfactory/sys/db" + "go_dreamfactory/utils" +) + +type VikingRank struct { + cbase.ModuleBase + modules.MCompModel + service base.IRPCXService + module *Timer + cTimerObj *timewheel.Task +} + +//组件初始化接口 +func (this *VikingRank) Init(service core.IService, module core.IModule, comp core.IModuleComp, options core.IModuleOptions) (err error) { + + this.TableName = comm.TableViking + this.MCompModel.Init(service, module, comp, options) + this.module = module.(*Timer) + this.service = service.(base.IRPCXService) + + return +} + +func (this *VikingRank) Start() (err error) { + if !db.IsCross() { + return + } + err = this.MCompModel.Start() + opentime := this.service.GetOpentime().Unix() + if configure.Now().Unix() < opentime { // 开服时间是未来可能存在问题 + return + } + // 0 0 0 ? * MON // 每周一零点 + cron.AddFunc("0 0 0 ? * MON", this.TimerSeason) + + this.TimerSeason() + return +} + +func (this *VikingRank) TimerSeason() { + endTime := utils.WeekIntervalTime() + this.module.Debugf("TimerSeason end: %d,cur time:%d", endTime, configure.Now().Unix()) + + if err := this.service.RpcCall( + context.Background(), + comm.Service_Worker, + string(comm.Rpc_ModuleVikingFigthEnd), + pb.EmptyReq{}, + nil, + ); err != nil { + this.module.Errorln(err) + } + +} diff --git a/modules/viking/api_seasonrank.go b/modules/viking/api_seasonrank.go index 6d2f65e49..03efff675 100644 --- a/modules/viking/api_seasonrank.go +++ b/modules/viking/api_seasonrank.go @@ -4,6 +4,7 @@ import ( "go_dreamfactory/comm" "go_dreamfactory/pb" "go_dreamfactory/sys/db" + "go_dreamfactory/utils" ) //参数校验 @@ -23,23 +24,15 @@ func (this *apiComp) SeasonRank(session comm.IUserSession, req *pb.VikingSeasonR err error ranks []*pb.DBVSeasonRecord players []*pb.DBVikingSRank + conn_ *db.DBConn ) if errdata = this.SeasonRankCheck(session, req); errdata != nil { return // 参数校验失败直接返回 } - var ( - conn_ *db.DBConn - ) - if bcross, _ := this.module.CheckCurSeasonData(); bcross { - conn_, err = db.Local() // 获取跨服数据库对象 - if err != nil { - return - } - } else { //数据记录在本服 - conn_, err = db.Cross() - if err != nil { - return - } + + conn_, err = db.Cross() + if err != nil { + return } if uids, err = this.module.modelsrank.querySRankUser(int(req.BoosType), conn_); err != nil { errdata = &pb.ErrorData{ @@ -68,8 +61,10 @@ func (this *apiComp) SeasonRank(session comm.IUserSession, req *pb.VikingSeasonR } } + _, etime := utils.GetMonthStartEnd() session.SendMsg(string(this.module.GetType()), VikingSeasonRankReq, &pb.VikingSeasonRankResp{ Ranks: players, + Etime: etime, }) return } diff --git a/modules/viking/comp_configure.go b/modules/viking/comp_configure.go index b7979ad6c..0e67e4f2a 100644 --- a/modules/viking/comp_configure.go +++ b/modules/viking/comp_configure.go @@ -16,6 +16,7 @@ var moduleName = "viking" const ( game_vikingboss = "game_vikingboss.json" // game_challenge = "game_vikingchallenge.json" + viking_reward = "game_vikingreward.json" //全局配置表 ) ///配置管理基础组件 @@ -28,8 +29,9 @@ type configureComp struct { //组件初始化接口 func (this *configureComp) Init(service core.IService, module core.IModule, comp core.IModuleComp, options core.IModuleOptions) (err error) { err = this.MCompConfigure.Init(service, module, comp, options) - + err = this.LoadConfigure(viking_reward, cfg.NewGameVikingReward) this._vikingMap = make(map[int64]*cfg.GameVikingBossData, 0) + configure.RegisterConfigure(game_vikingboss, cfg.NewGameVikingBoss, func() { if v, err := this.GetConfigure(game_vikingboss); err == nil { if configure, ok := v.(*cfg.GameVikingBoss); ok { @@ -45,6 +47,7 @@ func (this *configureComp) Init(service core.IService, module core.IModule, comp return }) + this.GetVikingRewardConf() return } @@ -114,3 +117,35 @@ func (this *configureComp) GetVikingBossAllData() (data map[int32]int32) { } return } +func (this *configureComp) GetVikingRewardConf() (conf []*cfg.GameVikingRewardData) { + + if v, err := this.GetConfigure(viking_reward); err == nil { + if configure, ok := v.(*cfg.GameVikingReward); ok { + szReward := configure.GetDataList() + var ( + pos int32 + rankid int32 + uids []string // 玩家发奖 + ) + for i := 0; i < 50; i++ { + rankid = int32(i) + 1 // 排名id + if szReward[pos].RankLow <= rankid && szReward[pos].RankUp >= rankid { + uids = append(uids, "1") + } else { + // this.moduleViking.mail.SendNewMail(&pb.DBMailData{ + // Cid: "SeasonViking1Reward", + // Param: []string{fmt.Sprintf("%d-%d", szReward[pos].RankLow, szReward[pos].RankUp)}, + // CreateTime: uint64(configure.Now().Unix()), + // Items: Items, + // }, uids...) + fmt.Printf("%v,%v", uids, szReward[pos]) + uids = []string{} + pos += 1 + } + } + + return + } + } + return +} diff --git a/modules/viking/model_rank.go b/modules/viking/model_rank.go index 4de88971c..a3436a726 100644 --- a/modules/viking/model_rank.go +++ b/modules/viking/model_rank.go @@ -58,7 +58,7 @@ func (this *ModelRank) querySRankUser(bossid int) (ranks []string, err error) { ) tableName := this.TableName + strconv.Itoa(int(bossid)) - if result, err = this.Redis.ZRevRange(tableName, 0, 50).Result(); err != nil { + if result, err = this.Redis.ZRevRange(tableName, 0, comm.MinRankList).Result(); err != nil { //this.module.Errorln(err) return } @@ -137,6 +137,13 @@ func (this *ModelRank) CheckRank(uid string, boosID int32, difficulty int32, lin } update := make(map[string]interface{}, 0) update["uinfo"] = record.Uinfo + if _, ok := record.Data[boosID]; !ok { + record.Data[boosID] = &pb.ScoreData{ + Costime: map[int32]int32{}, + Maxnandu: 0, + Line: map[int32]*pb.LineData{}, + } + } if record.Data[boosID] == nil { record.Data[boosID].Costime = make(map[int32]int32, 0) record.Data[boosID].Line = make(map[int32]*pb.LineData, 0) diff --git a/modules/viking/model_srank.go b/modules/viking/model_srank.go index 508225f97..f202378e2 100644 --- a/modules/viking/model_srank.go +++ b/modules/viking/model_srank.go @@ -2,6 +2,7 @@ package viking import ( "context" + "fmt" "go_dreamfactory/comm" "go_dreamfactory/lego/core" "go_dreamfactory/lego/sys/mgo" @@ -9,6 +10,7 @@ import ( "go_dreamfactory/modules" "go_dreamfactory/pb" "go_dreamfactory/sys/configure" + cfg "go_dreamfactory/sys/configure/structs" "go_dreamfactory/sys/db" "go_dreamfactory/utils" "strconv" @@ -35,6 +37,7 @@ func (this *ModelSRank) Init(service core.IService, module core.IModule, comp co return } +// 批量查询 func (this *ModelSRank) queryPlayers(uIds []string, conn_ *db.DBConn) (result []*pb.DBVSeasonRecord, err error) { result = make([]*pb.DBVSeasonRecord, 0) model := db.NewDBModelByExpired(comm.TableVikingSRank, conn_) @@ -99,23 +102,14 @@ func (this *ModelSRank) CheckSeasonRank(uid string, boosID int32, difficulty int var ( conn_ *db.DBConn err error - bcross bool record *pb.DBVSeasonRecord update map[string]interface{} ) update = make(map[string]interface{}, 0) - bcross, _ = this.CheckCurSeasonData() - if bcross { - conn_, err = db.Local() // 获取跨服数据库对象 - if err != nil { - return - } - } else { //数据记录在本服 - conn_, err = db.Cross() - if err != nil { - return - } + conn_, err = db.Cross() + if err != nil { + return } user, err := this.moduleViking.ModuleUser.GetUser(uid) @@ -178,7 +172,9 @@ func (this *ModelSRank) CheckSeasonRank(uid string, boosID int32, difficulty int update["uinfo"] = record.Uinfo if record.Data[boosID] == nil { record.Data[boosID].Huihe = make(map[int32]int32, 0) + record.Data[boosID].Line = make(map[int32]*pb.LineData, 0) } + if record.Data[boosID].Maxnandu < difficulty { record.Data[boosID].Maxnandu = difficulty } else { @@ -220,7 +216,7 @@ func (this *ModelSRank) querySRankUser(bossid int, conn_ *db.DBConn) (ranks []st ) tableName := this.TableName + strconv.Itoa(int(bossid)) - if result, err = conn_.Redis.ZRevRange(tableName, 0, 50).Result(); err != nil { + if result, err = conn_.Redis.ZRevRange(tableName, 0, comm.MinRankList).Result(); err != nil { //this.module.Errorln(err) return } @@ -230,3 +226,50 @@ func (this *ModelSRank) querySRankUser(bossid int, conn_ *db.DBConn) (ranks []st } return } +func (this *ModelSRank) raceSettlement() { + var ( + result []string + Items []*pb.UserAssets + err error + szReward []*cfg.GameVikingRewardData + uids []string // 玩家发奖 + ) + tableName := this.TableName + "1" //strconv.Itoa(int(bossid)) + szReward = this.moduleViking.configure.GetVikingRewardConf() + + if result, err = this.DBModel.Redis.ZRevRange(tableName, 0, comm.MaxRankList).Result(); err != nil { + this.moduleViking.Errorln(err) + return + } + this.moduleViking.Debugf("uid:%v", uids) + var ( + pos int32 + rankid int32 + ) + // 1-1 2-2 3-3 4-10 + for i := 0; i < len(result); i++ { + + rankid = int32(i) + 1 // 排名id + if szReward[pos].RankLow <= rankid && szReward[pos].RankUp >= rankid { + uids = append(uids, result[i]) + } else { + this.moduleViking.mail.SendNewMail(&pb.DBMailData{ + Cid: "SeasonViking1Reward", + Param: []string{fmt.Sprintf("%d-%d", szReward[pos].RankLow, szReward[pos].RankUp)}, + CreateTime: uint64(configure.Now().Unix()), + Items: Items, + }, uids...) + + uids = []string{} + pos += 1 + } + // uids = append(uids, result[i]) + // //发邮件 + // this.moduleViking.mail.SendNewMail(&pb.DBMailData{ + // Cid: "SeasonViking1Reward", + // Param: []string{fmt.Sprintf("%d-%d", szReward[i].RankLow, szReward[i].RankUp)}, + // CreateTime: uint64(configure.Now().Unix()), + // Items: Items, + // }, result[i]) + } +} diff --git a/modules/viking/module.go b/modules/viking/module.go index 7b5605b76..ad280d187 100644 --- a/modules/viking/module.go +++ b/modules/viking/module.go @@ -6,14 +6,14 @@ package viking import ( + "context" "go_dreamfactory/comm" "go_dreamfactory/lego/base" "go_dreamfactory/lego/core" - "go_dreamfactory/utils" + "go_dreamfactory/lego/sys/log" "go_dreamfactory/modules" "go_dreamfactory/pb" - "go_dreamfactory/sys/configure" ) type Viking struct { @@ -25,6 +25,7 @@ type Viking struct { battle comm.IBattle service base.IRPCXService modelsrank *ModelSRank + mail comm.Imail } const ( @@ -73,16 +74,29 @@ func (this *Viking) Start() (err error) { if err = this.ModuleBase.Start(); err != nil { return } + this.service.RegisterFunctionName(string(comm.Rpc_ModuleVikingFigthEnd), this.Rpc_ModuleVikingFigthEnd) var module core.IModule if module, err = this.service.GetModule(comm.ModuleBattle); err != nil { return } this.battle = module.(comm.IBattle) - this.CheckCurSeasonData() + + if module, err = this.service.GetModule(comm.ModuleMail); err != nil { + return + } + + this.mail = module.(comm.Imail) + + return +} +func (this *Viking) Rpc_ModuleVikingFigthEnd(ctx context.Context, args *pb.EmptyReq, reply *pb.EmptyResp) (err error) { + this.Debug("Rpc_ModuleVikingFigthEnd", + log.Field{Key: "args", Value: args.String()}, + ) + this.modelsrank.raceSettlement() return } - func (this *Viking) CheckUserBaseVikingInfo(uid string) (data []*pb.DBVikingRank) { if d := this.modulerank.getVikingRank(uid); d.Id != "" { @@ -146,58 +160,3 @@ func (this *Viking) CompleteAllLevel(session comm.IUserSession) (errdata *pb.Err session.SendMsg(string(this.GetType()), VikingGetListResp, &pb.VikingGetListResp{Data: list}) return } - -// 检查当前赛季是在本服还是在跨服 -func (this *Viking) CheckCurSeasonData() (bLocal bool, endSeasonTime int64) { - var subTime int64 - var oneSeason int64 - openTime := this.service.GetOpentime().Unix() - this.Debugf("%d", openTime) - // 获取第一个赛季结束的时间 - oneSeason = utils.GetTodayZeroTime(openTime) //+ int64((6-d)*3600*24) - this.Debugf("%d", oneSeason) - - var c int32 - if Continued%Cycle == 0 { - c = Continued / Cycle - } else { - c = Continued/Cycle + 1 - } - - if configure.Now().Unix() > oneSeason { - subTime = configure.Now().Unix() - oneSeason - subTime = subTime/(14*3600*24) + 1 - } - // 只需判断当前时间是否大于第c个赛季即可 - endSeasonTime = oneSeason - endSeasonTime += 14 * 3600 * 24 * int64(c) - if endSeasonTime <= configure.Now().Unix() { - endSeasonTime = oneSeason + subTime*14*3600*24 - return false, endSeasonTime - } - endSeasonTime = oneSeason + subTime*14*3600*24 - return true, endSeasonTime -} - -// 检查上一个赛季实在本服还是在跨服 -func (this *Viking) CheckPreSeasonData() (bLocal bool) { - openTime := this.service.GetOpentime().Unix() - this.Debugf("%d", openTime) - // 获取第一个赛季结束的时间 - endSeasonTime := utils.GetTodayZeroTime(openTime) //+ int64((6-d)*3600*24) - this.Debugf("%d", endSeasonTime) - - var c int32 - if Continued%Cycle == 0 { - c = Continued / Cycle - } else { - c = Continued/Cycle + 1 - } - - // 只需判断当前时间是否大于第c个赛季即可 - endSeasonTime += 3600 * 24 * int64(Cycle*c) - if endSeasonTime <= configure.Now().Unix()-int64(Cycle*3600*24) { - return false - } - return true -}