go_dreamfactory/modules/guildgve/modelrank.go
2023-08-04 18:46:50 +08:00

137 lines
3.5 KiB
Go

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)
}