package task import ( "go_dreamfactory/comm" "go_dreamfactory/lego/core" "go_dreamfactory/modules" "go_dreamfactory/pb" "go.mongodb.org/mongo-driver/bson/primitive" "go.mongodb.org/mongo-driver/mongo" "go.mongodb.org/mongo-driver/x/bsonx" ) type ModelTaskActive struct { modules.MCompModel moduleTask *ModuleTask } func (this *ModelTaskActive) Init(service core.IService, module core.IModule, comp core.IModuleComp, options core.IModuleOptions) (err error) { this.TableName = comm.TableTaskActive err = this.MCompModel.Init(service, module, comp, options) this.moduleTask = module.(*ModuleTask) // 加索引 this.DB.CreateIndex(core.SqlTable(this.TableName), mongo.IndexModel{ Keys: bsonx.Doc{{Key: "uid", Value: bsonx.Int32(1)}}, }) return } // 初始化活跃度 func (this *ModelTaskActive) initActiveReward(uid string, taskTag comm.TaskTag) { task := &pb.DBActivity{} if err := this.Get(uid, task); err != nil { if err == mongo.ErrNoDocuments { objId := primitive.NewObjectID().Hex() task = &pb.DBActivity{ Uid: uid, Id: objId, } this.moduleTask.modelTaskActive.Add(uid, task) } else { this.moduleTask.Errorf("getTaskList err %v", err) return } } data := this.moduleTask.configure.getTaskActiveByTag(int32(taskTag)) for _, conf := range data { ta := &pb.ActivityData{ Tag: int32(taskTag), TaskId: conf.Key, } task.ActivityList = append(task.ActivityList, ta) } update := map[string]interface{}{ "activityList": task.ActivityList, } if err := this.moduleTask.modelTaskActive.Change(uid, update); err != nil { this.moduleTask.Errorf("uid:%v tag:%v initActivity err %v", uid, err) return } } func (this *ModelTaskActive) getActiveList(uid string) (list []*pb.ActivityData) { task := &pb.DBActivity{} if err := this.Get(uid, task); err != nil { this.moduleTask.Errorf("getTaskList err %v", err) return } return task.ActivityList } // 获取玩家活跃度列表 func (this *ModelTaskActive) getActiveListByTag(uid string, taskTag comm.TaskTag) (list []*pb.ActivityData) { task := &pb.DBActivity{} if err := this.Get(uid, task); err != nil { this.moduleTask.Errorf("getTaskList err %v", err) return } for _, v := range task.ActivityList { if v.Tag == int32(taskTag) { list = append(list, v) } } return list } // 查询完成的且未领取的任务 发现未领取返回true func (this *ModelTaskActive) noReceiveTaskActive(uid string, taskTag comm.TaskTag) (bool, error) { // 获取玩家活跃度 expand, err := this.moduleTask.ModuleUser.GetUserExpand(uid) if err != nil { return false, err } task := &pb.DBActivity{} if err := this.Get(uid, task); err != nil { // this.moduleTask.Warnf("getTaskActivityList err %v", err) return false, err } for _, v := range task.ActivityList { if v.Tag == int32(taskTag) && v.Received == 0 { conf := this.moduleTask.configure.getTaskActiveById(v.TaskId) if conf != nil && expand != nil { switch taskTag { case comm.TASK_DAILY: if expand.Activeday >= conf.Active { return true, nil } case comm.TASK_WEEKLY: if expand.Activeweek >= conf.Active { return true, nil } } } } } return false, nil } // 获取玩家活跃记录 id 唯一ID func (this *ModelTaskActive) getUserActive(uid string, taskId int32, taskTag comm.TaskTag) *pb.ActivityData { record := this.getActiveListByTag(uid, taskTag) for _, v := range record { if v.TaskId == taskId { return v } } return nil } func (this *ModelTaskActive) updateReceive(uid string, data map[string]interface{}) (err error) { if len(data) == 0 { return } return this.moduleTask.modelTaskActive.Change(uid, data) } // 清空活跃度任务 func (this *ModelTaskActive) clearTask(uid string, taskTag ...comm.TaskTag) { if len(taskTag) == 0 { this.moduleTask.Errorf("least one param for taskTag") return } data := this.getActiveList(uid) for i := 0; i < len(data); i++ { if data[i].Tag == int32(taskTag[0]) { data = append(data[:i], data[i+1:]...) i-- } } update := map[string]interface{}{ "activityList": data, } if err := this.moduleTask.modelTaskActive.Change(uid, update); err != nil { this.moduleTask.Errorf("uid: %v err:%v", uid, err) return } }