192 lines
4.3 KiB
Go
192 lines
4.3 KiB
Go
package smithy
|
|
|
|
import (
|
|
"go_dreamfactory/comm"
|
|
"go_dreamfactory/lego/core"
|
|
"go_dreamfactory/lego/sys/event"
|
|
"go_dreamfactory/lego/sys/log"
|
|
"go_dreamfactory/modules"
|
|
"go_dreamfactory/pb"
|
|
|
|
"go.mongodb.org/mongo-driver/mongo"
|
|
"go.mongodb.org/mongo-driver/x/bsonx"
|
|
)
|
|
|
|
type modelTask struct {
|
|
modules.MCompModel
|
|
module *Smithy
|
|
}
|
|
|
|
func (this *modelTask) Init(service core.IService, module core.IModule, comp core.IModuleComp, options core.IModuleOptions) (err error) {
|
|
this.TableName = string(comm.TableSmithyTask)
|
|
err = this.MCompModel.Init(service, module, comp, options)
|
|
this.module = module.(*Smithy)
|
|
this.DB.CreateIndex(core.SqlTable(this.TableName), mongo.IndexModel{
|
|
Keys: bsonx.Doc{{Key: "uid", Value: bsonx.Int32(1)}},
|
|
})
|
|
event.Register(comm.EventBuriedComplete, this.TCondFinishNotify)
|
|
return
|
|
}
|
|
|
|
func (this *modelTask) getTaskRecord(uid string) (*pb.DBTujianTask, error) {
|
|
tt := &pb.DBTujianTask{Uid: uid}
|
|
if err := this.Get(uid, tt); err != nil {
|
|
return tt, err
|
|
}
|
|
return tt, nil
|
|
}
|
|
|
|
func (this *modelTask) TCondFinishNotify(uid string, conds []*pb.ConIProgress) {
|
|
session, ok := this.module.GetUserSession(uid)
|
|
if !ok {
|
|
this.module.Errorln("TCondFinishNotify 获取session失败")
|
|
return
|
|
}
|
|
this.module.Debug("铁匠铺任务通知", log.Field{Key: "uid", Value: uid}, log.Field{Key: "conds", Value: conds})
|
|
confList, err := this.module.configure.GetSmithyTasks()
|
|
if err != nil {
|
|
this.module.Error(err.Error())
|
|
return
|
|
}
|
|
condMap := make(map[int32]*pb.ConIProgress)
|
|
for _, conf := range confList {
|
|
for _, cond := range conds {
|
|
if cond.Conid == conf.TypeId {
|
|
condMap[conf.Key] = cond
|
|
}
|
|
}
|
|
}
|
|
update := make(map[string]interface{})
|
|
dt, err := this.getTaskRecord(uid)
|
|
if err != nil {
|
|
if err == mongo.ErrNoDocuments {
|
|
for k, v := range condMap {
|
|
tt := &pb.TujianTask{
|
|
TaskId: k,
|
|
Cond: v,
|
|
}
|
|
if v.State == pb.BuriedItemFinishState_buried_finish {
|
|
tt.Received = 1
|
|
i, err := this.module.service.GetModule(comm.ModuleReddot)
|
|
if err != nil {
|
|
this.module.Error(err.Error())
|
|
return
|
|
}
|
|
if b, y := i.(comm.IReddot); y {
|
|
b.PushReddot(session, comm.Reddot17107)
|
|
}
|
|
|
|
}
|
|
dt.Tasks = append(dt.Tasks, tt)
|
|
if err := this.Add(uid, dt); err != nil {
|
|
this.module.Error(err.Error())
|
|
return
|
|
}
|
|
return
|
|
}
|
|
} else {
|
|
this.module.Error(err.Error())
|
|
return
|
|
}
|
|
}
|
|
|
|
if dt.Tasks == nil {
|
|
for k, v := range condMap {
|
|
tt := &pb.TujianTask{
|
|
TaskId: k,
|
|
Cond: v,
|
|
}
|
|
if v.State == pb.BuriedItemFinishState_buried_finish {
|
|
tt.Received = 1
|
|
}
|
|
dt.Tasks = append(dt.Tasks, tt)
|
|
}
|
|
update["tasks"] = dt.Tasks
|
|
if err := this.Change(uid, update); err != nil {
|
|
this.module.Error(err.Error())
|
|
return
|
|
}
|
|
return
|
|
}
|
|
|
|
var newTask []*pb.TujianTask
|
|
existTaskMap := make(map[int32]*pb.TujianTask)
|
|
for _, task := range dt.Tasks {
|
|
existTaskMap[task.TaskId] = task
|
|
}
|
|
|
|
for k, v := range condMap {
|
|
if task, ok := existTaskMap[k]; ok {
|
|
task.Cond = v
|
|
if v.State == pb.BuriedItemFinishState_buried_finish {
|
|
task.Received = 1
|
|
}
|
|
} else {
|
|
newTask = append(newTask, &pb.TujianTask{
|
|
TaskId: k,
|
|
Cond: v,
|
|
})
|
|
}
|
|
}
|
|
dt.Tasks = append(dt.Tasks, newTask...)
|
|
update["tasks"] = dt.Tasks
|
|
|
|
if len(update) > 0 {
|
|
if err := this.Change(uid, update); err != nil {
|
|
this.module.Error(err.Error())
|
|
return
|
|
}
|
|
}
|
|
}
|
|
|
|
func (this *modelTask) updateTaskRecord(uid string, taskId int32) error {
|
|
dt, err := this.getTaskRecord(uid)
|
|
if err != nil {
|
|
if err == mongo.ErrNoDocuments {
|
|
return comm.NewCustomError(pb.ErrorCode_SmithyTaskNoFinished)
|
|
}
|
|
return err
|
|
}
|
|
|
|
update := make(map[string]interface{})
|
|
|
|
if dt.Uid != "" {
|
|
for _, v := range dt.Tasks {
|
|
if v.TaskId == taskId {
|
|
if v.Received == 1 {
|
|
v.Received = 2
|
|
} else if v.Received == 2 {
|
|
return comm.NewCustomError(pb.ErrorCode_SmithyTaskReceived)
|
|
} else {
|
|
return comm.NewCustomError(pb.ErrorCode_SmithyTaskNoFinished)
|
|
}
|
|
break
|
|
}
|
|
}
|
|
|
|
update["tasks"] = dt.Tasks
|
|
}
|
|
|
|
if len(update) > 0 {
|
|
if err := this.Change(uid, update); err != nil {
|
|
return err
|
|
}
|
|
}
|
|
|
|
return nil
|
|
}
|
|
|
|
// 红点检测
|
|
func (this *modelTask) checkReddot17107(uid string) bool {
|
|
dt, err := this.getTaskRecord(uid)
|
|
if err != nil {
|
|
return false
|
|
}
|
|
for _, v := range dt.Tasks {
|
|
if v.Received == 1 {
|
|
return true
|
|
}
|
|
}
|
|
return false
|
|
}
|