ZeroBot-Plugin/plugin/warframeapi/api.go
GenesisAN e294059de4
fix 初始化未能获取数据的问题 (#602)
* fix 初始化未能获取数据的问题

* fix 添加读写锁

* fix lint

* fix lint

* change 改为全局锁
2023-03-04 19:54:56 +08:00

112 lines
3.2 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 warframeapi
import (
"encoding/json"
"errors"
"fmt"
zero "github.com/wdvxdr1123/ZeroBot"
"github.com/wdvxdr1123/ZeroBot/message"
"net/http"
"sort"
"github.com/FloatTech/floatbox/web"
)
const wfapiurl = "https://api.warframestat.us/pc" // 星际战甲API
const wfitemurl = "https://api.warframe.market/v1/items" // 星际战甲游戏品信息列表URL
// 从WFapi获取数据
func newwfapi() (w wfapi, err error) {
var data []byte
data, err = web.GetData(wfapiurl)
if err != nil {
return
}
err = json.Unmarshal(data, &w)
return
}
// 获取Warframe市场的售价表并进行排序,cn_name为物品中文名称onlyMaxRank表示只取最高等级的物品返回物品售价表物品信息物品英文
func getitemsorder(cnName string, onlyMaxRank bool) (od orders, it *itemsInSet, n string, err error) {
var wfapiio wfAPIItemsOrders
data, err := web.RequestDataWithHeaders(&http.Client{}, fmt.Sprintf("https://api.warframe.market/v1/items/%s/orders?include=item", cnName), "GET", func(request *http.Request) error {
request.Header.Add("Accept", "application/json")
request.Header.Add("Platform", "pc")
return nil
}, nil)
if err != nil {
return
}
err = json.Unmarshal(data, &wfapiio)
if len(wfapiio.Payload.Orders) == 0 {
err = errors.New("no such name")
}
od = make(orders, 0, len(wfapiio.Payload.Orders))
// 遍历市场物品列表
for _, v := range wfapiio.Payload.Orders {
// 取其中类型为售卖,且去掉不在线的玩家
if v.OrderType == "sell" && v.User.Status != "offline" {
if !onlyMaxRank {
od = append(od, v)
continue
}
if v.ModRank == wfapiio.Include.Item.ItemsInSet[0].ModMaxRank {
od = append(od, v)
}
}
}
// 对报价表进行排序,由低到高
sort.Sort(od)
// 获取物品信息
for i, v := range wfapiio.Include.Item.ItemsInSet {
if v.URLName == cnName {
it = &wfapiio.Include.Item.ItemsInSet[i]
n = v.En.ItemName
return
}
}
it = &wfapiio.Include.Item.ItemsInSet[0]
n = wfapiio.Include.Item.ItemsInSet[0].En.ItemName
return
}
// 检查值是否为空,为空则重新获取
func checknwm(ctx *zero.Ctx) bool {
var err error
wmdr.Lock()
defer wmdr.Unlock()
if wd.wmitems == nil || wd.itemNames == nil {
wd, err = newwm()
if err != nil { // 获取失败
ctx.SendChain(message.Text("ERROR: 获取Warframe市场物品列表失败(" + err.Error() + ")"))
return false
}
}
return true
}
func newwm() (*wmdata, error) {
var itemapi wfAPIItem // WarFrame市场的数据实例
var wd wmdata
println("正在获取Warframe市场物品列表")
data, err := web.RequestDataWithHeaders(&http.Client{}, wfitemurl, "GET", func(request *http.Request) error {
request.Header.Add("Accept", "application/json")
request.Header.Add("Language", "zh-hans")
return nil
}, nil)
if err != nil {
return &wd, err
}
err = json.Unmarshal(data, &itemapi)
if err != nil {
return &wd, err
}
wd.wmitems = make(map[string]items, len(itemapi.Payload.Items)*4)
wd.itemNames = make([]string, len(itemapi.Payload.Items))
for i, v := range itemapi.Payload.Items {
wd.wmitems[v.ItemName] = v
wd.itemNames[i] = v.ItemName
}
println("获取Warframe市场物品列表完成")
return &wd, nil
}