package guildgve import ( "context" "go_dreamfactory/comm" "go_dreamfactory/lego/core" "go_dreamfactory/lego/sys/log" "go_dreamfactory/lego/sys/redis/pipe" "go_dreamfactory/modules" "go_dreamfactory/pb" cfg "go_dreamfactory/sys/configure/structs" "go_dreamfactory/utils" "sync" "time" "github.com/go-redis/redis/v8" ) type modelRank struct { modules.MCompModel module *GuildGve conflock sync.RWMutex bossconf *pb.DBGuildGveBossConf } func (this *modelRank) Init(service core.IService, module core.IModule, comp core.IModuleComp, options core.IModuleOptions) (err error) { err = this.MCompModel.Init(service, module, comp, options) this.TableName = comm.TableGuildGverank this.module = module.(*GuildGve) return } func (this *modelRank) Start() (err error) { err = this.MCompModel.Start() 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 += 2 { ranks = append(ranks, result[i]) } return } // 更新排名 func (this *modelRank) updateRank(guilds ...*pb.DBGuildGve) (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(guilds)) rank int64 ) menbers = make([]*redis.Z, len(guilds)) for i, v := range guilds { endtime := time.Unix(utils.WeekIntervalTime(), 0) start := time.Unix(v.Lastkilltime, 0) seconds := endtime.Sub(start).Seconds() Integral := float64(v.Kills)*float64(10000000000) + seconds menbers[i] = &redis.Z{Score: Integral, Member: v.Guildid} } if cmd = pipe.ZAdd(this.TableName, menbers...); err != nil { this.module.Errorln(err) } for i, v := range guilds { menbersCmd[i] = pipe.ZRevRank(this.TableName, v.Guildid) } 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 } guilds[i].Rank = int32(rank + 1) } return } // 比赛结算 func (this *modelRank) raceSettlement() { var ( reward *cfg.GameGuildBossRank result []string 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.Debug("推送 排行榜奖励 ", log.Field{Key: "rank", Value: v.Id}, log.Field{Key: "ids", Value: result}) for i := 0; i < len(result); i += 2 { this.rankRewardPush(result[i], v.Reward) } } //清理排行榜 this.DBModel.Redis.Delete(this.TableName) } // boos 奖励推送 func (this *modelRank) rankRewardPush(unionid string, reward []*cfg.Gameatn) { var ( members []*pb.SociatyMemberInfo users []string = make([]string, 0) errdata *pb.ErrorData ) if members, errdata = this.module.sociaty.MembersBySociatyId(unionid); errdata != nil { this.module.Debug("获取工会成员列表!", log.Field{Key: "errdata", Value: errdata}) return } for _, v := range members { users = append(users, v.Uid) } this.module.mail.SendMailToUsers(users, "Guild_Boss", reward, nil) }