go-bot/workers/pkg.go
2024-06-27 13:16:14 +08:00

148 lines
4 KiB
Go
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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
}