package arena import ( "context" "fmt" "go_dreamfactory/comm" "go_dreamfactory/lego/core" "go_dreamfactory/lego/sys/redis/pipe" "go_dreamfactory/modules" "go_dreamfactory/pb" "go_dreamfactory/sys/configure" cfg "go_dreamfactory/sys/configure/structs" "github.com/go-redis/redis/v8" ) // /竞技场 数据组件 type modelRank struct { modules.MCompModel module *Arena } // 组件初始化接口 func (this *modelRank) Init(service core.IService, module core.IModule, comp core.IModuleComp, opt core.IModuleOptions) (err error) { this.TableName = comm.TableArenaRank this.MCompModel.Init(service, module, comp, opt) this.module = module.(*Arena) return } // 更新排名 func (this *modelRank) updateArenaRank(users ...*pb.ArenaPlayer) (err error) { var ( pipe *pipe.RedisPipe = this.DBModel.Redis.RedisPipe(context.TODO()) menbers []*redis.Z cmd *redis.IntCmd menbersCmd []*redis.IntCmd = make([]*redis.IntCmd, len(users)) rank int64 ) menbers = make([]*redis.Z, len(users)) for i, v := range users { menbers[i] = &redis.Z{Score: float64(v.Integral), Member: v.Uid} } if cmd = pipe.ZAdd(this.TableName, menbers...); err != nil { this.module.Errorln(err) } for i, v := range users { menbersCmd[i] = pipe.ZRevRank(this.TableName, v.Uid) } if _, err = pipe.Exec(); err != nil { this.module.Errorln(err) return } if _, err = cmd.Result(); err != nil { this.module.Errorln(err) return } for i, v := range menbersCmd { if rank, err = v.Result(); err != nil { this.module.Errorln(err) return } users[i].Rank = int32(rank + 1) } return } // 获取排行榜前50的用户名单 func (this *modelRank) queryRankUser() (ranks []string, err error) { var ( result []string ) if result, err = this.DBModel.Redis.ZRevRange(this.TableName, 0, 50).Result(); err != nil { this.module.Errorln(err) return } ranks = make([]string, 0) for i := 0; i < len(result); i += 1 { ranks = append(ranks, result[i]) } return } // 比赛结算 func (this *modelRank) raceSettlement() { var ( reward *cfg.GameArenaRankReward result []string uids []string Items []*pb.UserAssets err error ) if reward, err = this.module.configure.getRankReward(); err != nil { this.module.Errorln(err) return } for _, v := range reward.GetDataList() { if result, err = this.DBModel.Redis.ZRevRange(this.TableName, int64(v.RankLow-1), int64(v.RankUp)).Result(); err != nil { this.module.Errorln(err) return } this.module.Debugf("uid:%v", uids) Items = make([]*pb.UserAssets, len(v.RankReward)) for i, v := range v.RankReward { Items[i] = &pb.UserAssets{ A: v.A, T: v.T, N: v.N, } } for i := 0; i < len(result); i += 2 { // uids = append(uids, result[i]) //发邮件 this.module.mail.SendNewMail(&pb.DBMailData{ Cid: "ArenaRankingReward", Param: []string{fmt.Sprintf("%d", v.RankLow+int32(i))}, CreateTime: uint64(configure.Now().Unix()), Items: Items, }, result[i]) } } }