108 lines
3.0 KiB
Go
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...)
|
|
}
|