imitater/task.go
2018-12-06 14:44:10 +08:00

167 lines
3.3 KiB
Go

package imitate
import (
"reflect"
"474420502.top/eson/curl2info"
"474420502.top/eson/requests"
)
var register map[string]reflect.Type
// Register 注册 类型 ITask为样本的类型
func Register(name string, itype interface{}) {
register[name] = reflect.TypeOf(itype)
}
func makeRegisterType(name string) reflect.Type {
return reflect.New(register[name]).Type().Elem()
}
// Person 以人为单位
type Person struct {
Tasks []ITask
Conf *Config
}
// NewPerson 创建一个人实例
func NewPerson() *Person {
person := &Person{}
// person.Conf = NewConfig(conf)
// person.Tasks = SplitTasks(person.Conf)
return person
}
// LoadConfig 加载配置
func (person *Person) LoadConfig(conf string) {
person.Conf = NewConfig(conf)
person.Tasks = splitTasks(person.Conf)
}
// NewPersonWithConfig 创建一个person
func NewPersonWithConfig(conf string) *Person {
person := NewPerson()
person.LoadConfig(conf)
return person
}
// SplitTasks 拆开出需求的任务
func splitTasks(conf *Config) []ITask {
var tasks []ITask
for _, scurl := range conf.Curls {
curl, err := curl2info.ParseRawCURL(scurl)
if err != nil {
panic(err)
}
task := makeRegisterType(curl.ITask).Elem().(ITask)
switch conf.Mode {
case 0:
copy(task.GetProxies(), conf.Proxies)
tasks = append(tasks, task)
case 1:
for _, proxy := range conf.Proxies {
ncurl, err := curl2info.ParseRawCURL(scurl)
if err != nil {
panic(err)
}
ptask := makeRegisterType(ncurl.ITask).Elem().(ITask)
// for _, exec := range task {
// }
ptask.AppendProxies(proxy)
tasks = append(tasks, task)
}
}
}
return tasks
}
// Execute 人的执行所有任务
func (person *Person) Execute() {
// for _, task := range person.Tasks {
// // ExecuteOnPlan(task)
// }
}
// ITask 继承这个接口的类
type ITask interface {
Execute()
SetCurl(Curl *curl2info.CURL)
GetCurl() *curl2info.CURL
GetProxies() []string
AppendProxies(proxies ...string)
}
// Task 任务
type Task struct {
ITask
curl *curl2info.CURL
workflow *requests.Workflow
proxies []string
}
//
// func (task *Task) SetCurl(curl *curl2info.CURL) {
// task.curl = curl
// }
// func (task *Task) GetCurl() *curl2info.CURL {
// return task.curl
// }
// //
// func (task *Task) AppendPlans(plans ...IExecute) {
// if len(plans) != 0 {
// for _, plan := range plans {
// task.plans = append(task.plans, plan)
// }
// }
// }
// func (task *Task) GetPlans() []IExecute {
// return task.plans
// }
// func (task *Task) AppendProxies(proxies ...string) {
// for _, proxy := range proxies {
// task.proxies = append(task.proxies, proxy)
// }
// }
// func (task *Task) GetProxies() []string {
// return task.proxies
// }
// // InitTask 生成一个新任务
// func InitTask(task ITask, Curl *curl2info.CURL, Plans ...IExecute) {
// // task.Conf = NewConfig(conf)
// task.SetCurl(Curl)
// task.AppendPlans(Plans...)
// }
// // ExecuteOnPlan 按照计划执行任务并返回结果
// func ExecuteOnPlan(task ITask) {
// for _, exec := range task.GetPlans() {
// if exec.TimeTo() >= 0 {
// task.Execute() // 事件 在这里变化
// exec.CalculateTrigger()
// }
// }
// }
// Execute 根据curl信息执行, TODO: 通用方法设置, 多太实现
// func (task *Task) Execute() {
// resp, err := task.Curl.CreateWorkflow(nil).Execute()
// log.Println(resp, err)
// }