// package // 公会 // 赵长远 package sociaty import ( "context" "errors" "fmt" "go_dreamfactory/comm" "go_dreamfactory/lego/base" "go_dreamfactory/lego/core" "go_dreamfactory/lego/sys/log" "go_dreamfactory/modules" "go_dreamfactory/pb" "go_dreamfactory/sys/configure" cfg "go_dreamfactory/sys/configure/structs" "go_dreamfactory/sys/db" "go.mongodb.org/mongo-driver/bson" ) var _ comm.ISociaty = (*Sociaty)(nil) type Sociaty struct { modules.ModuleBase maincity comm.IMainCity api *apiComp service base.IRPCXService modelSociaty *ModelSociaty modelSociatyTask *ModelSociatyTask modelSociatyLog *ModelSociatyLog configure *configureComp globalConf *cfg.GameGlobalData sociatyActivityConf *cfg.GameGuildActivity sociatyTaskConf *cfg.GameGuildTask sociatySignConf *cfg.GameGuildSign } func NewModule() core.IModule { return &Sociaty{} } func (this *Sociaty) Init(service core.IService, module core.IModule, options core.IModuleOptions) (err error) { if err = this.ModuleBase.Init(service, module, options); err != nil { return } this.service = service.(base.IRPCXService) return } func (this *Sociaty) GetType() core.M_Modules { return comm.ModuleSociaty } func (this *Sociaty) OnInstallComp() { this.ModuleBase.OnInstallComp() this.api = this.RegisterComp(new(apiComp)).(*apiComp) this.modelSociaty = this.RegisterComp(new(ModelSociaty)).(*ModelSociaty) this.modelSociatyTask = this.RegisterComp(new(ModelSociatyTask)).(*ModelSociatyTask) this.modelSociatyLog = this.RegisterComp(new(ModelSociatyLog)).(*ModelSociatyLog) this.configure = this.RegisterComp(new(configureComp)).(*configureComp) // event.Register(comm.EventBuriedComplete, this.TCondFinishNotify) } func (this *Sociaty) Start() (err error) { if err = this.ModuleBase.Start(); err != nil { return } this.service.RegisterFunctionName(string(comm.Rpc_ModuleSociaty), this.RpcGetSociaty) this.service.RegisterFunctionName(string(comm.Rpc_ModuleSociatyUpdate), this.RpcUpdateSociaty) this.service.RegisterFunctionName(string(comm.Rpc_ModuleSociatyTask), this.RpcUpdateUserTask) this.service.RegisterFunctionName(string(comm.Rpc_ModuleSociatyGetTask), this.RpcGetUserTask) this.globalConf = this.ModuleTools.GetGlobalConf() if this.globalConf == nil { err = errors.New("global config not found") return } if this.sociatyActivityConf, err = this.configure.getSociatyActivityCfg(); err != nil { return err } if this.sociatyTaskConf, err = this.configure.getSociatyTaskCfg(); err != nil { return err } if this.sociatySignConf, err = this.configure.getSociatySignCfg(); err != nil { return err } if err = this.checkSociatyConf(); err != nil { return err } var module core.IModule if module, err = this.service.GetModule(comm.ModuleMaincity); err != nil { return } this.maincity = module.(comm.IMainCity) return } var errs []string func (this *Sociaty) checkSociatyConf() (err error) { buriedCondConf, err := this.configure.getBuriedCondCfg() if err != nil { return err } for _, data := range this.sociatyTaskConf.GetDataList() { if _, ok := buriedCondConf.GetDataMap()[data.TypeId]; !ok { errs = append(errs, fmt.Sprintf("condId:%v 可能无效,检查guild_task表字段type_id值是否存在于buried_condi", data.TypeId)) } } return } // 会长弹劾处理 // Deprecated func (this *Sociaty) ProcessAccuse(uid, sociatyId string) { t := this.globalConf.GuildImpeachmentCountDown if t == 0 { return } sociaty, _ := this.modelSociaty.getSociaty(sociatyId) if sociaty != nil { if sociaty.AccuseTime > 0 { now := configure.Now().Unix() if now-sociaty.AccuseTime >= int64(3600*t) { //TODO 选新会长 } else { //结束弹劾 update := map[string]interface{}{ "accuseTime": 0, } if err := this.modelSociaty.updateSociaty(sociatyId, update); err != nil { this.Errorf("弹劾时间更新失败 %v", err) } } } } } // 获取我的公会成员 func (this *Sociaty) MembersByUid(uid string) (list []*pb.SociatyMemberInfo) { sociaty := this.modelSociaty.getUserSociaty(uid) return this.modelSociaty.members(sociaty) } // 获取公会成员 func (this *Sociaty) MembersBySociatyId(sociatyId string) (list []*pb.SociatyMemberInfo, errdata *pb.ErrorData) { var ( sociaty *pb.DBSociaty err error ) if sociaty, err = this.modelSociaty.getSociaty(sociatyId); err != nil { errdata = &pb.ErrorData{ Code: pb.ErrorCode_DBError, Title: pb.ErrorCode_DBError.ToString(), Message: err.Error(), } return } return this.modelSociaty.members(sociaty), nil } // 批量获取公户信息 func (this *Sociaty) GetSociatys(sociatyIds []string) (result []*pb.DBSociaty, errdata *pb.ErrorData) { var ( err error ) if result, err = this.modelSociaty.querySociatys(sociatyIds); err != nil { errdata = &pb.ErrorData{ Code: pb.ErrorCode_DBError, Title: pb.ErrorCode_DBError.String(), Message: err.Error(), } } return } // 公会 func (this *Sociaty) Reddot(session comm.IUserSession, rid ...comm.ReddotType) (reddot map[comm.ReddotType]*pb.ReddotItem) { var ( applyReddot bool tasks *pb.DBSociatyTask nocomplete int32 err error ) reddot = make(map[comm.ReddotType]*pb.ReddotItem) sociaty := this.modelSociaty.getUserSociaty(session.GetUserId()) if sociaty == nil || sociaty.Id == "" { return } if this.modelSociaty.isRight(session.GetUserId(), sociaty, pb.SociatyJob_PRESIDENT, pb.SociatyJob_VICEPRESIDENT, pb.SociatyJob_ADMIN) { if len(sociaty.ApplyRecord) > 0 { applyReddot = true } } for _, v := range rid { switch v { case comm.Reddot15102: progress := int32(0) tf := this.modelSociaty.IsSign(session.GetUserId(), sociaty) if tf { progress = 1 } reddot[comm.Reddot15102] = &pb.ReddotItem{ Rid: int32(comm.Reddot15102), Activated: !tf, Nextchanagetime: 0, Progress: progress, Total: 1, } case comm.Reddot15201: reddot[comm.Reddot15201] = &pb.ReddotItem{ Rid: int32(comm.Reddot15201), Activated: applyReddot, Nextchanagetime: 0, } case comm.Reddot15401: if tasks, err = this.modelSociatyTask.getUserTask(session.GetUserId(), sociaty.Id); err != nil { continue } for _, v := range tasks.TaskList { if v.Status != 1 { nocomplete++ } } reddot[comm.Reddot15401] = &pb.ReddotItem{ Rid: int32(comm.Reddot15401), Activated: true, Nextchanagetime: 0, Progress: nocomplete, Total: int32(len(tasks.TaskList)), } } } return } // 跨服获取公会 func (this *Sociaty) RpcGetSociaty(ctx context.Context, req *pb.RPCGeneralReqA1, reply *pb.DBSociaty) error { this.Debug("Rpc_ModuleSociaty", log.Field{Key: "req", Value: req.String()}) var ( sociaty *pb.DBSociaty err error ) sociaty, err = this.modelSociaty.getSociaty(req.Param1) reply.Id = sociaty.Id reply.Lv = sociaty.Lv reply.Exp = sociaty.Exp reply.Members = sociaty.Members reply.DismissCD = sociaty.DismissCD reply.Name = sociaty.Name reply.Icon = sociaty.Icon reply.Notice = sociaty.Notice reply.DismissTime = sociaty.DismissTime reply.IsApplyCheck = sociaty.IsApplyCheck reply.SignIds = sociaty.SignIds reply.LastSignCount = sociaty.LastSignCount reply.ApplyLv = sociaty.ApplyLv reply.Activity = sociaty.Activity reply.AccuseTime = sociaty.AccuseTime reply.ApplyRecord = sociaty.ApplyRecord return err } type SociatyUpdateParam struct { SociatyId string Update map[string]interface{} } // 跨服更新数据 func (this *Sociaty) RpcUpdateSociaty(ctx context.Context, req *SociatyUpdateParam, reply *pb.DBSociaty) error { return this.modelSociaty.ChangeList(comm.RDS_EMPTY, req.SociatyId, req.Update) } // 设置工会经验 func (this *Sociaty) BingoSetExp(session comm.IUserSession, exp int32) (err error) { sociaty := this.modelSociaty.getUserSociaty(session.GetUserId()) if sociaty == nil || sociaty.Id == "" { log.Warn("未获得公会信息", log.Field{Key: "uid", Value: session.GetUserId()}) return comm.NewCustomError(pb.ErrorCode_SociatyNoFound) } sociaty.Exp += exp update := map[string]interface{}{ "exp": sociaty.Exp, } if _, err = this.modelSociaty.changeLv(sociaty, update); err != nil { return } err = this.modelSociaty.updateSociaty(sociaty.Id, update) return } // 设置工会活跃度 func (this *Sociaty) BingoSetActivity(session comm.IUserSession, activity int32) error { sociaty := this.modelSociaty.getUserSociaty(session.GetUserId()) if sociaty == nil || sociaty.Id == "" { log.Warn("未获得公会信息", log.Field{Key: "uid", Value: session.GetUserId()}) return comm.NewCustomError(pb.ErrorCode_SociatyNoFound) } activity += sociaty.Activity update := map[string]interface{}{ "activity": activity, } return this.modelSociaty.updateSociaty(sociaty.Id, update) } type TaskParams struct { SociatyId string Uid string Data interface{} } // 任务条件达成通知 // 废弃 不需要主动推送任务变化 前端主动刷新页面即可 func (this *Sociaty) BuriedsNotify(session comm.IUserSession, conds []*pb.ConIProgress) { // log.Debug("公会任务通知", // log.Field{Key: "uid", Value: session.GetUserId()}, // log.Field{Key: "condIds", Value: conds}) // sociaty := this.modelSociaty.getUserSociaty(session.GetUserId()) // if sociaty == nil { // return // } // sociatyId := sociaty.Id // dt := &pb.DBSociatyTask{} // err := this.service.AcrossClusterRpcCall(context.Background(), this.GetCrossTag(), // comm.Service_Worker, string(comm.Rpc_ModuleSociatyGetTask), // &pb.RPCGeneralReqA2{Param1: sociatyId, Param2: session.GetUserId()}, dt) // var flag bool // for _, v := range dt.TaskList { // for _, cond := range conds { // if v.TaskId == cond.Conid && cond.State == pb.BuriedItemFinishState_buried_finish { // v.Status = 1 // flag = true // } // } // } // if !flag { // return // } // update := map[string]interface{}{ // "taskList": dt.TaskList, // "lastUpdateTime": configure.Now().Unix(), // } // err = this.service.AcrossClusterRpcCall(context.Background(), this.GetCrossTag(), // comm.Service_Worker, string(comm.Rpc_ModuleSociatyTask), // &TaskParams{SociatyId: sociatyId, Uid: session.GetUserId(), Data: update}, &pb.EmptyResp{}) // if err != nil { // return // } // return } func (this *Sociaty) RpcUpdateUserTask(ctx context.Context, p *TaskParams, reply *pb.EmptyResp) error { conn, err := db.Local() if err != nil { return err } model := db.NewDBModel(comm.TableSociatyTask, conn) if err := model.Redis.HMSet(fmt.Sprintf("%s:%s-%s", this.modelSociatyTask.TableName, p.SociatyId, p.Uid), p.Data); err != nil { log.Error("DBModel ChangeList", log.Field{Key: "err", Value: err.Error()}) return err } if err := model.UpdateModelLogs(this.modelSociatyTask.TableName, p.Uid, bson.M{"sociatyid": p.SociatyId, "uid": p.Uid}, p.Data); err != nil { return err } return nil } func (this *Sociaty) RpcGetUserTask(ctx context.Context, p *pb.RPCGeneralReqA2, reply *pb.DBSociatyTask) error { dt, err := this.modelSociatyTask.getUserTask(p.Param2, p.Param1) if err != nil { return errors.New("not found") } reply.Uid = dt.Uid reply.TaskList = dt.TaskList reply.ActivityList = dt.ActivityList reply.SociatyId = dt.SociatyId reply.LastUpdateTime = dt.LastUpdateTime return nil } // 创建公会3.10 func (this *Sociaty) CreateSociaty(uid, sociatyName string) error { //创建公会 sociaty := &pb.DBSociaty{ Creater: uid, Name: sociatyName, Icon: "wp_icon_10015", ApplyLv: 1, } //会长 sociaty.Members = append(sociaty.Members, &pb.SociatyMember{ Uid: uid, Job: pb.SociatyJob_PRESIDENT, //创建人是会长 Ctime: configure.Now().Unix(), }) return this.modelSociaty.create(sociaty) } func (this *Sociaty) GetSociaty(uid string) *pb.DBSociaty { return this.modelSociaty.getUserSociaty(uid) } func (this *Sociaty) ModifySociatyLv(uid string, lv int32) (err error) { var ( sociaty *pb.DBSociaty ) sociaty = this.modelSociaty.getUserSociaty(uid) if sociaty != nil { sociaty.Lv = lv this.modelSociaty.updateSociaty(sociaty.Id, map[string]interface{}{ "lv": lv, }) } err = fmt.Errorf("no fund sociaty!") return }