mirror of
https://github.com/FloatTech/ZeroBot-Plugin.git
synced 2025-12-19 13:59:39 +08:00
🎨 改进代码样式 (#569)
Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
This commit is contained in:
parent
faf00dfea7
commit
76e7f81a6c
@ -1,21 +1,22 @@
|
|||||||
package warframeapi
|
package warframeapi
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"github.com/davidscholberg/go-durationfmt"
|
|
||||||
"sync"
|
"sync"
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
|
"github.com/davidscholberg/go-durationfmt"
|
||||||
)
|
)
|
||||||
|
|
||||||
// 游戏时间模拟
|
// 游戏时间模拟
|
||||||
type gameTime struct {
|
type gameTime struct {
|
||||||
rwm sync.RWMutex
|
rwm sync.RWMutex
|
||||||
Name string `json:"name"` //时间名称
|
Name string `json:"name"` // 时间名称
|
||||||
NextTime time.Time `json:"time"` //下次更新时间
|
NextTime time.Time `json:"time"` // 下次更新时间
|
||||||
Status bool `json:"status"` //状态
|
Status bool `json:"status"` // 状态
|
||||||
StatusTrueDes string `json:"true_des"` //状态说明
|
StatusTrueDes string `json:"true_des"` // 状态说明
|
||||||
StatusFalseDes string `json:"false_des"` //状态说明
|
StatusFalseDes string `json:"false_des"` // 状态说明
|
||||||
DayTime int `json:"day"` //白天时长
|
DayTime int `json:"day"` // 白天时长
|
||||||
NightTime int `json:"night"` //夜间时长
|
NightTime int `json:"night"` // 夜间时长
|
||||||
}
|
}
|
||||||
|
|
||||||
var (
|
var (
|
||||||
@ -59,17 +60,17 @@ func loadTime(api wfAPI) {
|
|||||||
// timeDet游戏时间更新
|
// timeDet游戏时间更新
|
||||||
func timeDet() {
|
func timeDet() {
|
||||||
for _, v := range gameTimes {
|
for _, v := range gameTimes {
|
||||||
//当前时间对比下一次游戏状态更新时间,看看还剩多少秒
|
// 当前时间对比下一次游戏状态更新时间,看看还剩多少秒
|
||||||
nt := time.Until(v.NextTime).Seconds()
|
nt := time.Until(v.NextTime).Seconds()
|
||||||
//已经过了游戏时间状态更新时间
|
// 已经过了游戏时间状态更新时间
|
||||||
if nt < 0 {
|
if nt < 0 {
|
||||||
v.rwm.Lock()
|
v.rwm.Lock()
|
||||||
//更新游戏状态,如果是白天就切换到晚上,反之亦然
|
// 更新游戏状态,如果是白天就切换到晚上,反之亦然
|
||||||
if v.Status {
|
if v.Status {
|
||||||
//计算下次的晚上更新时间
|
// 计算下次的晚上更新时间
|
||||||
v.NextTime = v.NextTime.Add(time.Duration(v.NightTime) * time.Second)
|
v.NextTime = v.NextTime.Add(time.Duration(v.NightTime) * time.Second)
|
||||||
} else {
|
} else {
|
||||||
//计算下次的白天更新时间
|
// 计算下次的白天更新时间
|
||||||
v.NextTime = v.NextTime.Add(time.Duration(v.DayTime) * time.Second)
|
v.NextTime = v.NextTime.Add(time.Duration(v.DayTime) * time.Second)
|
||||||
}
|
}
|
||||||
v.rwm.Unlock()
|
v.rwm.Unlock()
|
||||||
|
|||||||
@ -4,6 +4,13 @@ package warframeapi
|
|||||||
import (
|
import (
|
||||||
"encoding/json"
|
"encoding/json"
|
||||||
"fmt"
|
"fmt"
|
||||||
|
"net/http"
|
||||||
|
"sort"
|
||||||
|
"strconv"
|
||||||
|
"strings"
|
||||||
|
"sync"
|
||||||
|
"time"
|
||||||
|
|
||||||
"github.com/FloatTech/floatbox/binary"
|
"github.com/FloatTech/floatbox/binary"
|
||||||
"github.com/FloatTech/floatbox/web"
|
"github.com/FloatTech/floatbox/web"
|
||||||
ctrl "github.com/FloatTech/zbpctrl"
|
ctrl "github.com/FloatTech/zbpctrl"
|
||||||
@ -12,28 +19,22 @@ import (
|
|||||||
"github.com/lithammer/fuzzysearch/fuzzy"
|
"github.com/lithammer/fuzzysearch/fuzzy"
|
||||||
zero "github.com/wdvxdr1123/ZeroBot"
|
zero "github.com/wdvxdr1123/ZeroBot"
|
||||||
"github.com/wdvxdr1123/ZeroBot/message"
|
"github.com/wdvxdr1123/ZeroBot/message"
|
||||||
"net/http"
|
|
||||||
"sort"
|
|
||||||
"strconv"
|
|
||||||
"strings"
|
|
||||||
"sync"
|
|
||||||
"time"
|
|
||||||
)
|
)
|
||||||
|
|
||||||
var (
|
var (
|
||||||
wmitems map[string]items //WarFrame市场的中文名称对应的物品的字典
|
wmitems map[string]items // WarFrame市场的中文名称对应的物品的字典
|
||||||
itmeNames []string //物品名称列表
|
itmeNames []string // 物品名称列表
|
||||||
rt runtime
|
rt runtime
|
||||||
)
|
)
|
||||||
|
|
||||||
// 时间同步状态
|
// 时间同步状态
|
||||||
type runtime struct {
|
type runtime struct {
|
||||||
rwm sync.RWMutex
|
rwm sync.RWMutex
|
||||||
enable bool //是否启动
|
enable bool // 是否启动
|
||||||
}
|
}
|
||||||
|
|
||||||
const wfapiurl = "https://api.warframestat.us/pc" //星际战甲API
|
const wfapiurl = "https://api.warframestat.us/pc" // 星际战甲API
|
||||||
const wfitemurl = "https://api.warframe.market/v1/items" //星际战甲游戏品信息列表URL
|
const wfitemurl = "https://api.warframe.market/v1/items" // 星际战甲游戏品信息列表URL
|
||||||
|
|
||||||
func init() {
|
func init() {
|
||||||
eng := control.Register("warframeapi", &ctrl.Options[*zero.Ctx]{
|
eng := control.Register("warframeapi", &ctrl.Options[*zero.Ctx]{
|
||||||
@ -49,10 +50,10 @@ func init() {
|
|||||||
})
|
})
|
||||||
updateWM()
|
updateWM()
|
||||||
|
|
||||||
//获取具体的平原时间,在触发后,会启动持续时间按5分钟的时间更新模拟,以此处理短时间内请求时,时间不会变化的问题
|
// 获取具体的平原时间,在触发后,会启动持续时间按5分钟的时间更新模拟,以此处理短时间内请求时,时间不会变化的问题
|
||||||
eng.OnSuffix("平原时间").SetBlock(true).
|
eng.OnSuffix("平原时间").SetBlock(true).
|
||||||
Handle(func(ctx *zero.Ctx) {
|
Handle(func(ctx *zero.Ctx) {
|
||||||
if !rt.enable { //没有进行同步,就拉取一次服务器状态
|
if !rt.enable { // 没有进行同步,就拉取一次服务器状态
|
||||||
wfapi, err := wfapiGetData()
|
wfapi, err := wfapiGetData()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
ctx.SendChain(message.Text("Error:获取服务器时间失败"))
|
ctx.SendChain(message.Text("Error:获取服务器时间失败"))
|
||||||
@ -73,24 +74,23 @@ func init() {
|
|||||||
if !rt.enable {
|
if !rt.enable {
|
||||||
// 设置标志位
|
// 设置标志位
|
||||||
rt.rwm.Lock()
|
rt.rwm.Lock()
|
||||||
if rt.enable { //预检测,防止其他线程同时进来
|
if rt.enable { // 预检测,防止其他线程同时进来
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
rt.enable = true
|
rt.enable = true
|
||||||
rt.rwm.Unlock()
|
rt.rwm.Unlock()
|
||||||
|
|
||||||
go func() {
|
go func() {
|
||||||
//30*10=300=5分钟
|
// 30*10=300=5分钟
|
||||||
for i := 0; i < 30; i++ {
|
for i := 0; i < 30; i++ {
|
||||||
time.Sleep(10 * time.Second)
|
time.Sleep(10 * time.Second)
|
||||||
timeDet() //5分钟内每隔10秒更新一下时间
|
timeDet() // 5分钟内每隔10秒更新一下时间
|
||||||
}
|
}
|
||||||
//5分钟时间同步结束
|
// 5分钟时间同步结束
|
||||||
rt.rwm.Lock()
|
rt.rwm.Lock()
|
||||||
rt.enable = false
|
rt.enable = false
|
||||||
rt.rwm.Unlock()
|
rt.rwm.Unlock()
|
||||||
}()
|
}()
|
||||||
|
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
eng.OnFullMatch("警报").SetBlock(true).
|
eng.OnFullMatch("警报").SetBlock(true).
|
||||||
@ -100,11 +100,11 @@ func init() {
|
|||||||
ctx.SendChain(message.Text("ERROR:", err.Error()))
|
ctx.SendChain(message.Text("ERROR:", err.Error()))
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
//如果返回的wfapi中,警报数量>0
|
// 如果返回的wfapi中,警报数量>0
|
||||||
if len(wfapi.Alerts) > 0 {
|
if len(wfapi.Alerts) > 0 {
|
||||||
//遍历警报数据,打印警报信息
|
// 遍历警报数据,打印警报信息
|
||||||
for _, v := range wfapi.Alerts {
|
for _, v := range wfapi.Alerts {
|
||||||
//如果警报处于激活状态
|
// 如果警报处于激活状态
|
||||||
if v.Active {
|
if v.Active {
|
||||||
ctx.SendChain(stringArrayToImage([]string{
|
ctx.SendChain(stringArrayToImage([]string{
|
||||||
"节点:" + v.Mission.Node,
|
"节点:" + v.Mission.Node,
|
||||||
@ -113,14 +113,12 @@ func init() {
|
|||||||
"奖励:" + v.Mission.Reward.AsString,
|
"奖励:" + v.Mission.Reward.AsString,
|
||||||
"剩余时间:" + v.Eta,
|
"剩余时间:" + v.Eta,
|
||||||
}))
|
}))
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
})
|
})
|
||||||
//TODO:订阅功能-等待重做
|
//TODO:订阅功能-等待重做
|
||||||
//eng.OnRegex(`^(订阅|取消订阅)(.*)平原(.*)$`).SetBlock(true).
|
// eng.OnRegex(`^(订阅|取消订阅)(.*)平原(.*)$`).SetBlock(true).
|
||||||
// Handle(func(ctx *zero.Ctx) {
|
// Handle(func(ctx *zero.Ctx) {
|
||||||
// args := ctx.State["regex_matched"].([]string)
|
// args := ctx.State["regex_matched"].([]string)
|
||||||
// var isEnable bool
|
// var isEnable bool
|
||||||
@ -207,7 +205,7 @@ func init() {
|
|||||||
//})
|
//})
|
||||||
eng.OnFullMatch("仲裁").SetBlock(true).
|
eng.OnFullMatch("仲裁").SetBlock(true).
|
||||||
Handle(func(ctx *zero.Ctx) {
|
Handle(func(ctx *zero.Ctx) {
|
||||||
//通过wfapi获取仲裁信息
|
// 通过wfapi获取仲裁信息
|
||||||
wfapi, err := wfapiGetData()
|
wfapi, err := wfapiGetData()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
ctx.SendChain(message.Text("ERROR:", err.Error()))
|
ctx.SendChain(message.Text("ERROR:", err.Error()))
|
||||||
@ -264,21 +262,21 @@ func init() {
|
|||||||
// 根据名称从Warframe市场查询物品售价
|
// 根据名称从Warframe市场查询物品售价
|
||||||
eng.OnPrefix(".wm ").SetBlock(true).
|
eng.OnPrefix(".wm ").SetBlock(true).
|
||||||
Handle(func(ctx *zero.Ctx) {
|
Handle(func(ctx *zero.Ctx) {
|
||||||
//根据输入的名称,从游戏物品名称列表中进行模糊搜索
|
// 根据输入的名称,从游戏物品名称列表中进行模糊搜索
|
||||||
sol := fuzzy.FindNormalizedFold(ctx.State["args"].(string), itmeNames)
|
sol := fuzzy.FindNormalizedFold(ctx.State["args"].(string), itmeNames)
|
||||||
var msg []string
|
var msg []string
|
||||||
//物品名称
|
// 物品名称
|
||||||
var name string
|
var name string
|
||||||
|
|
||||||
//根据搜搜结果,打印找到的物品
|
// 根据搜搜结果,打印找到的物品
|
||||||
switch len(sol) {
|
switch len(sol) {
|
||||||
case 0: //没有搜索到任何东西
|
case 0: // 没有搜索到任何东西
|
||||||
ctx.SendChain(message.Text("无法查询到该物品"))
|
ctx.SendChain(message.Text("无法查询到该物品"))
|
||||||
return
|
return
|
||||||
case 1: //如果只搜索到了一个
|
case 1: // 如果只搜索到了一个
|
||||||
name = sol[0]
|
name = sol[0]
|
||||||
default: //如果搜搜到了多个
|
default: // 如果搜搜到了多个
|
||||||
//遍历搜索结果,并打印为图片展出
|
// 遍历搜索结果,并打印为图片展出
|
||||||
for i, v := range sol {
|
for i, v := range sol {
|
||||||
msg = append(msg, fmt.Sprintf("[%d] %s", i, v))
|
msg = append(msg, fmt.Sprintf("[%d] %s", i, v))
|
||||||
}
|
}
|
||||||
@ -387,21 +385,21 @@ func itemNameFutureEvent(ctx *zero.Ctx, count int) int {
|
|||||||
next := zero.NewFutureEvent("message", 999, false, ctx.CheckSession()).Next()
|
next := zero.NewFutureEvent("message", 999, false, ctx.CheckSession()).Next()
|
||||||
select {
|
select {
|
||||||
case <-time.After(time.Second * 15):
|
case <-time.After(time.Second * 15):
|
||||||
//超时15秒处理
|
// 超时15秒处理
|
||||||
ctx.SendChain(message.Text("会话已超时!"))
|
ctx.SendChain(message.Text("会话已超时!"))
|
||||||
return -1
|
return -1
|
||||||
case e := <-next:
|
case e := <-next:
|
||||||
msg := e.Event.Message.ExtractPlainText()
|
msg := e.Event.Message.ExtractPlainText()
|
||||||
//输入c主动结束的处理
|
// 输入c主动结束的处理
|
||||||
if msg == "c" {
|
if msg == "c" {
|
||||||
ctx.SendChain(message.Text("会话已结束!"))
|
ctx.SendChain(message.Text("会话已结束!"))
|
||||||
return -1
|
return -1
|
||||||
}
|
}
|
||||||
//尝试对输入进行数字转换
|
// 尝试对输入进行数字转换
|
||||||
num, err := strconv.Atoi(msg)
|
num, err := strconv.Atoi(msg)
|
||||||
//如果出错,说明输入的并非数字,则重新触发该内容
|
// 如果出错,说明输入的并非数字,则重新触发该内容
|
||||||
if err != nil {
|
if err != nil {
|
||||||
//查看是否超时
|
// 查看是否超时
|
||||||
if count == 0 {
|
if count == 0 {
|
||||||
ctx.SendChain(message.Text("连续输入错误,会话已结束!"))
|
ctx.SendChain(message.Text("连续输入错误,会话已结束!"))
|
||||||
return -1
|
return -1
|
||||||
@ -409,7 +407,6 @@ func itemNameFutureEvent(ctx *zero.Ctx, count int) int {
|
|||||||
ctx.SendChain(message.Text("请输入数字!(输入c结束会话)[", count, "]"))
|
ctx.SendChain(message.Text("请输入数字!(输入c结束会话)[", count, "]"))
|
||||||
count--
|
count--
|
||||||
return itemNameFutureEvent(ctx, count)
|
return itemNameFutureEvent(ctx, count)
|
||||||
|
|
||||||
}
|
}
|
||||||
return num
|
return num
|
||||||
}
|
}
|
||||||
@ -426,7 +423,7 @@ func stringArrayToImage(texts []string) message.MessageSegment {
|
|||||||
|
|
||||||
// 从WFapi获取数据
|
// 从WFapi获取数据
|
||||||
func wfapiGetData() (wfAPI, error) {
|
func wfapiGetData() (wfAPI, error) {
|
||||||
var wfapi wfAPI //WarFrameAPI的数据实例
|
var wfapi wfAPI // WarFrameAPI的数据实例
|
||||||
var data []byte
|
var data []byte
|
||||||
var err error
|
var err error
|
||||||
data, err = web.GetData(wfapiurl)
|
data, err = web.GetData(wfapiurl)
|
||||||
@ -442,7 +439,7 @@ func wfapiGetData() (wfAPI, error) {
|
|||||||
|
|
||||||
// 从WF市场获取物品数据信息
|
// 从WF市场获取物品数据信息
|
||||||
func updateWM() {
|
func updateWM() {
|
||||||
var itmeapi wfAPIItem //WarFrame市场的数据实例
|
var itmeapi wfAPIItem // WarFrame市场的数据实例
|
||||||
|
|
||||||
data, err := web.RequestDataWithHeaders(&http.Client{}, wfitemurl, "GET", func(request *http.Request) error {
|
data, err := web.RequestDataWithHeaders(&http.Client{}, wfitemurl, "GET", func(request *http.Request) error {
|
||||||
request.Header.Add("Accept", "application/json")
|
request.Header.Add("Accept", "application/json")
|
||||||
@ -461,7 +458,6 @@ func updateWM() {
|
|||||||
|
|
||||||
// 获取Warframe市场的售价表,并进行排序,cn_name为物品中文名称,onlyMaxRank表示只取最高等级的物品,返回物品售价表,物品信息,物品英文
|
// 获取Warframe市场的售价表,并进行排序,cn_name为物品中文名称,onlyMaxRank表示只取最高等级的物品,返回物品售价表,物品信息,物品英文
|
||||||
func wmItemOrders(cnName string, onlyMaxRank bool) (orders, itemsInSet, string, error) {
|
func wmItemOrders(cnName string, onlyMaxRank bool) (orders, itemsInSet, string, error) {
|
||||||
|
|
||||||
var wfapiio wfAPIItemsOrders
|
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 {
|
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("Accept", "application/json")
|
||||||
@ -473,22 +469,21 @@ func wmItemOrders(cnName string, onlyMaxRank bool) (orders, itemsInSet, string,
|
|||||||
}
|
}
|
||||||
err = json.Unmarshal(data, &wfapiio)
|
err = json.Unmarshal(data, &wfapiio)
|
||||||
var sellOrders orders
|
var sellOrders orders
|
||||||
//遍历市场物品列表
|
// 遍历市场物品列表
|
||||||
for _, v := range wfapiio.Payload.Orders {
|
for _, v := range wfapiio.Payload.Orders {
|
||||||
//取其中类型为售卖,且去掉不在线的玩家
|
// 取其中类型为售卖,且去掉不在线的玩家
|
||||||
if v.OrderType == "sell" && v.User.Status != "offline" {
|
if v.OrderType == "sell" && v.User.Status != "offline" {
|
||||||
//如果需要满级报价
|
// 如果需要满级报价
|
||||||
if onlyMaxRank && v.ModRank == wfapiio.Include.Item.ItemsInSet[0].ModMaxRank {
|
if onlyMaxRank && v.ModRank == wfapiio.Include.Item.ItemsInSet[0].ModMaxRank {
|
||||||
sellOrders = append(sellOrders, v)
|
sellOrders = append(sellOrders, v)
|
||||||
} else if !onlyMaxRank {
|
} else if !onlyMaxRank {
|
||||||
sellOrders = append(sellOrders, v)
|
sellOrders = append(sellOrders, v)
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
//对报价表进行排序,由低到高
|
// 对报价表进行排序,由低到高
|
||||||
sort.Sort(sellOrders)
|
sort.Sort(sellOrders)
|
||||||
//获取物品信息
|
// 获取物品信息
|
||||||
for i, v := range wfapiio.Include.Item.ItemsInSet {
|
for i, v := range wfapiio.Include.Item.ItemsInSet {
|
||||||
if v.URLName == cnName {
|
if v.URLName == cnName {
|
||||||
return sellOrders, wfapiio.Include.Item.ItemsInSet[i], wfapiio.Include.Item.ItemsInSet[i].En.ItemName, err
|
return sellOrders, wfapiio.Include.Item.ItemsInSet[i], wfapiio.Include.Item.ItemsInSet[i].En.ItemName, err
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user