1
0

plugin_subscribe.go 9.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345
  1. package core
  2. import (
  3. "encoding/json"
  4. "regexp"
  5. "strings"
  6. "time"
  7. "github.com/beego/beego/v2/client/httplib"
  8. "github.com/cdle/sillyplus/core/common"
  9. "github.com/cdle/sillyplus/core/storage"
  10. "github.com/cdle/sillyplus/utils"
  11. "github.com/gin-gonic/gin"
  12. )
  13. var plugin_subcribe_addresses = sillyGirl.GetString("plugin_subcribe_addresses")
  14. var plugin_subcribe_data = MakeBucket("plugin_subcribe_data")
  15. type RequestPluginResult struct {
  16. Success bool `json:"success"`
  17. Data []*common.Function `json:"data"`
  18. Page int `json:"page"`
  19. Total int `json:"total"`
  20. Tab1 int `json:"tab1"`
  21. Tab2 int `json:"tab2"`
  22. Tab3 int `json:"tab3"`
  23. Tab string `json:"tab"`
  24. Time time.Time `json:"time"`
  25. Classes map[string]int `json:"classes"`
  26. Origins map[string]string `json:"origins"`
  27. }
  28. var plugin_list = []*common.Function{}
  29. var cdle_sublink = `
  30. link://T4EywWN46ztYBhHNdOl6TjEq/FHESPN1WFuDzv+cZCV2fhsy7n2wjHP4slqkvU259/bne2aNgoeM3TQI3OlA9W1RmGhVf2vIZWuLbNwaY+j/0mZCineppkVPWYGNsp7g
  31. //大灰机
  32. link://T4EywWN46ztYBhHNdOl6ThvHulsS6Fo5vRI+WFDJEtMXOScYg8z+dTEsiDC6yxMYc9hIUl7YBc0Z4Oqhyf86njlfjjC7OVT2O6xmsVQklX6kiOV6gbnk8Q42rT198viP
  33. //季春二九
  34. link://T4EywWN46ztYBhHNdOl6Tt4dOHeV1w7Hk32M5JJPN4MXkJBcpEEA/FHt/81li2Tt5Ny4LeEQ7q/stg3p8JthJsGAjr0SPAKR85pqnKWZF1bTcarbwTwtFqYBsqPtH9tB
  35. `
  36. // 搬运中心
  37. // link://T4EywWN46ztYBhHNdOl6Tpz8QQsCZGj8JvdRJ5QKatJYds3a/BticqD0hzidGsOysEx/RK/nKppChxMLb6QGczhWjGC/M2ETxWb+Jl+6q/x+LP4gy+ibeAEzatOYwdZMckI8nN/R6mY/HW2dyBtp0qH1ldICn6Wl+9YowLvvpLU=
  38. // 木子李
  39. // link://T4EywWN46ztYBhHNdOl6Tpz8QQsCZGj8JvdRJ5QKatL/GWakSkUWVNTd/jJS4YaqGXqvoJOxtEwVxbfBpmsMdTpKFr7K/+9MW/CJFpFsLFGM3yRxh2z8fVsDZUV6GoXei5QhOviIvo5ys7N5b6MRiEmbVATiiTEovz3IBg8nObQ=
  40. func initPluginList() {
  41. list := []*common.Function{}
  42. var carrys []chan []*common.Function
  43. for _, v := range regexp.MustCompile(`link://([^\s#]+)`).FindAllStringSubmatch(cdle_sublink+"\n"+plugin_subcribe_addresses+"\n", -1) {
  44. sublink := v[1]
  45. ppr := common.PluginPublisher{}
  46. var data []byte
  47. func() {
  48. defer func() {
  49. err := recover()
  50. if err != nil {
  51. console.Error("initPluginList:", err)
  52. }
  53. }()
  54. data, _ = DecryptByAes(sublink)
  55. }()
  56. if data == nil {
  57. continue
  58. }
  59. json.Unmarshal(data, &ppr)
  60. if ppr.Address != "" {
  61. carry := make(chan []*common.Function)
  62. carrys = append(carrys, carry)
  63. go func() {
  64. rr := RequestPluginResult{}
  65. data := plugin_subcribe_data.GetBytes(sublink)
  66. json.Unmarshal(data, &rr)
  67. if !rr.Success || rr.Time.Add(time.Second*3).Before(time.Now()) {
  68. address := ""
  69. if !strings.HasSuffix(ppr.Address, "list.json") {
  70. address = ppr.Address + "/api/plugins/list.json"
  71. } else {
  72. address = ppr.Address
  73. }
  74. req := httplib.Get(address)
  75. req.SetTimeout(time.Second*2, time.Second*2)
  76. data, _ := req.Bytes()
  77. json.Unmarshal(data, &rr)
  78. if rr.Success {
  79. rr.Time = time.Now()
  80. plugin_subcribe_data.Set(sublink, string(utils.JsonMarshal(rr)))
  81. }
  82. }
  83. for i := range rr.Data {
  84. rr.Data[i].Address = ppr.Address
  85. rr.Data[i].Organization = ppr.Organization
  86. rr.Data[i].Identified = ppr.Identified
  87. }
  88. n := len(rr.Data)
  89. flag := true
  90. for i := 0; i < n && flag; i++ {
  91. flag = false
  92. for j := 0; j < n-i-1; j++ {
  93. if rr.Data[j].CreateAt < rr.Data[j+1].CreateAt {
  94. rr.Data[j], rr.Data[j+1] = rr.Data[j+1], rr.Data[j]
  95. flag = true
  96. }
  97. }
  98. }
  99. carry <- rr.Data
  100. }()
  101. }
  102. }
  103. for _, carry := range carrys {
  104. list = append(list, <-carry...)
  105. }
  106. cyzl := "7642f5de-3300-11ed-8a79-52540066b468"
  107. plugin_list = list
  108. if sillyGirl.GetString("password") == "" && plugins.GetString(cyzl) == "" { //自动安装老版命令
  109. plugins.Set(cyzl, "install")
  110. }
  111. // if plugins.GetString("78b15932-334f-11ed-8b59-aaaa00117a5c") == "" { //自动安装比价文案
  112. // plugins.Set("78b15932-334f-11ed-8b59-aaaa00117a5c", "install")
  113. // }
  114. }
  115. var plugin_downloads = MakeBucket("plugin_downloads")
  116. func initWebPluginList() {
  117. storage.Watch(sillyGirl, "plugin_subcribe_addresses", func(old, new, key string) *storage.Final {
  118. plugin_subcribe_addresses = new
  119. return nil
  120. })
  121. GinApi(GET, "/api/plugins/list.json", func(ctx *gin.Context) {
  122. // ctx.QueryArray()
  123. origins := ctx.QueryArray("origin[]")
  124. current := utils.Int(ctx.Query("current"))
  125. pageSize := utils.Int(ctx.Query("pageSize"))
  126. activeKey := ctx.Query("activeKey")
  127. init := ctx.Query("init")
  128. keyword := ctx.Query("keyword")
  129. class := ctx.Query("class")
  130. mclass := ctx.Query("mclass")
  131. rr := RequestPluginResult{
  132. Success: true,
  133. }
  134. if pageSize == 0 {
  135. pageSize = 10
  136. }
  137. if class == "" {
  138. class = "全部"
  139. }
  140. rr.Page = current
  141. rr.Data = []*common.Function{}
  142. if current != 0 {
  143. if current == 1 && init != "false" {
  144. initPluginList()
  145. }
  146. var list []*common.Function
  147. if keyword == "" {
  148. if len(origins) == 0 {
  149. list = append(list, plugin_list...)
  150. } else {
  151. for _, f := range plugin_list {
  152. if Contains(origins, f.Organization) {
  153. list = append(list, f)
  154. }
  155. }
  156. }
  157. } else {
  158. if len(origins) == 0 {
  159. for _, f := range plugin_list {
  160. if strings.Contains(f.Title, keyword) || strings.Contains(f.Organization, keyword) {
  161. list = append(list, f)
  162. }
  163. }
  164. } else {
  165. for _, f := range plugin_list {
  166. if strings.Contains(f.Title, keyword) || strings.Contains(f.Organization, keyword) {
  167. if Contains(origins, f.Organization) {
  168. list = append(list, f)
  169. }
  170. }
  171. }
  172. }
  173. }
  174. rr.Total = len(list)
  175. tab1 := []*common.Function{}
  176. tab2 := []*common.Function{}
  177. tab3 := []*common.Function{}
  178. fc := []*common.Function{}
  179. fc = append(fc, Functions...)
  180. classes := map[string][]*common.Function{}
  181. classesNum := map[string]int{}
  182. for i := range list {
  183. if len(list[i].Classes) == 0 {
  184. class := "未分类"
  185. if _, ok := classes[class]; !ok {
  186. classes[class] = []*common.Function{}
  187. }
  188. classes[class] = append(classes[class], list[i])
  189. } else {
  190. for _, class := range list[i].Classes {
  191. class = strings.TrimRight(class, "类")
  192. if _, ok := classes[class]; !ok {
  193. classes[class] = []*common.Function{}
  194. }
  195. classes[class] = append(classes[class], list[i])
  196. }
  197. }
  198. }
  199. for class, fs := range classes {
  200. classesNum[class] = len(fs)
  201. }
  202. classesNum["全部"] = len(list)
  203. if class != "全部" {
  204. list, _ = classes[class]
  205. }
  206. rr.Classes = classesNum
  207. var origins = map[string]string{}
  208. for i := range list { //处理第二分类
  209. if list[i].Organization != "" {
  210. origins[list[i].Organization] = list[i].Organization
  211. }
  212. ded := false
  213. for j := range fc {
  214. if list[i].UUID == fc[j].UUID {
  215. if list[i].Version != fc[j].Version {
  216. tab3 = append(tab3, list[i])
  217. }
  218. ded = true
  219. break
  220. }
  221. }
  222. if ded {
  223. tab1 = append(tab1, list[i]) //已安装
  224. } else {
  225. tab2 = append(tab2, list[i])
  226. }
  227. }
  228. rr.Origins = origins
  229. if activeKey == "tab2" {
  230. list = tab2
  231. rr.Tab1 = len(tab1)
  232. rr.Tab2 = len(tab2)
  233. rr.Tab3 = len(tab3)
  234. } else if activeKey == "tab3" {
  235. list = tab3
  236. rr.Tab1 = len(tab1)
  237. rr.Tab2 = len(tab2)
  238. rr.Tab3 = len(tab3)
  239. } else {
  240. list = tab1
  241. rr.Tab1 = len(tab1)
  242. rr.Tab2 = len(tab2)
  243. rr.Tab3 = len(tab3)
  244. }
  245. tab := ""
  246. if mclass == "true" {
  247. if rr.Tab2 > rr.Tab1 {
  248. list = tab2
  249. tab = "tab2"
  250. } else {
  251. list = tab1
  252. tab = "tab1"
  253. }
  254. }
  255. rr.Tab = tab
  256. rr.Total = len(list)
  257. if len(list) == 0 {
  258. ctx.JSON(200, rr)
  259. return
  260. }
  261. if last := (rr.Total + pageSize - 1) / pageSize; current > last {
  262. current = last
  263. }
  264. begin := (current - 1) * pageSize
  265. end := (current) * pageSize
  266. if end > rr.Total {
  267. end = rr.Total
  268. }
  269. if begin > end {
  270. begin = end
  271. }
  272. rr.Data = append(rr.Data, list[begin:end]...)
  273. publics := []string{}
  274. for _, f := range Functions {
  275. if f.Public && f.UUID != "" {
  276. publics = append(publics, f.UUID)
  277. }
  278. }
  279. for i := range rr.Data {
  280. rr.Data[i].HasForm = false
  281. rr.Data[i].Running = false
  282. for j := range fc {
  283. if rr.Data[i].UUID == fc[j].UUID {
  284. rr.Data[i].Messages = GetPluginMessage(rr.Data[i].UUID)
  285. if rr.Data[i].Version != fc[j].Version {
  286. rr.Data[i].Status = 1
  287. } else {
  288. rr.Data[i].Status = 2
  289. }
  290. if Contains(publics, rr.Data[i].UUID) {
  291. rr.Data[i].Status = 6
  292. }
  293. if rr.Data[i].Icon == "" {
  294. rr.Data[i].Icon = "https://blog.imdraw.com/huli.jpeg"
  295. }
  296. if fc[j].HasForm {
  297. rr.Data[i].HasForm = true
  298. }
  299. if fc[j].Running {
  300. rr.Data[i].Running = true
  301. }
  302. rr.Data[i].Debug = plugin_debug.GetString(rr.Data[i].UUID) == "b:true"
  303. rr.Data[i].Disable = fc[j].Disable
  304. }
  305. }
  306. rr.Data[i].Description = parseReply2(rr.Data[i].Description)
  307. }
  308. ctx.JSON(200, rr)
  309. return
  310. }
  311. ctx.JSON(200, GetPublicResponse())
  312. })
  313. }
  314. func GetPublicResponse() *RequestPluginResult {
  315. rr := &RequestPluginResult{
  316. Success: true,
  317. }
  318. fs := []*common.Function{}
  319. for _, f := range Functions {
  320. if f.Public {
  321. fs = append(fs, f)
  322. f.Downloads = plugin_downloads.GetInt(f.UUID)
  323. }
  324. }
  325. rr.Total = len(fs)
  326. rr.Data = fs
  327. rr.Page = 1
  328. return rr
  329. }