package workers import ( "fmt" "io" "net/http" "strings" "time" "github.com/goccy/go-json" ) type Pkg struct { *StdAns } func (a *Pkg) GetMsg() string { if len(a.Parms) < 2 { return "请输入包名 如:/pkg linux 查询 linux 相关软件" } // 去除换行符 raw_msg := strings.TrimRight(a.RawMsg, "\n") raw_msg = strings.TrimRight(raw_msg, "\r") fmt.Println("raw_msg:", raw_msg) parms := strings.Split(raw_msg, " ") url := "https://archlinux.org/packages/search/json/?name=" + parms[1] if len(parms) > 2 && parms[1] != "" { url += "&repo=" + strings.ToUpper(parms[2][:1]) + parms[2][1:] } // 输出请求地址 fmt.Println("pkg url:", url) req, err := http.Get(url) if err != nil { return "服务器网络错误!" } defer req.Body.Close() body, err := io.ReadAll(req.Body) if err != nil { return "数据解析错误!" } // fmt.Println("pkg body:", string(body)) // var pkg []Package var pkg map[string]interface{} err = json.Unmarshal(body, &pkg) if err != nil { return err.Error() } // fmt.Println("pkg:", pkg) resultSlipe := pkg["results"].([]interface{}) if len(resultSlipe) == 0 { url := "https://aur.archlinux.org/rpc/v5/suggest/" + parms[1] req, err := http.Get(url) if err != nil { fmt.Println(err) } defer req.Body.Close() fmt.Println("aur suggest url:", url) re, err := io.ReadAll(req.Body) // fmt.Println(string(re)) if err != nil { fmt.Println(err) } var suggestions []string err = json.Unmarshal(re, &suggestions) if err != nil { fmt.Println(err) } // println(len(suggestions)) if len(suggestions) == 0 { return "没有找到相关软件" } searchUrl := "https://aur.archlinux.org/rpc/v5/search/" + suggestions[0] + "?by=name" searchReq, err := http.Get(searchUrl) if err != nil { fmt.Println(err) } defer searchReq.Body.Close() searchRe, err := io.ReadAll(searchReq.Body) if err != nil { fmt.Println(err) } var searchMap map[string]interface{} err = json.Unmarshal(searchRe, &searchMap) if err != nil { fmt.Println(err) } searchResults := searchMap["results"].([]interface{}) // println("searchResults:", len(searchResults)) maxVotes := 0.0 var searchResult map[string]interface{} // 增加根据投票人数排序 if len(searchResults) > 1 { for _, result := range searchResults { resultMap := result.(map[string]interface{}) numVotes := resultMap["NumVotes"].(float64) if numVotes > maxVotes { maxVotes = numVotes searchResult = resultMap } } fmt.Println(len(searchResult)) } else if len(searchResults) == 1 { searchResult = searchResults[0].(map[string]interface{}) } maintainer, ok := searchResult["Maintainer"].(string) if !ok { maintainer = "孤儿包" } println("maintainer:", maintainer) // last_update := '' last_update := time.Unix(int64(searchResult["LastModified"].(float64)), 0).Format("2006-01-02 15:04:05") var msg string msg += "仓库:AUR\n" msg += "包名:" + searchResult["Name"].(string) + "\n" msg += "版本:" + searchResult["Version"].(string) + "\n" msg += "描述:" + searchResult["Description"].(string) + "\n" msg += "维护者:" + maintainer + "\n" msg += "链接:" + searchResult["URL"].(string) + "\n" msg += "更新时间:" + last_update fmt.Println(msg) return msg } result := resultSlipe[0].(map[string]interface{}) // 输出结果字符串 // fmt.Println("result:", result) // if result != nil { var msg string last_update := result["last_update"].(string) last_update = strings.Replace(last_update, "T", " ", 1) last_update = strings.Replace(last_update, "Z", "", 1) msg += "仓库:" + result["repo"].(string) + "\n" msg += "包名:" + result["pkgname"].(string) + "\n" msg += "版本:" + result["pkgver"].(string) + "\n" msg += "描述:" + result["pkgdesc"].(string) + "\n" msg += "打包:" + result["packager"].(string) + "\n" msg += "链接:" + result["url"].(string) + "\n" msg += "更新日期:" + last_update return msg }