package activity import ( "context" "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" "go_dreamfactory/sys/db" "go.mongodb.org/mongo-driver/bson" ) type Activity struct { modules.ModuleBase api *apiComp configure *configureComp service base.IRPCXService modelhdList *modelHdList modelhdData *modelhdData mail comm.Imail warorder comm.IWarorder // 战令 pay comm.IPay // 支付 shopcenter comm.IShopcenter // 活动中心 addrecharge comm.IAddrecharge // 活动中心 kftask comm.IActivityNotice // 开服任务 uigame comm.IUiGame // ui小游戏 } func NewModule() core.IModule { return &Activity{} } func (this *Activity) GetType() core.M_Modules { return comm.ModuleActivity } func (this *Activity) 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) // ticker := time.NewTicker(time.Second * 10) // go func() { // for { // select { // case <-ticker.C: // this.CreateHdData() // return // } // } // }() return } func (this *Activity) Start() (err error) { if err = this.ModuleBase.Start(); err != nil { return } this.service.RegisterFunctionName(string(comm.Rpc_Activity), this.Rpc_Activity) var module core.IModule if module, err = this.service.GetModule(comm.ModuleMail); err != nil { return } this.mail = module.(comm.Imail) if module, err = this.service.GetModule(comm.ModuleWarorder); err != nil { return } this.warorder = module.(comm.IWarorder) if module, err = this.service.GetModule(comm.ModulePay); err != nil { return } this.pay = module.(comm.IPay) if module, err = this.service.GetModule(comm.ModuleShopCenter); err != nil { return } this.shopcenter = module.(comm.IShopcenter) if module, err = this.service.GetModule(comm.ModuleAddrecharge); err != nil { return } this.addrecharge = module.(comm.IAddrecharge) if module, err = this.service.GetModule(comm.ModuleKFTask); err != nil { return } this.kftask = module.(comm.IActivityNotice) if module, err = this.service.GetModule(comm.ModulePuzzle); err != nil { return } this.uigame = module.(comm.IUiGame) if !db.IsCross() { this.ReloadActivity() } this.service.RegisterFunctionName(string(comm.Rpc_ActivityOver), this.Rpc_ActivityOver) this.service.RegisterFunctionName(string(comm.Rpc_ActivityStart), this.Rpc_ActivityStart) return } func (this *Activity) ReloadActivity() { this.modelhdList.LoadActivityData() for k, v := range this.modelhdList.activity { switch k { case pb.HdType_HdTypeWarorder, pb.HdType_SupplyWarOrder, pb.HdType_MoondreamWarOrder: this.warorder.ActivityOpenNotice(v) break case pb.HdType_HdTypePay, pb.HdType_ShopCenterPayPakcge: this.pay.ActivityOpenNotice(v) break case pb.HdType_XSFundPhysical, pb.HdType_XSFundRecruit, pb.HdType_XSFundExp: this.shopcenter.ActivityOpenNotice(v) break case pb.HdType_AddUpRecharge: this.addrecharge.ActivityOpenNotice(v) break case pb.HdType_KFSevenTask: this.kftask.ActivityOpenNotice(v) break case pb.HdType_HdPuzzle, pb.HdType_HdLattice, pb.HdType_HdMiner: this.uigame.ActivityOpenNotice(v) break } } } func (this *Activity) OnInstallComp() { this.ModuleBase.OnInstallComp() this.api = this.RegisterComp(new(apiComp)).(*apiComp) this.configure = this.RegisterComp(new(configureComp)).(*configureComp) this.modelhdData = this.RegisterComp(new(modelhdData)).(*modelhdData) this.modelhdList = this.RegisterComp(new(modelHdList)).(*modelHdList) } func (this *Activity) CreateHdData() (err error) { this.modelhdList.getHdInfo() return } func (this *Activity) GetAllHdInfo() (activity map[pb.HdType]*pb.DBHuodong) { return this.modelhdList.getHdInfo() } func (this *Activity) GetHdInfoByItype(itype pb.HdType) (result *pb.DBHuodong, err error) { if c := this.modelhdList.getHdInfo(); c != nil { if _, ok := c[itype]; ok { result = c[itype] return } } err = fmt.Errorf("Not found :%d type activity", itype) return } // 统计庆典活动完成情况 func (this *Activity) HDCelebration(session comm.IUserSession, systemtype int32, bosstype int32) bool { bDouble := false // 是否开启双倍奖励 if activity := this.modelhdList.getHdInfoByType(pb.HdType_HdCelebration); activity != nil { // for _, v := range activity { if configure.Now().Unix() > activity.Stime && configure.Now().Unix() < activity.Etime { // 活动范围内 update := make(map[string]interface{}) bChange := false // 查询玩家活动记录 if list, err := this.modelhdData.getHddataByOid(session.GetUserId(), activity.Id); err == nil { // 注意 Gotarr:map[int32]int32 key value 已经挑战的次数 if list.Lasttime < configure.Now().Unix() || list.Val == 0 { // 不是今天重置 list.Gotarr = make(map[int32]int32) update := make(map[string]interface{}) update["gotarr"] = list.Gotarr var maxday int32 _days := this.configure.GetHDCelebrationData() for _, v := range _days { // 开启循环 maxday += v } var pos int32 _sub := int32((configure.Now().Unix() - activity.Stime) / (24 * 3600)) for index, v := range _days { find := false for i := 0; i < int(v); i++ { pos++ if _sub%maxday+1 == pos { list.Val = int32(index) + 1 // 计算val 值 update["val"] = list.Val find = true break } } if find { // 找到剩余的天数 list.Lasttime = activity.Stime + int64(_sub+pos%v+1)*24*3600 update["lasttime"] = list.Lasttime break } } } if conf, err := this.configure.GetHDCelebration(list.Val); err == nil { bfound := false for _, v1 := range conf.Bosstype { if v1 == 0 { // bosstype 为0 表示所有的boss 类型都算 bosstype = 0 bfound = true break } if v1 == bosstype { bfound = true break } } if !bfound { return false } if conf.Systemtype == systemtype { list.Gotarr[bosstype] += 1 // 天数 var idays int32 for i, v1 := range conf.Bosstype { if v1 == bosstype || v1 == 0 { // bosstype 为0 表示所有的boss 类型都算 idays = conf.Num[i] break } } // 更新信息 update["gotarr"] = list.Gotarr bChange = true if list.Gotarr[bosstype] <= idays { bDouble = true } } } if bChange { var sz []*pb.DBActivityData this.modelhdData.ModifyActivityList(session.GetUserId(), list.Id, update) // 推送活动数据进度变化 sz = append(sz, list) session.SendMsg(string(this.GetType()), "datachange", &pb.ActivityDataChangePush{ Data: sz, }) } } } } return bDouble } // 接口废弃 func (this *Activity) GetHdData(session comm.IUserSession, oids []string) (result []*pb.DBActivityData) { var ( activity *pb.DBHuodong err error list *pb.DBActivityData ) curTime := configure.Now().Unix() if activity, err = this.GetHdInfoByItype(pb.HdType_HdCelebration); err != nil { this.Errorln(err) return } if activity.Stime > curTime || curTime > activity.Etime { // 不在活动范围内数据不给活动记录数据 return } id := activity.Id list, _ = this.modelhdData.getHddataByOid(session.GetUserId(), id) // 获取开服庆典活动 if activity.Itype == pb.HdType_HdCelebration { if list, err = this.modelhdData.getHddataByOid(session.GetUserId(), id); err == nil { if list.Lasttime < configure.Now().Unix() || list.Val == 0 { // 不是今天重置 list.Gotarr = make(map[int32]int32) update := make(map[string]interface{}) update["gotarr"] = list.Gotarr var maxday int32 _days := this.configure.GetHDCelebrationData() for _, v := range _days { // 开启循环 maxday += v } var pos int32 _sub := int32((configure.Now().Unix() - activity.Stime) / (24 * 3600)) for index, v := range _days { find := false for i := 0; i < int(v); i++ { pos++ if _sub%maxday+1 == pos { list.Val = int32(index) + 1 // 计算val 值 update["val"] = list.Val find = true break } } if find { // 找到剩余的天数 list.Lasttime = activity.Stime + int64(_sub+pos%v+1)*24*3600 update["lasttime"] = list.Lasttime break } } this.modelhdData.ModifyActivityList(session.GetUserId(), list.Id, update) } } } result = append(result, list) return } func (this *Activity) Rpc_Activity(ctx context.Context, req *pb.RPCGeneralReqA1, reply *pb.RPCGeneralReqA1) (err error) { this.Debug("Rpc_Activity", log.Field{Key: "args", Value: req.Param1}, ) this.modelhdList.LoadActivityData() return } // 活动结束通知 func (this *Activity) Rpc_ActivityOver(ctx context.Context, args *pb.RPCGeneralReqB1, reply *pb.EmptyResp) (err error) { this.Debug("Rpc_ActivityOver", log.Field{Key: "args", Value: args.String()}, ) for _, v := range args.Param2 { hd := &pb.DBHuodong{} if err := this.modelhdList.DB.FindOne(core.SqlTable(this.modelhdList.TableName), bson.M{"_id": v}).Decode(hd); err != nil { switch hd.Itype { case pb.HdType_HdTypeWarorder, pb.HdType_SupplyWarOrder, pb.HdType_MoondreamWarOrder: this.warorder.ActivityCloseNotice(hd) break case pb.HdType_HdTypePay, pb.HdType_ShopCenterPayPakcge: this.pay.ActivityCloseNotice(hd) break case pb.HdType_XSFundPhysical, pb.HdType_XSFundRecruit, pb.HdType_XSFundExp: this.shopcenter.ActivityCloseNotice(hd) break case pb.HdType_AddUpRecharge: this.addrecharge.ActivityCloseNotice(hd) break case pb.HdType_KFSevenTask: this.kftask.ActivityCloseNotice(hd) break case pb.HdType_HdPuzzle, pb.HdType_HdLattice, pb.HdType_HdMiner: this.uigame.ActivityCloseNotice(hd) break } } } this.Debug("szOverActivity", log.Field{Key: "args", Value: args.Param2}) return } // 活动开启通知 func (this *Activity) Rpc_ActivityStart(ctx context.Context, args *pb.RPCGeneralReqB1, reply *pb.EmptyResp) (err error) { this.Debug("Rpc_ActivityStart", log.Field{Key: "args", Value: args.String()}, ) for _, v := range args.Param2 { hd := &pb.DBHuodong{} if err := this.modelhdList.DB.FindOne(core.SqlTable(this.modelhdList.TableName), bson.M{"_id": v}).Decode(hd); err == nil { switch hd.Itype { case pb.HdType_HdTypeWarorder, pb.HdType_SupplyWarOrder, pb.HdType_MoondreamWarOrder: this.warorder.ActivityOpenNotice(hd) break case pb.HdType_HdTypePay, pb.HdType_ShopCenterPayPakcge: this.pay.ActivityOpenNotice(hd) break case pb.HdType_XSFundPhysical, pb.HdType_XSFundRecruit, pb.HdType_XSFundExp: this.shopcenter.ActivityOpenNotice(hd) break case pb.HdType_AddUpRecharge: this.addrecharge.ActivityOpenNotice(hd) break case pb.HdType_KFSevenTask: this.kftask.ActivityOpenNotice(hd) break case pb.HdType_HdPuzzle, pb.HdType_HdLattice, pb.HdType_HdMiner: this.uigame.ActivityOpenNotice(hd) break } } } this.Debug("szOverActivity", log.Field{Key: "args", Value: args.Param2}) return } // 通过活动类型获取活动信息 func (this *Activity) GetHdDataByHdType(session comm.IUserSession, itype pb.HdType) (result []*pb.DBActivityData) { var ( activity *pb.DBHuodong err error list *pb.DBActivityData ) curTime := configure.Now().Unix() if activity, err = this.GetHdInfoByItype(itype); err != nil { this.Errorln(err) return } if activity.Stime > curTime || curTime > activity.Etime { // 不在活动范围内数据不给活动记录数据 return } id := activity.Id list, _ = this.modelhdData.getHddataByOid(session.GetUserId(), id) // 获取开服庆典活动 if activity.Itype == pb.HdType_HdCelebration { if list, err = this.modelhdData.getHddataByOid(session.GetUserId(), id); err == nil { if list.Lasttime < configure.Now().Unix() || list.Val == 0 { // 不是今天重置 list.Gotarr = make(map[int32]int32) update := make(map[string]interface{}) update["gotarr"] = list.Gotarr var maxday int32 _days := this.configure.GetHDCelebrationData() for _, v := range _days { // 开启循环 maxday += v } var pos int32 _sub := int32((configure.Now().Unix() - activity.Stime) / (24 * 3600)) for index, v := range _days { find := false for i := 0; i < int(v); i++ { pos++ if _sub%maxday+1 == pos { list.Val = int32(index) + 1 // 计算val 值 update["val"] = list.Val find = true break } } if find { // 找到剩余的天数 list.Lasttime = activity.Stime + int64(_sub+pos%v+1)*24*3600 update["lasttime"] = list.Lasttime break } } this.modelhdData.ModifyActivityList(session.GetUserId(), list.Id, update) } } } result = append(result, list) return }