go_dreamfactory/modules/guildgve/modelUnionRoulette.go
2023-07-27 19:09:23 +08:00

108 lines
3.0 KiB
Go

package guildgve
import (
"fmt"
"go_dreamfactory/comm"
"go_dreamfactory/lego/core"
"go_dreamfactory/lego/sys/log"
"go_dreamfactory/lego/sys/mgo"
"go_dreamfactory/lego/sys/redis"
"go_dreamfactory/modules"
"go_dreamfactory/pb"
"sync"
)
type ModelUnionroulette struct {
modules.MCompModel
module *GuildGve
conflock sync.RWMutex
bossconf *pb.DBGuildGveBossConf
}
func (this *ModelUnionroulette) 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.TableGuildroulette
this.module = module.(*GuildGve)
return
}
func (this *ModelUnionroulette) Start() (err error) {
err = this.MCompModel.Start()
return
}
// 获取用户全部的埋点数据
func (this *ModelUnionroulette) getUnionRoulette(Guildid string) (results *pb.DBGuildRouletteRecord, err error) {
results = &pb.DBGuildRouletteRecord{}
if err = this.Get(Guildid, results); err != nil && err != mgo.MongodbNil {
this.module.Errorln(err)
return
}
if err == mgo.MongodbNil {
results = &pb.DBGuildRouletteRecord{
Guildid: Guildid,
Roulette: make([]*pb.DBGveRouletteRecord, 0),
}
err = this.Add(Guildid, results)
}
return
}
func (this *ModelUnionroulette) updateUnionRoulette(data *pb.DBGuildRouletteRecord) (err error) {
if err = this.ChangeById(data.Guildid, map[string]interface{}{
"roulette": data.Roulette,
}); err != nil {
this.module.Error("更新用户任务数据 错误!", log.Field{Key: "err", Value: err.Error()})
return
}
return
}
// 分布式锁
func (this *ModelUnionroulette) userlock(id string) (result *redis.RedisMutex, err error) {
return this.DBModel.Redis.NewRedisMutex(fmt.Sprintf("lockunionroulette:%s", id))
}
// boos 信息变化推送
func (this *ModelUnionroulette) roulettechangePush(unionid string, uid, uname string, confid int32, award []*pb.UserAssets) {
var (
info *pb.DBGuildRouletteRecord
members []*pb.SociatyMemberInfo
users []string = make([]string, 0)
record *pb.DBGveRouletteRecord
errdata *pb.ErrorData
err error
)
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)
}
lock, _ := this.userlock(unionid)
err = lock.Lock()
if err != nil {
this.module.Error("公会战分布式锁 err!", log.Field{Key: "Unionid", Value: unionid}, log.Field{Key: "err", Value: err.Error()})
return
}
defer lock.Unlock()
if info, err = this.getUnionRoulette(unionid); err != nil {
this.module.Errorln(err)
return
}
record = &pb.DBGveRouletteRecord{
Uid: uid,
Nickname: uname,
CfgId: confid,
Award: award,
}
info.Roulette = append(info.Roulette, record)
this.updateUnionRoulette(info)
this.module.SendMsgToUsers(string(this.module.GetType()), "roulettechange", &pb.GuildGveRouletteChangePush{
Record: record,
}, users...)
}