update
This commit is contained in:
@@ -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")
|
||||||
|
}
|
||||||
@@ -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
@@ -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
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user