diff --git a/core/config.go b/core/config.go index 3792fff..5092918 100644 --- a/core/config.go +++ b/core/config.go @@ -22,33 +22,37 @@ var ExecPath, _ = filepath.Abs(filepath.Dir(os.Args[0])) var Config Yaml func init() { - confDir := ExecPath + "/conf" - if _, err := os.Stat(confDir); err != nil { - os.MkdirAll(confDir, os.ModePerm) - } - for _, name := range []string{"config.yaml"} { - f, err := os.OpenFile(ExecPath+"/conf/"+name, os.O_RDWR|os.O_CREATE, 0777) - if err != nil { - logs.Warn(err) - } - s, _ := ioutil.ReadAll(f) - if len(s) == 0 { - logs.Info("下载配置%s", name) - r, err := httplib.Get("https://ghproxy.com/" + "https://raw.githubusercontent.com/cdle/sillyGirl/main/conf/demo_" + name).Response() - if err == nil { - io.Copy(f, r.Body) - } - } - f.Close() - } - content, err := ioutil.ReadFile(ExecPath + "/conf/config.yaml") - if err != nil { - logs.Warn("解析config.yaml读取错误: %v", err) - } - if yaml.Unmarshal(content, &Config) != nil { - logs.Warn("解析config.yaml出错: %v", err) - } - + ReadYaml(ExecPath+"/conf/", &Config, "https://raw.githubusercontent.com/cdle/sillyGirl/main/conf/config.yaml") InitReplies() initToHandleMessage() } + +func ReadYaml(confDir string, conf interface{}, url string) { + path := confDir + "config.yaml" + if _, err := os.Stat(confDir); err != nil { + os.MkdirAll(confDir, os.ModePerm) + } + f, err := os.OpenFile(path, os.O_RDWR|os.O_CREATE, 0777) + if err != nil { + logs.Warn(err) + } + s, _ := ioutil.ReadAll(f) + if len(s) == 0 { + logs.Info("下载配置%s", url) + r, err := httplib.Get("https://ghproxy.com/" + url).Response() + if err == nil { + io.Copy(f, r.Body) + } + } + f.Close() + content, err := ioutil.ReadFile(path) + if err != nil { + logs.Warn("解析配置文件%s读取错误: %v", path, err) + return + } + if yaml.Unmarshal(content, conf) != nil { + logs.Warn("解析配置文件%s出错: %v", path, err) + return + } + logs.Info("解析配置文件%s", path) +} diff --git a/dev.go b/dev.go new file mode 100644 index 0000000..2482f74 --- /dev/null +++ b/dev.go @@ -0,0 +1,3 @@ +package main + +import _ "github.com/cdle/sillyGirl/develop/qinglong" diff --git a/develop/qinglong/.gitignore b/develop/qinglong/.gitignore new file mode 100644 index 0000000..a539470 --- /dev/null +++ b/develop/qinglong/.gitignore @@ -0,0 +1 @@ +config.yaml \ No newline at end of file diff --git a/develop/qinglong/asset.go b/develop/qinglong/asset.go new file mode 100644 index 0000000..11d7a47 --- /dev/null +++ b/develop/qinglong/asset.go @@ -0,0 +1 @@ +package qinglong diff --git a/develop/qinglong/config.go b/develop/qinglong/config.go new file mode 100644 index 0000000..11d7a47 --- /dev/null +++ b/develop/qinglong/config.go @@ -0,0 +1 @@ +package qinglong diff --git a/develop/qinglong/env.go b/develop/qinglong/env.go new file mode 100644 index 0000000..ee94b63 --- /dev/null +++ b/develop/qinglong/env.go @@ -0,0 +1,129 @@ +package qinglong + +import ( + "encoding/json" + "errors" + "fmt" + "reflect" + "strings" + + "github.com/beego/beego/v2/adapter/httplib" + "github.com/buger/jsonparser" +) + +type EnvResponse struct { + Code int `json:"code"` + Data []Env `json:"data"` +} + +type Env struct { + Value string `json:"value"` + ID string `json:"_id"` + Status int `json:"status"` + Name string `json:"name"` + Remarks string `json:"remarks"` +} + +func GetEnv(searchValue string) ([]Env, error) { + er := EnvResponse{} + if err := req(PUT, ENVS, &er, "?searchValue="+searchValue); err != nil { + return nil, err + } + return er.Data, nil +} + +func SetEnv(e *Env) error { + es, err := GetEnv(e.Name) + if err != nil { + return err + } + if len(es) == 0 { + return AddEnv(e) + } + e.ID = es[0].ID + return req(PUT, ENVS, e) +} + +func AddEnv(e *Env) error { + return req(POST, ENVS, []Env{*e}) +} + +func RemEnv(e *Env) error { + es, err := GetEnv(e.Name) + if err != nil { + return err + } + if len(es) == 0 { + return nil + } + td := []string{} + for _, e := range es { + td = append(td, e.ID) + } + return req(DELETE, ENVS, td) +} + +func req(ps ...interface{}) error { + token, err := getToken() + if err != nil { + return err + } + method := GET + body := []byte{} + api := ENVS + apd := "" + var toParse interface{} + for _, p := range ps { + switch p.(type) { + case string: + switch p.(string) { + case GET, POST, DELETE, PUT: + method = p.(string) + case ENVS: + method = p.(string) + default: + apd = p.(string) + } + case []byte: + body = p.([]byte) + default: + if strings.Contains(reflect.TypeOf(&p).String(), "*") { + toParse = p + } else { + body, _ = json.Marshal(p) + } + } + } + var req *httplib.BeegoHTTPRequest + api += apd + switch method { + case GET: + req = httplib.Get(Config.Host + "/open/" + api) + case POST: + req = httplib.Delete(Config.Host + "/open/" + api) + case DELETE: + req = httplib.Delete(Config.Host + "/open/" + api) + case PUT: + req = httplib.Put(Config.Host + "/open/" + api) + } + if method != GET && len(body) > 0 { + req.Body(body) + } + req.Header("Authorization", fmt.Sprintf("Bearer %s", token)) + data, _ := json.Marshal(body) + req.Body(data) + data, err = req.Bytes() + if err != nil { + return err + } + code, _ := jsonparser.GetInt(data, "code") + if code != 200 { + return errors.New(string(data)) + } + if toParse != nil { + if err := json.Unmarshal(data, toParse); err != nil { + return errors.New(fmt.Sprintf("解析错误:%v,%v", err, string(data))) + } + } + return nil +} diff --git a/develop/qinglong/init.go b/develop/qinglong/init.go new file mode 100644 index 0000000..c49cedb --- /dev/null +++ b/develop/qinglong/init.go @@ -0,0 +1,59 @@ +package qinglong + +import ( + "errors" + "fmt" + "time" + + "github.com/beego/beego/v2/adapter/httplib" + "github.com/beego/beego/v2/core/logs" + "github.com/buger/jsonparser" + "github.com/cdle/sillyGirl/core" +) + +type Yaml struct { + Host string + ClientID string `yaml:"client_id"` + ClientSecret string `yaml:"client_secret"` +} + +var Config Yaml + +var token string +var expiration int64 +var GET = "GET" +var PUT = "PUT" +var POST = "POST" +var DELETE = "DELETE" +var ENVS = "envs" + +func init() { + core.ReadYaml(core.ExecPath+"/develop/qinglong/conf/", &Config, "https://raw.githubusercontent.com/cdle/sillyGirl/main/develop/qinglong/conf/config.yaml") + token, err := getToken() + if err == nil { + logs.Info("青龙可及%v", token) + } + +} + +func getToken() (string, error) { + if token != "" && expiration > time.Now().Unix() { + return token, nil + } + req := httplib.Get(fmt.Sprintf("%s/open/auth/token?client_id=%s&client_secret=%s", Config.Host, Config.ClientID, Config.ClientSecret)) + data, err := req.Bytes() + if err != nil { + msg := fmt.Sprintf("青龙链接失败:%v", err) + logs.Warn(msg) + return "", errors.New(msg) + } + code, _ := jsonparser.GetInt(data, "code") + if code != 200 { + msg := fmt.Sprintf("青龙登录失败:%v", string(data)) + logs.Warn(msg) + return "", errors.New(msg) + } + token, _ = jsonparser.GetString(data, "data", "token") + expiration, _ = jsonparser.GetInt(data, "data", "expiration") + return token, nil +} diff --git a/develop/qinglong/task.go b/develop/qinglong/task.go new file mode 100644 index 0000000..11d7a47 --- /dev/null +++ b/develop/qinglong/task.go @@ -0,0 +1 @@ +package qinglong