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