This commit is contained in:
cdle
2021-09-02 16:49:33 +08:00
parent 797c3d04cb
commit 2bd4915ccf
3 changed files with 166 additions and 11 deletions
+136
View File
@@ -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")
}
+21 -6
View File
@@ -30,6 +30,12 @@ var PUT = "PUT"
var POST = "POST" var POST = "POST"
var DELETE = "DELETE" var DELETE = "DELETE"
var ENVS = "envs" var ENVS = "envs"
var CRONS = "crons"
type Carrier struct {
Get string
Value string
}
func init() { func init() {
core.ReadYaml(core.ExecPath+"/develop/qinglong/conf/", &Config, "https://raw.githubusercontent.com/cdle/sillyGirl/main/develop/qinglong/conf/demo_config.yaml") 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{} body := []byte{}
api := ENVS api := ENVS
apd := "" apd := ""
var c *Carrier
var toParse interface{} var toParse interface{}
for _, p := range ps { for _, p := range ps {
switch p.(type) { switch p.(type) {
@@ -80,13 +87,15 @@ func req(ps ...interface{}) error {
switch p.(string) { switch p.(string) {
case GET, POST, DELETE, PUT: case GET, POST, DELETE, PUT:
method = p.(string) method = p.(string)
case ENVS: case ENVS, CRONS:
api = p.(string) api = p.(string)
default: default:
apd = p.(string) apd = p.(string)
} }
case []byte: case []byte:
body = p.([]byte) body = p.([]byte)
case *Carrier:
c = p.(*Carrier)
default: default:
if strings.Contains(reflect.TypeOf(p).String(), "*") { if strings.Contains(reflect.TypeOf(p).String(), "*") {
toParse = p toParse = p
@@ -97,6 +106,7 @@ func req(ps ...interface{}) error {
} }
var req *httplib.BeegoHTTPRequest var req *httplib.BeegoHTTPRequest
api += apd api += apd
api = strings.Trim(api, " ")
switch method { switch method {
case GET: case GET:
req = httplib.Get(Config.Host + "/open/" + api) req = httplib.Get(Config.Host + "/open/" + api)
@@ -112,10 +122,9 @@ func req(ps ...interface{}) error {
if method != GET { if method != GET {
req.Body(body) req.Body(body)
} }
fmt.Println(Config.Host + "/open/" + api) // fmt.Println(Config.Host + "/open/" + api)
fmt.Println(method) // fmt.Println(method)
fmt.Println(string(body)) // fmt.Println(string(body))
req.Body(body)
data, err := req.Bytes() data, err := req.Bytes()
if err != nil { if err != nil {
return err return err
@@ -126,8 +135,14 @@ func req(ps ...interface{}) error {
} }
if toParse != nil { if toParse != nil {
if err := json.Unmarshal(data, toParse); err != 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 return nil
} }
+9 -5
View File
@@ -126,15 +126,19 @@ func (sender *Sender) Reply(rt interface{}) error {
} else { } else {
r = sender.Message.Chat r = sender.Message.Chat
} }
var err error
switch rt.(type) { switch rt.(type) {
case error: 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: 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: 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: 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
} }