mirror of
https://github.com/FloatTech/ZeroBot-Plugin.git
synced 2026-02-06 15:20:22 +00:00
feat(all): update to go1.24+
This commit is contained in:
186
plugin/ygocdb/ygocdb.go
Normal file
186
plugin/ygocdb/ygocdb.go
Normal file
@@ -0,0 +1,186 @@
|
||||
// Package ygocdb 游戏王卡查插件
|
||||
package ygocdb
|
||||
|
||||
import (
|
||||
"encoding/json"
|
||||
"net/url"
|
||||
"strconv"
|
||||
"strings"
|
||||
"time"
|
||||
|
||||
"github.com/FloatTech/floatbox/web"
|
||||
ctrl "github.com/FloatTech/zbpctrl"
|
||||
control "github.com/FloatTech/zbputils/control"
|
||||
zero "github.com/wdvxdr1123/ZeroBot"
|
||||
"github.com/wdvxdr1123/ZeroBot/message"
|
||||
)
|
||||
|
||||
const (
|
||||
serviceErr = "[ygocdb]error:"
|
||||
api = "https://ygocdb.com/api/v0/?search="
|
||||
picherf = "https://cdn.233.momobako.com/ygopro/pics/"
|
||||
)
|
||||
|
||||
type searchResult struct {
|
||||
Result []struct {
|
||||
Cid int `json:"cid"`
|
||||
ID int `json:"id"`
|
||||
CnName string `json:"cn_name"`
|
||||
// CnocgN string `json:"cnocg_n"` // 简中卡名
|
||||
JpName string `json:"jp_name"`
|
||||
EnName string `json:"en_name"`
|
||||
Text struct {
|
||||
Types string `json:"types"`
|
||||
Pdesc string `json:"pdesc"`
|
||||
Desc string `json:"desc"`
|
||||
} `json:"text"`
|
||||
} `json:"result"`
|
||||
}
|
||||
|
||||
func init() {
|
||||
en := control.AutoRegister(&ctrl.Options[*zero.Ctx]{
|
||||
DisableOnDefault: false,
|
||||
Brief: "游戏王百鸽API", // 本插件基于游戏王百鸽API"https://www.ygo-sem.cn/"
|
||||
Help: "- /ydp [xxx]\n" +
|
||||
"- /yds [xxx]\n" +
|
||||
"- /ydb [xxx]\n" +
|
||||
"[xxx]为搜索内容\np:返回一张图片\ns:返回一张效果描述\nb:全显示",
|
||||
})
|
||||
|
||||
en.OnRegex(`^/yd(p|s|b)\s?(.*)`).SetBlock(true).Handle(func(ctx *zero.Ctx) {
|
||||
function := ctx.State["regex_matched"].([]string)[1]
|
||||
ctxtext := ctx.State["regex_matched"].([]string)[2]
|
||||
if ctxtext == "" {
|
||||
ctx.SendChain(message.Text("你是想查询「空手假象」吗?"))
|
||||
return
|
||||
}
|
||||
data, err := web.GetData(api + url.QueryEscape(ctxtext))
|
||||
if err != nil {
|
||||
ctx.SendChain(message.Text(serviceErr, err))
|
||||
return
|
||||
}
|
||||
var result searchResult
|
||||
err = json.Unmarshal(data, &result)
|
||||
if err != nil {
|
||||
ctx.SendChain(message.Text(serviceErr, err))
|
||||
return
|
||||
}
|
||||
maxpage := len(result.Result)
|
||||
switch {
|
||||
case maxpage == 0:
|
||||
ctx.SendChain(message.Text("没有找到相关的卡片额"))
|
||||
return
|
||||
case function == "p":
|
||||
ctx.SendChain(message.Image(picherf + strconv.Itoa(result.Result[0].ID) + ".jpg"))
|
||||
return
|
||||
case function == "s":
|
||||
cardtextout := cardtext(result, 0)
|
||||
ctx.SendChain(message.Text(cardtextout))
|
||||
return
|
||||
case function == "d" && maxpage == 1:
|
||||
cardtextout := cardtext(result, 0)
|
||||
ctx.SendChain(message.Image(picherf+strconv.Itoa(result.Result[0].ID)+".jpg"), message.Text(cardtextout))
|
||||
return
|
||||
}
|
||||
var listName []string
|
||||
var listid []int
|
||||
for _, v := range result.Result {
|
||||
listName = append(listName, strconv.Itoa(len(listName))+"."+v.CnName)
|
||||
listid = append(listid, v.ID)
|
||||
}
|
||||
var (
|
||||
currentPage = 10
|
||||
nextpage = 0
|
||||
)
|
||||
if maxpage < 10 {
|
||||
currentPage = maxpage
|
||||
}
|
||||
ctx.SendChain(message.Text("找到", strconv.Itoa(maxpage), "张相关卡片,当前显示以下卡名:\n",
|
||||
strings.Join(listName[:currentPage], "\n"),
|
||||
"\n————————————\n输入对应数字获取卡片信息,",
|
||||
"\n或回复“取消”、“下一页”指令"))
|
||||
recv, cancel := zero.NewFutureEvent("message", 999, false, zero.RegexRule(`(取消)|(下一页)|\d+`), zero.OnlyGroup, zero.CheckUser(ctx.Event.UserID)).Repeat()
|
||||
after := time.NewTimer(20 * time.Second)
|
||||
for {
|
||||
select {
|
||||
case <-after.C:
|
||||
cancel()
|
||||
ctx.Send(
|
||||
message.ReplyWithMessage(ctx.Event.MessageID,
|
||||
message.Text("等待超时,搜索结束"),
|
||||
),
|
||||
)
|
||||
return
|
||||
case e := <-recv:
|
||||
nextcmd := e.Event.Message.String()
|
||||
switch nextcmd {
|
||||
case "取消":
|
||||
cancel()
|
||||
after.Stop()
|
||||
ctx.Send(
|
||||
message.ReplyWithMessage(ctx.Event.MessageID,
|
||||
message.Text("用户取消,搜索结束"),
|
||||
),
|
||||
)
|
||||
return
|
||||
case "下一页":
|
||||
after.Reset(20 * time.Second)
|
||||
if maxpage < 11 {
|
||||
continue
|
||||
}
|
||||
nextpage++
|
||||
if nextpage*10 >= maxpage {
|
||||
nextpage = 0
|
||||
currentPage = 10
|
||||
ctx.SendChain(message.Text("已是最后一页,返回到第一页"))
|
||||
} else if nextpage == maxpage/10 {
|
||||
currentPage = maxpage % 10
|
||||
}
|
||||
ctx.SendChain(message.Text("找到", strconv.Itoa(maxpage), "张相关卡片,当前显示以下卡名:\n",
|
||||
strings.Join(listName[nextpage*10:nextpage*10+currentPage], "\n"),
|
||||
"\n————————————————\n输入对应数字获取卡片信息,",
|
||||
"\n或回复“取消”、“下一页”指令"))
|
||||
default:
|
||||
cardint, err := strconv.Atoi(nextcmd)
|
||||
switch {
|
||||
case err != nil:
|
||||
after.Reset(20 * time.Second)
|
||||
ctx.SendChain(message.At(ctx.Event.UserID), message.Text("请输入正确的序号"))
|
||||
default:
|
||||
if cardint < nextpage*10+currentPage {
|
||||
cancel()
|
||||
after.Stop()
|
||||
cardtextout := cardtext(result, cardint)
|
||||
ctx.SendChain(message.Image(picherf+strconv.Itoa(listid[cardint])+".jpg"), message.Text(cardtextout))
|
||||
return
|
||||
}
|
||||
after.Reset(20 * time.Second)
|
||||
ctx.SendChain(message.At(ctx.Event.UserID), message.Text("请输入正确的序号"))
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
})
|
||||
}
|
||||
|
||||
func cardtext(list searchResult, cardid int) string {
|
||||
var cardtext []string
|
||||
cardtext = append(cardtext, "中文卡名:\n "+list.Result[cardid].CnName)
|
||||
if list.Result[cardid].JpName == "" {
|
||||
cardtext = append(cardtext, "英文卡名:\n "+list.Result[cardid].EnName)
|
||||
} else {
|
||||
cardtext = append(cardtext, "日文卡名:\n "+list.Result[cardid].JpName)
|
||||
}
|
||||
cardtext = append(cardtext, "卡片密码:"+strconv.Itoa(list.Result[cardid].ID))
|
||||
cardtext = append(cardtext, list.Result[cardid].Text.Types)
|
||||
if list.Result[cardid].Text.Pdesc != "" {
|
||||
cardtext = append(cardtext, "[灵摆效果]\n"+list.Result[cardid].Text.Pdesc)
|
||||
if strings.Contains(list.Result[cardid].Text.Types, "效果") {
|
||||
cardtext = append(cardtext, "[怪兽效果]")
|
||||
} else {
|
||||
cardtext = append(cardtext, "[怪兽描述]")
|
||||
}
|
||||
}
|
||||
cardtext = append(cardtext, list.Result[cardid].Text.Desc)
|
||||
return strings.Join(cardtext, "\n")
|
||||
}
|
||||
Reference in New Issue
Block a user