diff --git a/develop/qinglong/cron.go b/develop/qinglong/cron.go new file mode 100644 index 0000000..f923332 --- /dev/null +++ b/develop/qinglong/cron.go @@ -0,0 +1,136 @@ +package qinglong + +import ( + "fmt" + "regexp" + "strings" + + "github.com/cdle/sillyGirl/core" + "github.com/cdle/sillyGirl/im" +) + +type CronResponse struct { + Code int `json:"code"` + Data []Cron `json:"data"` +} +type Cron struct { + Name string `json:"name"` + Command string `json:"command"` + Schedule string `json:"schedule"` + Saved bool `json:"saved"` + ID string `json:"_id"` + Created int64 `json:"created"` + Status int `json:"status"` + Timestamp string `json:"timestamp"` + IsSystem int `json:"isSystem"` + IsDisabled int `json:"isDisabled"` + LogPath string `json:"log_path"` + Pid interface{} `json:"pid"` +} + +func init() { + core.AddCommand([]core.Function{ + { + Rules: []string{`^crons$`}, + Handle: func(_ im.Sender) interface{} { + crons, err := GetCrons("") + if err != nil { + return err + } + if len(crons) == 0 { + return "没有任务" + } + es := []string{} + for _, cron := range crons { + es = append(es, formatCron(&cron)) + } + return strings.Join(es, "\n\n") + }, + }, + { + Rules: []string{`^cron\s+get\s+([\S]+)$`}, + Handle: func(s im.Sender) interface{} { + name := s.Get() + crons, err := GetCrons("") + if err != nil { + return err + } + es := []string{} + for _, cron := range crons { + if cron.Name == name || regexp.MustCompile(name+"$").FindString(cron.Command) != "" { + es = append(es, formatCron(&cron)) + } + } + if len(es) == 0 { + return "找不到该任务" + } + return strings.Join(es, "\n\n") + }, + }, + { + Rules: []string{`^cron\s+find\s+([\S]+)$`}, + Handle: func(s im.Sender) interface{} { + name := s.Get() + crons, err := GetCrons("") + if err != nil { + return err + } + es := []string{} + for _, cron := range crons { + if strings.Contains(cron.Name, name) || strings.Contains(cron.Command, name) { + es = append(es, formatCron(&cron)) + } + } + if len(es) == 0 { + return "找不到匹配的任务" + } + return strings.Join(es, "\n\n") + }, + }, + { + Rules: []string{`^cron\s+logs\s+([\S]+)$`}, + Handle: func(s im.Sender) interface{} { + data, err := GetCronLog(s.Get()) + if err != nil { + return err + } + return data + }, + }, + }) +} + +func GetCrons(searchValue string) ([]Cron, error) { + er := CronResponse{} + if err := req(CRONS, &er, "?searchValue="+searchValue); err != nil { + return nil, err + } + return er.Data, nil +} + +func GetCronLog(id string) (string, error) { + c := &Carrier{ + Get: "data", + } + if err := req(CRONS, "/"+id+"/log", c); err != nil { + return "", err + } + return c.Value, nil +} + +func formatCron(cron *Cron) string { + status := "空闲中" + if cron.IsDisabled != 0 { + status = "已禁用" + } + if cron.Pid != nil && fmt.Sprint(cron.Pid) != "" { + status = "运行中" + } + return strings.Join([]string{ + fmt.Sprintf("任务名:%v", cron.Name), + fmt.Sprintf("编号:%v", cron.ID), + fmt.Sprintf("命令:%v", cron.Command), + fmt.Sprintf("定时:%v", cron.Schedule), + fmt.Sprintf("状态:%v", status), + }, "\n") +} diff --git a/develop/qinglong/init.go b/develop/qinglong/init.go index d5654bd..5e44cab 100644 --- a/develop/qinglong/init.go +++ b/develop/qinglong/init.go @@ -30,6 +30,12 @@ var PUT = "PUT" var POST = "POST" var DELETE = "DELETE" var ENVS = "envs" +var CRONS = "crons" + +type Carrier struct { + Get string + Value string +} func init() { core.ReadYaml(core.ExecPath+"/develop/qinglong/conf/", &Config, "https://raw.githubusercontent.com/cdle/sillyGirl/main/develop/qinglong/conf/demo_config.yaml") @@ -73,6 +79,7 @@ func req(ps ...interface{}) error { body := []byte{} api := ENVS apd := "" + var c *Carrier var toParse interface{} for _, p := range ps { switch p.(type) { @@ -80,13 +87,15 @@ func req(ps ...interface{}) error { switch p.(string) { case GET, POST, DELETE, PUT: method = p.(string) - case ENVS: + case ENVS, CRONS: api = p.(string) default: apd = p.(string) } case []byte: body = p.([]byte) + case *Carrier: + c = p.(*Carrier) default: if strings.Contains(reflect.TypeOf(p).String(), "*") { toParse = p @@ -97,6 +106,7 @@ func req(ps ...interface{}) error { } var req *httplib.BeegoHTTPRequest api += apd + api = strings.Trim(api, " ") switch method { case GET: req = httplib.Get(Config.Host + "/open/" + api) @@ -112,10 +122,9 @@ func req(ps ...interface{}) error { if method != GET { req.Body(body) } - fmt.Println(Config.Host + "/open/" + api) - fmt.Println(method) - fmt.Println(string(body)) - req.Body(body) + // fmt.Println(Config.Host + "/open/" + api) + // fmt.Println(method) + // fmt.Println(string(body)) data, err := req.Bytes() if err != nil { return err @@ -126,8 +135,14 @@ func req(ps ...interface{}) error { } if toParse != nil { if err := json.Unmarshal(data, toParse); err != nil { - return errors.New(fmt.Sprintf("解析错误:%v,%v", err, string(data))) + fmt.Println(err) + return err } + // fmt.Println(string(data)) + // fmt.Println(toParse) + } + if c != nil { + c.Value, _ = jsonparser.GetString(data, strings.Split(c.Get, ".")...) } return nil } diff --git a/im/tg/tg.go b/im/tg/tg.go index bf571e0..194cbf9 100644 --- a/im/tg/tg.go +++ b/im/tg/tg.go @@ -126,15 +126,19 @@ func (sender *Sender) Reply(rt interface{}) error { } else { r = sender.Message.Chat } + var err error switch rt.(type) { case error: - b.Send(r, fmt.Sprintf("错误:%v", rt), &tb.SendOptions{ReplyTo: sender.Message}) + _, err = b.Send(r, fmt.Sprintf("%v", rt), &tb.SendOptions{ReplyTo: sender.Message}) case []byte: - b.Send(r, string(rt.([]byte)), &tb.SendOptions{ReplyTo: sender.Message}) + _, err = b.Send(r, string(rt.([]byte)), &tb.SendOptions{ReplyTo: sender.Message}) case string: - b.Send(r, rt.(string), &tb.SendOptions{ReplyTo: sender.Message}) + _, err = b.Send(r, rt.(string), &tb.SendOptions{ReplyTo: sender.Message}) case *http.Response: - b.SendAlbum(r, tb.Album{&tb.Photo{File: tb.FromReader(rt.(*http.Response).Body)}}, &tb.SendOptions{ReplyTo: sender.Message}) + _, err = b.SendAlbum(r, tb.Album{&tb.Photo{File: tb.FromReader(rt.(*http.Response).Body)}}, &tb.SendOptions{ReplyTo: sender.Message}) } - return nil + if err != nil { + sender.Reply(err) + } + return err }