Files
crawlab/backend/services/challenge/base.go
2020-03-19 11:13:25 +08:00

111 lines
2.2 KiB
Go

package challenge
import (
"crawlab/constants"
"crawlab/model"
"encoding/json"
"github.com/apex/log"
"github.com/globalsign/mgo/bson"
"io/ioutil"
"path"
"runtime/debug"
)
type Service interface {
Check() (bool, error)
}
func GetService(name string, uid bson.ObjectId) Service {
switch name {
case constants.ChallengeLogin7d:
return &Login7dService{UserId: uid}
case constants.ChallengeCreateCustomizedSpider:
return &CreateCustomizedSpiderService{UserId: uid}
case constants.ChallengeRunRandom:
return &RunRandomService{UserId: uid}
}
return nil
}
func AddChallengeAchievement(name string, uid bson.ObjectId) error {
ch, err := model.GetChallengeByName(name)
if err != nil {
return err
}
ca := model.ChallengeAchievement{
ChallengeId: ch.Id,
UserId: uid,
}
if err := ca.Add(); err != nil {
return err
}
return nil
}
func CheckChallengeAndUpdate(ch model.Challenge, uid bson.ObjectId) error {
svc := GetService(ch.Name, uid)
achieved, err := svc.Check()
if err != nil {
return err
}
if achieved && !ch.Achieved {
if err := AddChallengeAchievement(ch.Name, uid); err != nil {
return err
}
}
return nil
}
func CheckChallengeAndUpdateAll(uid bson.ObjectId) error {
challenges, err := model.GetChallengeListWithAchieved(nil, 0, constants.Infinite, "-_id", uid)
if err != nil {
return err
}
for _, ch := range challenges {
if err := CheckChallengeAndUpdate(ch, uid); err != nil {
continue
}
}
return nil
}
func InitChallengeService() error {
// 读取文件
contentBytes, err := ioutil.ReadFile(path.Join("data", "challenge_data.json"))
if err != nil {
log.Errorf(err.Error())
debug.PrintStack()
return err
}
// 反序列化
var challenges []model.Challenge
if err := json.Unmarshal(contentBytes, &challenges); err != nil {
log.Errorf(err.Error())
debug.PrintStack()
return err
}
for _, ch := range challenges {
chDb, err := model.GetChallengeByName(ch.Name)
if err != nil {
continue
}
if chDb.Name == "" {
if err := ch.Add(); err != nil {
log.Errorf(err.Error())
debug.PrintStack()
continue
}
} else {
if err := ch.Save(); err != nil {
log.Errorf(err.Error())
debug.PrintStack()
continue
}
}
}
return nil
}