Skip to content

Commit e294059

Browse files
authored
fix 初始化未能获取数据的问题 (#602)
* fix 初始化未能获取数据的问题 * fix 添加读写锁 * fix lint * fix lint * change 改为全局锁
1 parent 84bc79e commit e294059

File tree

2 files changed

+48
-18
lines changed

2 files changed

+48
-18
lines changed

plugin/warframeapi/api.go

Lines changed: 27 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,8 @@ import (
44
"encoding/json"
55
"errors"
66
"fmt"
7+
zero "github.com/wdvxdr1123/ZeroBot"
8+
"github.com/wdvxdr1123/ZeroBot/message"
79
"net/http"
810
"sort"
911

@@ -68,27 +70,42 @@ func getitemsorder(cnName string, onlyMaxRank bool) (od orders, it *itemsInSet,
6870
return
6971
}
7072

71-
func newwm() (wmitems map[string]items, itemNames []string) {
73+
// 检查值是否为空,为空则重新获取
74+
func checknwm(ctx *zero.Ctx) bool {
75+
var err error
76+
wmdr.Lock()
77+
defer wmdr.Unlock()
78+
if wd.wmitems == nil || wd.itemNames == nil {
79+
wd, err = newwm()
80+
if err != nil { // 获取失败
81+
ctx.SendChain(message.Text("ERROR: 获取Warframe市场物品列表失败(" + err.Error() + ")"))
82+
return false
83+
}
84+
}
85+
return true
86+
}
87+
func newwm() (*wmdata, error) {
7288
var itemapi wfAPIItem // WarFrame市场的数据实例
73-
89+
var wd wmdata
90+
println("正在获取Warframe市场物品列表")
7491
data, err := web.RequestDataWithHeaders(&http.Client{}, wfitemurl, "GET", func(request *http.Request) error {
7592
request.Header.Add("Accept", "application/json")
7693
request.Header.Add("Language", "zh-hans")
7794
return nil
7895
}, nil)
7996
if err != nil {
80-
panic(err)
97+
return &wd, err
8198
}
8299
err = json.Unmarshal(data, &itemapi)
83100
if err != nil {
84-
panic(err)
101+
return &wd, err
85102
}
86-
87-
wmitems = make(map[string]items, len(itemapi.Payload.Items)*4)
88-
itemNames = make([]string, len(itemapi.Payload.Items))
103+
wd.wmitems = make(map[string]items, len(itemapi.Payload.Items)*4)
104+
wd.itemNames = make([]string, len(itemapi.Payload.Items))
89105
for i, v := range itemapi.Payload.Items {
90-
wmitems[v.ItemName] = v
91-
itemNames[i] = v.ItemName
106+
wd.wmitems[v.ItemName] = v
107+
wd.itemNames[i] = v.ItemName
92108
}
93-
return
109+
println("获取Warframe市场物品列表完成")
110+
return &wd, nil
94111
}

plugin/warframeapi/main.go

Lines changed: 21 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ import (
55
"fmt"
66
"strconv"
77
"strings"
8+
"sync"
89
"time"
910

1011
ctrl "github.com/FloatTech/zbpctrl"
@@ -15,7 +16,14 @@ import (
1516
"github.com/wdvxdr1123/ZeroBot/message"
1617
)
1718

18-
var wmitems, itemNames = newwm()
19+
var wmdr sync.RWMutex
20+
21+
type wmdata struct {
22+
wmitems map[string]items
23+
itemNames []string
24+
}
25+
26+
var wd, _ = newwm()
1927

2028
func init() {
2129
eng := control.Register("warframeapi", &ctrl.Options[*zero.Ctx]{
@@ -234,10 +242,12 @@ func init() {
234242
ctx.SendChain(message.Text("已拉取服务器时间并同步到本地模拟"))
235243
})
236244
// 根据名称从Warframe市场查询物品售价
237-
eng.OnPrefix(".wm ").SetBlock(true).
245+
eng.OnPrefix(".wm ", checknwm).SetBlock(true).
238246
Handle(func(ctx *zero.Ctx) {
239247
// 根据输入的名称, 从游戏物品名称列表中进行模糊搜索
240-
sol := fuzzy.FindNormalizedFold(ctx.State["args"].(string), itemNames)
248+
wmdr.RLock()
249+
sol := fuzzy.FindNormalizedFold(ctx.State["args"].(string), wd.itemNames)
250+
wmdr.RUnlock()
241251
// 物品名称
242252
var name string
243253

@@ -282,17 +292,20 @@ func init() {
282292
if onlymaxrank {
283293
msgs = msgs[:0]
284294
}
285-
sells, iteminfo, txt, err := getitemsorder(wmitems[name].URLName, onlymaxrank)
295+
296+
sells, iteminfo, txt, err := getitemsorder(wd.wmitems[name].URLName, onlymaxrank)
286297
if !onlymaxrank {
298+
wmdr.RLock()
287299
if iteminfo.ZhHans.WikiLink == "" {
288300
msgs = append(msgs, ctxext.FakeSenderForwardNode(ctx,
289-
message.Image("https://warframe.market/static/assets/"+wmitems[name].Thumb),
290-
message.Text("\n", wmitems[name].ItemName)))
301+
message.Image("https://warframe.market/static/assets/"+wd.wmitems[name].Thumb),
302+
message.Text("\n", wd.wmitems[name].ItemName)))
291303
} else {
292304
msgs = append(msgs, ctxext.FakeSenderForwardNode(ctx,
293-
message.Image("https://warframe.market/static/assets/"+wmitems[name].Thumb),
294-
message.Text("\n", wmitems[name].ItemName, "\nwiki: ", iteminfo.ZhHans.WikiLink)))
305+
message.Image("https://warframe.market/static/assets/"+wd.wmitems[name].Thumb),
306+
message.Text("\n", wd.wmitems[name].ItemName, "\nwiki: ", iteminfo.ZhHans.WikiLink)))
295307
}
308+
wmdr.RUnlock()
296309
}
297310

298311
if err != nil {

0 commit comments

Comments
 (0)