diff --git a/plugin/baiduaudit/audit.go b/plugin/baiduaudit/audit.go index 4c8ec6ad..5a801df0 100644 --- a/plugin/baiduaudit/audit.go +++ b/plugin/baiduaudit/audit.go @@ -442,17 +442,12 @@ func loadConfig() { // 保存配置文件 func jsonSave(v keyConfig, path string) { - jsf, _ := os.OpenFile(path, os.O_WRONLY|os.O_CREATE|os.O_TRUNC, 0666) - defer func(file *os.File) { - err := file.Close() - if err != nil { - fmt.Println(err) - } - }(jsf) // 结束时关闭句柄,释放资源 - err := json.NewEncoder(jsf).Encode(v) + jsf, err := os.OpenFile(path, os.O_WRONLY|os.O_CREATE|os.O_TRUNC, 0666) if err != nil { - fmt.Println(err) + return } + defer jsf.Close() + _ = json.NewEncoder(jsf).Encode(v) } // JSON反序列化 diff --git a/plugin/warframeapi/api.go b/plugin/warframeapi/api.go index 729d8678..d4a3de28 100644 --- a/plugin/warframeapi/api.go +++ b/plugin/warframeapi/api.go @@ -7,8 +7,8 @@ import ( "net/http" "sort" - zero "github.com/wdvxdr1123/ZeroBot" - "github.com/wdvxdr1123/ZeroBot/message" + "github.com/RomiChan/syncx" + "github.com/sirupsen/logrus" "github.com/FloatTech/floatbox/web" ) @@ -71,24 +71,22 @@ func getitemsorder(cnName string, onlyMaxRank bool) (od orders, it *itemsInSet, 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 +type wmdata struct { + wmitems map[string]items + itemNames []string } + +var ( + wderr error + wd = syncx.Lazy[*wmdata]{Init: func() (d *wmdata) { + d, wderr = newwm() + return + }} +) + 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") @@ -107,6 +105,6 @@ func newwm() (*wmdata, error) { wd.wmitems[v.ItemName] = v wd.itemNames[i] = v.ItemName } - println("获取Warframe市场物品列表完成") + logrus.Infoln("[wfapi] 获取", len(wd.itemNames), "项内容") return &wd, nil } diff --git a/plugin/warframeapi/main.go b/plugin/warframeapi/main.go index 8d32a688..a28a5907 100644 --- a/plugin/warframeapi/main.go +++ b/plugin/warframeapi/main.go @@ -5,26 +5,17 @@ import ( "fmt" "strconv" "strings" - "sync" "time" ctrl "github.com/FloatTech/zbpctrl" "github.com/FloatTech/zbputils/control" "github.com/FloatTech/zbputils/ctxext" + "github.com/RomiChan/syncx" "github.com/lithammer/fuzzysearch/fuzzy" zero "github.com/wdvxdr1123/ZeroBot" "github.com/wdvxdr1123/ZeroBot/message" ) -var wmdr sync.RWMutex - -type wmdata struct { - wmitems map[string]items - itemNames []string -} - -var wd, _ = newwm() - func init() { eng := control.Register("warframeapi", &ctrl.Options[*zero.Ctx]{ DisableOnDefault: false, @@ -242,12 +233,24 @@ func init() { ctx.SendChain(message.Text("已拉取服务器时间并同步到本地模拟")) }) // 根据名称从Warframe市场查询物品售价 - eng.OnPrefix(".wm ", checknwm).SetBlock(true). + eng.OnPrefix(".wm ", func(ctx *zero.Ctx) bool { + if wd.Get().wmitems == nil || wd.Get().itemNames == nil { + if wderr != nil { // 获取失败 + ctx.SendChain(message.Text("ERROR: 获取Warframe市场物品列表失败: ", wderr)) + } else { + ctx.SendChain(message.Text("ERROR: Warframe市场物品列表为空!")) + } + wd = syncx.Lazy[*wmdata]{Init: func() (d *wmdata) { + d, wderr = newwm() + return + }} + return false + } + return true + }).SetBlock(true). Handle(func(ctx *zero.Ctx) { // 根据输入的名称, 从游戏物品名称列表中进行模糊搜索 - wmdr.RLock() - sol := fuzzy.FindNormalizedFold(ctx.State["args"].(string), wd.itemNames) - wmdr.RUnlock() + sol := fuzzy.FindNormalizedFold(ctx.State["args"].(string), wd.Get().itemNames) // 物品名称 var name string @@ -293,19 +296,17 @@ func init() { msgs = msgs[:0] } - sells, iteminfo, txt, err := getitemsorder(wd.wmitems[name].URLName, onlymaxrank) + sells, iteminfo, txt, err := getitemsorder(wd.Get().wmitems[name].URLName, onlymaxrank) if !onlymaxrank { - wmdr.RLock() if iteminfo.ZhHans.WikiLink == "" { msgs = append(msgs, ctxext.FakeSenderForwardNode(ctx, - message.Image("https://warframe.market/static/assets/"+wd.wmitems[name].Thumb), - message.Text("\n", wd.wmitems[name].ItemName))) + message.Image("https://warframe.market/static/assets/"+wd.Get().wmitems[name].Thumb), + message.Text("\n", wd.Get().wmitems[name].ItemName))) } else { msgs = append(msgs, ctxext.FakeSenderForwardNode(ctx, - message.Image("https://warframe.market/static/assets/"+wd.wmitems[name].Thumb), - message.Text("\n", wd.wmitems[name].ItemName, "\nwiki: ", iteminfo.ZhHans.WikiLink))) + message.Image("https://warframe.market/static/assets/"+wd.Get().wmitems[name].Thumb), + message.Text("\n", wd.Get().wmitems[name].ItemName, "\nwiki: ", iteminfo.ZhHans.WikiLink))) } - wmdr.RUnlock() } if err != nil {