183 lines
4.8 KiB
Go
183 lines
4.8 KiB
Go
package task
|
|
|
|
import (
|
|
"fmt"
|
|
"go_dreamfactory/comm"
|
|
"go_dreamfactory/lego/core"
|
|
"go_dreamfactory/lego/sys/log"
|
|
"go_dreamfactory/modules"
|
|
"go_dreamfactory/pb"
|
|
cfg "go_dreamfactory/sys/configure/structs"
|
|
|
|
"go.mongodb.org/mongo-driver/bson/primitive"
|
|
)
|
|
|
|
const ( //Redis
|
|
TableTask core.SqlTable = "task" //每日任务表
|
|
)
|
|
|
|
type ModelTask struct {
|
|
modules.MCompModel
|
|
moduleTask *ModuleTask
|
|
}
|
|
|
|
func (this *ModelTask) Init(service core.IService, module core.IModule, comp core.IModuleComp, options core.IModuleOptions) (err error) {
|
|
err = this.MCompModel.Init(service, module, comp, options)
|
|
this.moduleTask = module.(*ModuleTask)
|
|
this.TableName = string(TableTask)
|
|
return
|
|
}
|
|
|
|
func swapKey(uid string, tag comm.TaskTag) string {
|
|
return fmt.Sprintf("%s_%v", uid, tag)
|
|
}
|
|
|
|
//获取玩家任务列表
|
|
func (this *ModelTask) getTaskList(uid string, taskTag comm.TaskTag) (list []*pb.DBTask) {
|
|
if err := this.GetList(swapKey(uid, taskTag), &list); err != nil {
|
|
log.Errorf("initTaskByTag err %v", err)
|
|
return
|
|
}
|
|
return
|
|
}
|
|
|
|
//初始化任务
|
|
func (this *ModelTask) initTaskByTag(uid string, taskTag comm.TaskTag) error {
|
|
taskList := this.getTaskList(uid, taskTag)
|
|
if len(taskList) > 0 {
|
|
return fmt.Errorf("clear data before init task")
|
|
}
|
|
if data, err := this.moduleTask.configure.getTaskByTag(int32(taskTag)); err == nil {
|
|
for _, cnf := range data {
|
|
objId := primitive.NewObjectID().Hex()
|
|
task := &pb.DBTask{
|
|
Id: objId,
|
|
Uid: uid,
|
|
TaskId: cnf.Key,
|
|
Active: cnf.Active,
|
|
Progress: cnf.ConditionSecond,
|
|
}
|
|
if err := this.AddList(swapKey(uid, taskTag), task.Id, task); err != nil {
|
|
log.Errorf("initTaskByTag addlists err %v", err)
|
|
return err
|
|
}
|
|
}
|
|
}
|
|
return nil
|
|
}
|
|
|
|
//查询用户任务
|
|
func (this *ModelTask) getUserTask(uid string, taskTag comm.TaskTag, taskId string) *pb.DBTask {
|
|
userTask := &pb.DBTask{}
|
|
if err := this.moduleTask.modelTask.GetListObj(swapKey(uid, taskTag), taskId, userTask); err != nil {
|
|
log.Errorf("getUserTask err:%v", err)
|
|
return nil
|
|
}
|
|
return userTask
|
|
}
|
|
|
|
//获取未完成的任务列表
|
|
func (this *ModelTask) getUnFinishTaskList(uid string, taskTag comm.TaskTag) (list []*pb.DBTask) {
|
|
taskList := this.getTaskList(uid, taskTag)
|
|
for _, v := range taskList {
|
|
if v.Status == 0 {
|
|
list = append(list, v)
|
|
}
|
|
}
|
|
return
|
|
}
|
|
|
|
//活跃度统计
|
|
func (this *ModelTask) countActive(uid string, taskTag comm.TaskTag) (total int32) {
|
|
taskList := this.getTaskList(uid, taskTag)
|
|
for _, v := range taskList {
|
|
if v.Status == 1 {
|
|
total += v.Active
|
|
}
|
|
}
|
|
return
|
|
}
|
|
|
|
//检查任务进度 返回未完成的
|
|
func (this *ModelTask) checkTaskProgress(uid string, config *cfg.Game_taskRoundData) (*pb.DBTask, bool) {
|
|
taskList := this.getUnFinishTaskList(uid, comm.TaskTag(config.IdTag))
|
|
for _, v := range taskList {
|
|
if config.Key == v.TaskId && v.Status == 0 {
|
|
return v, true
|
|
}
|
|
}
|
|
|
|
return nil, false
|
|
}
|
|
|
|
//更改用户任务
|
|
func (this *ModelTask) modifyUserTask(uid string, taskTag comm.TaskTag, taskId string, data map[string]interface{}) error {
|
|
if err := this.ChangeList(swapKey(uid, taskTag), taskId, data); err != nil {
|
|
log.Errorf("err %v", err)
|
|
return err
|
|
}
|
|
return nil
|
|
}
|
|
|
|
//任务处理
|
|
func (this *ModelTask) taskHandle(uid string, taskType comm.TaskType, taskParam *pb.TaskParam) error {
|
|
//查询当前用户未完成的任务列表
|
|
data, err := this.moduleTask.configure.getTasks(int32(taskType))
|
|
if err != nil {
|
|
log.Errorf("taskHandle err %v", err)
|
|
return err
|
|
}
|
|
|
|
for _, conf := range data {
|
|
//不满足限定条件
|
|
if taskParam.First != conf.ConditionCondition {
|
|
continue
|
|
}
|
|
//检查进度,完成了执行处理器
|
|
if v, ok := this.checkTaskProgress(uid, conf); ok {
|
|
if err := this.finishHandle(v, comm.TaskTag(conf.IdTag), conf); err != nil {
|
|
return err
|
|
}
|
|
|
|
}
|
|
}
|
|
return nil
|
|
}
|
|
|
|
//任务完成处理
|
|
func (this *ModelTask) finishHandle(userTask *pb.DBTask, taskTag comm.TaskTag, config *cfg.Game_taskRoundData) error {
|
|
if userTask.Progress-1 < 0 {
|
|
return fmt.Errorf("uid %s task[%s] was finished", userTask.Uid, userTask.Id)
|
|
}
|
|
//修改玩家任务状态和进度
|
|
update := map[string]interface{}{
|
|
"progress": userTask.Progress - 1,
|
|
}
|
|
if userTask.Progress-1 == 0 {
|
|
update["status"] = 1
|
|
}
|
|
|
|
if err := this.modifyUserTask(userTask.Uid, taskTag, userTask.Id, update); err != nil {
|
|
log.Errorf("err %v", err)
|
|
return err
|
|
}
|
|
//修改玩家任务活跃度 成就没有活跃度
|
|
if config.IdTag != int32(comm.TASK_ACHIEVE) {
|
|
this.moduleTask.ModuleUser.AddAttributeValue(userTask.Uid, comm.ResTaskActive, config.Active)
|
|
}
|
|
|
|
return nil
|
|
}
|
|
|
|
//清空任务
|
|
func (this *ModelTask) clearTask(uid string, taskTag comm.TaskTag) error {
|
|
taskList := this.getTaskList(uid, taskTag)
|
|
for _, v := range taskList {
|
|
if err := this.moduleTask.modelTask.DelListlds(swapKey(uid, taskTag), v.Id); err != nil {
|
|
log.Errorf("uid: %v taskTag:%v err:%v", uid, taskTag, err)
|
|
return err
|
|
}
|
|
}
|
|
return nil
|
|
}
|