| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345 |
- package core
- import (
- "encoding/json"
- "regexp"
- "strings"
- "time"
- "github.com/beego/beego/v2/client/httplib"
- "github.com/cdle/sillyplus/core/common"
- "github.com/cdle/sillyplus/core/storage"
- "github.com/cdle/sillyplus/utils"
- "github.com/gin-gonic/gin"
- )
- var plugin_subcribe_addresses = sillyGirl.GetString("plugin_subcribe_addresses")
- var plugin_subcribe_data = MakeBucket("plugin_subcribe_data")
- type RequestPluginResult struct {
- Success bool `json:"success"`
- Data []*common.Function `json:"data"`
- Page int `json:"page"`
- Total int `json:"total"`
- Tab1 int `json:"tab1"`
- Tab2 int `json:"tab2"`
- Tab3 int `json:"tab3"`
- Tab string `json:"tab"`
- Time time.Time `json:"time"`
- Classes map[string]int `json:"classes"`
- Origins map[string]string `json:"origins"`
- }
- var plugin_list = []*common.Function{}
- var cdle_sublink = `
- link://T4EywWN46ztYBhHNdOl6TjEq/FHESPN1WFuDzv+cZCV2fhsy7n2wjHP4slqkvU259/bne2aNgoeM3TQI3OlA9W1RmGhVf2vIZWuLbNwaY+j/0mZCineppkVPWYGNsp7g
- //大灰机
- link://T4EywWN46ztYBhHNdOl6ThvHulsS6Fo5vRI+WFDJEtMXOScYg8z+dTEsiDC6yxMYc9hIUl7YBc0Z4Oqhyf86njlfjjC7OVT2O6xmsVQklX6kiOV6gbnk8Q42rT198viP
- //季春二九
- link://T4EywWN46ztYBhHNdOl6Tt4dOHeV1w7Hk32M5JJPN4MXkJBcpEEA/FHt/81li2Tt5Ny4LeEQ7q/stg3p8JthJsGAjr0SPAKR85pqnKWZF1bTcarbwTwtFqYBsqPtH9tB
- `
- // 搬运中心
- // link://T4EywWN46ztYBhHNdOl6Tpz8QQsCZGj8JvdRJ5QKatJYds3a/BticqD0hzidGsOysEx/RK/nKppChxMLb6QGczhWjGC/M2ETxWb+Jl+6q/x+LP4gy+ibeAEzatOYwdZMckI8nN/R6mY/HW2dyBtp0qH1ldICn6Wl+9YowLvvpLU=
- // 木子李
- // link://T4EywWN46ztYBhHNdOl6Tpz8QQsCZGj8JvdRJ5QKatL/GWakSkUWVNTd/jJS4YaqGXqvoJOxtEwVxbfBpmsMdTpKFr7K/+9MW/CJFpFsLFGM3yRxh2z8fVsDZUV6GoXei5QhOviIvo5ys7N5b6MRiEmbVATiiTEovz3IBg8nObQ=
- func initPluginList() {
- list := []*common.Function{}
- var carrys []chan []*common.Function
- for _, v := range regexp.MustCompile(`link://([^\s#]+)`).FindAllStringSubmatch(cdle_sublink+"\n"+plugin_subcribe_addresses+"\n", -1) {
- sublink := v[1]
- ppr := common.PluginPublisher{}
- var data []byte
- func() {
- defer func() {
- err := recover()
- if err != nil {
- console.Error("initPluginList:", err)
- }
- }()
- data, _ = DecryptByAes(sublink)
- }()
- if data == nil {
- continue
- }
- json.Unmarshal(data, &ppr)
- if ppr.Address != "" {
- carry := make(chan []*common.Function)
- carrys = append(carrys, carry)
- go func() {
- rr := RequestPluginResult{}
- data := plugin_subcribe_data.GetBytes(sublink)
- json.Unmarshal(data, &rr)
- if !rr.Success || rr.Time.Add(time.Second*3).Before(time.Now()) {
- address := ""
- if !strings.HasSuffix(ppr.Address, "list.json") {
- address = ppr.Address + "/api/plugins/list.json"
- } else {
- address = ppr.Address
- }
- req := httplib.Get(address)
- req.SetTimeout(time.Second*2, time.Second*2)
- data, _ := req.Bytes()
- json.Unmarshal(data, &rr)
- if rr.Success {
- rr.Time = time.Now()
- plugin_subcribe_data.Set(sublink, string(utils.JsonMarshal(rr)))
- }
- }
- for i := range rr.Data {
- rr.Data[i].Address = ppr.Address
- rr.Data[i].Organization = ppr.Organization
- rr.Data[i].Identified = ppr.Identified
- }
- n := len(rr.Data)
- flag := true
- for i := 0; i < n && flag; i++ {
- flag = false
- for j := 0; j < n-i-1; j++ {
- if rr.Data[j].CreateAt < rr.Data[j+1].CreateAt {
- rr.Data[j], rr.Data[j+1] = rr.Data[j+1], rr.Data[j]
- flag = true
- }
- }
- }
- carry <- rr.Data
- }()
- }
- }
- for _, carry := range carrys {
- list = append(list, <-carry...)
- }
- cyzl := "7642f5de-3300-11ed-8a79-52540066b468"
- plugin_list = list
- if sillyGirl.GetString("password") == "" && plugins.GetString(cyzl) == "" { //自动安装老版命令
- plugins.Set(cyzl, "install")
- }
- // if plugins.GetString("78b15932-334f-11ed-8b59-aaaa00117a5c") == "" { //自动安装比价文案
- // plugins.Set("78b15932-334f-11ed-8b59-aaaa00117a5c", "install")
- // }
- }
- var plugin_downloads = MakeBucket("plugin_downloads")
- func initWebPluginList() {
- storage.Watch(sillyGirl, "plugin_subcribe_addresses", func(old, new, key string) *storage.Final {
- plugin_subcribe_addresses = new
- return nil
- })
- GinApi(GET, "/api/plugins/list.json", func(ctx *gin.Context) {
- // ctx.QueryArray()
- origins := ctx.QueryArray("origin[]")
- current := utils.Int(ctx.Query("current"))
- pageSize := utils.Int(ctx.Query("pageSize"))
- activeKey := ctx.Query("activeKey")
- init := ctx.Query("init")
- keyword := ctx.Query("keyword")
- class := ctx.Query("class")
- mclass := ctx.Query("mclass")
- rr := RequestPluginResult{
- Success: true,
- }
- if pageSize == 0 {
- pageSize = 10
- }
- if class == "" {
- class = "全部"
- }
- rr.Page = current
- rr.Data = []*common.Function{}
- if current != 0 {
- if current == 1 && init != "false" {
- initPluginList()
- }
- var list []*common.Function
- if keyword == "" {
- if len(origins) == 0 {
- list = append(list, plugin_list...)
- } else {
- for _, f := range plugin_list {
- if Contains(origins, f.Organization) {
- list = append(list, f)
- }
- }
- }
- } else {
- if len(origins) == 0 {
- for _, f := range plugin_list {
- if strings.Contains(f.Title, keyword) || strings.Contains(f.Organization, keyword) {
- list = append(list, f)
- }
- }
- } else {
- for _, f := range plugin_list {
- if strings.Contains(f.Title, keyword) || strings.Contains(f.Organization, keyword) {
- if Contains(origins, f.Organization) {
- list = append(list, f)
- }
- }
- }
- }
- }
- rr.Total = len(list)
- tab1 := []*common.Function{}
- tab2 := []*common.Function{}
- tab3 := []*common.Function{}
- fc := []*common.Function{}
- fc = append(fc, Functions...)
- classes := map[string][]*common.Function{}
- classesNum := map[string]int{}
- for i := range list {
- if len(list[i].Classes) == 0 {
- class := "未分类"
- if _, ok := classes[class]; !ok {
- classes[class] = []*common.Function{}
- }
- classes[class] = append(classes[class], list[i])
- } else {
- for _, class := range list[i].Classes {
- class = strings.TrimRight(class, "类")
- if _, ok := classes[class]; !ok {
- classes[class] = []*common.Function{}
- }
- classes[class] = append(classes[class], list[i])
- }
- }
- }
- for class, fs := range classes {
- classesNum[class] = len(fs)
- }
- classesNum["全部"] = len(list)
- if class != "全部" {
- list, _ = classes[class]
- }
- rr.Classes = classesNum
- var origins = map[string]string{}
- for i := range list { //处理第二分类
- if list[i].Organization != "" {
- origins[list[i].Organization] = list[i].Organization
- }
- ded := false
- for j := range fc {
- if list[i].UUID == fc[j].UUID {
- if list[i].Version != fc[j].Version {
- tab3 = append(tab3, list[i])
- }
- ded = true
- break
- }
- }
- if ded {
- tab1 = append(tab1, list[i]) //已安装
- } else {
- tab2 = append(tab2, list[i])
- }
- }
- rr.Origins = origins
- if activeKey == "tab2" {
- list = tab2
- rr.Tab1 = len(tab1)
- rr.Tab2 = len(tab2)
- rr.Tab3 = len(tab3)
- } else if activeKey == "tab3" {
- list = tab3
- rr.Tab1 = len(tab1)
- rr.Tab2 = len(tab2)
- rr.Tab3 = len(tab3)
- } else {
- list = tab1
- rr.Tab1 = len(tab1)
- rr.Tab2 = len(tab2)
- rr.Tab3 = len(tab3)
- }
- tab := ""
- if mclass == "true" {
- if rr.Tab2 > rr.Tab1 {
- list = tab2
- tab = "tab2"
- } else {
- list = tab1
- tab = "tab1"
- }
- }
- rr.Tab = tab
- rr.Total = len(list)
- if len(list) == 0 {
- ctx.JSON(200, rr)
- return
- }
- if last := (rr.Total + pageSize - 1) / pageSize; current > last {
- current = last
- }
- begin := (current - 1) * pageSize
- end := (current) * pageSize
- if end > rr.Total {
- end = rr.Total
- }
- if begin > end {
- begin = end
- }
- rr.Data = append(rr.Data, list[begin:end]...)
- publics := []string{}
- for _, f := range Functions {
- if f.Public && f.UUID != "" {
- publics = append(publics, f.UUID)
- }
- }
- for i := range rr.Data {
- rr.Data[i].HasForm = false
- rr.Data[i].Running = false
- for j := range fc {
- if rr.Data[i].UUID == fc[j].UUID {
- rr.Data[i].Messages = GetPluginMessage(rr.Data[i].UUID)
- if rr.Data[i].Version != fc[j].Version {
- rr.Data[i].Status = 1
- } else {
- rr.Data[i].Status = 2
- }
- if Contains(publics, rr.Data[i].UUID) {
- rr.Data[i].Status = 6
- }
- if rr.Data[i].Icon == "" {
- rr.Data[i].Icon = "https://blog.imdraw.com/huli.jpeg"
- }
- if fc[j].HasForm {
- rr.Data[i].HasForm = true
- }
- if fc[j].Running {
- rr.Data[i].Running = true
- }
- rr.Data[i].Debug = plugin_debug.GetString(rr.Data[i].UUID) == "b:true"
- rr.Data[i].Disable = fc[j].Disable
- }
- }
- rr.Data[i].Description = parseReply2(rr.Data[i].Description)
- }
- ctx.JSON(200, rr)
- return
- }
- ctx.JSON(200, GetPublicResponse())
- })
- }
- func GetPublicResponse() *RequestPluginResult {
- rr := &RequestPluginResult{
- Success: true,
- }
- fs := []*common.Function{}
- for _, f := range Functions {
- if f.Public {
- fs = append(fs, f)
- f.Downloads = plugin_downloads.GetInt(f.UUID)
- }
- }
- rr.Total = len(fs)
- rr.Data = fs
- rr.Page = 1
- return rr
- }
|