go_dreamfactory/modules/arena/modelrank.go
2024-01-24 13:39:45 +08:00

132 lines
3.4 KiB
Go

package arena
import (
"context"
"fmt"
"go_dreamfactory/comm"
"go_dreamfactory/lego/core"
"go_dreamfactory/lego/sys/redis/pipe"
"go_dreamfactory/modules"
"go_dreamfactory/pb"
"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.Uinfo.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.Uinfo.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
}
//获取指定区间的玩家人数
func (this *modelRank) queryRankByScoreArea(min, max int32) (count int64, err error) {
if count, err = this.DBModel.Redis.ZCount(fmt.Sprintf("%s-%s", this.DBModel.ServiceId, this.TableName), fmt.Sprintln(min), fmt.Sprintln(max)); err != nil {
this.module.Errorln(err)
return
}
return
}
// 获取排行榜前50的用户名单
func (this *modelRank) queryRankUser() (ranks []string, err error) {
var (
result []string
)
if result, err = this.DBModel.Redis.ZRevRange(fmt.Sprintf("%s-%s", this.DBModel.ServiceId, 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(fmt.Sprintf("%s-%s", this.DBModel.ServiceId, 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])
// }
// }
}