|
| 1 | +// Package ygo 一些关于ygo的插件 |
| 2 | +package ygo |
| 3 | + |
| 4 | +import ( |
| 5 | + "net/url" |
| 6 | + "strconv" |
| 7 | + "strings" |
| 8 | + "time" |
| 9 | + |
| 10 | + "encoding/json" |
| 11 | + |
| 12 | + "github.com/FloatTech/floatbox/web" |
| 13 | + ctrl "github.com/FloatTech/zbpctrl" |
| 14 | + control "github.com/FloatTech/zbputils/control" |
| 15 | + zero "github.com/wdvxdr1123/ZeroBot" |
| 16 | + "github.com/wdvxdr1123/ZeroBot/message" |
| 17 | +) |
| 18 | + |
| 19 | +const ( |
| 20 | + serviceErr = "[ygocdb]error:" |
| 21 | + api = "https://ygocdb.com/api/v0/?search=" |
| 22 | + picherf = "https://cdn.233.momobako.com/ygopro/pics/" |
| 23 | +) |
| 24 | + |
| 25 | +type searchResult struct { |
| 26 | + Result []struct { |
| 27 | + Cid int `json:"cid"` |
| 28 | + ID int `json:"id"` |
| 29 | + CnName string `json:"cn_name"` |
| 30 | + // CnocgN string `json:"cnocg_n"` // 简中卡名 |
| 31 | + JpName string `json:"jp_name"` |
| 32 | + EnName string `json:"en_name"` |
| 33 | + Text struct { |
| 34 | + Types string `json:"types"` |
| 35 | + Pdesc string `json:"pdesc"` |
| 36 | + Desc string `json:"desc"` |
| 37 | + } `json:"text"` |
| 38 | + } `json:"result"` |
| 39 | +} |
| 40 | + |
| 41 | +func init() { |
| 42 | + en := control.Register("ygocdb", &ctrl.Options[*zero.Ctx]{ |
| 43 | + DisableOnDefault: false, |
| 44 | + Brief: "游戏王百鸽API",// 本插件基于游戏王百鸽API"https://www.ygo-sem.cn/" |
| 45 | + Help: "- /ydp [xxx]\n" + |
| 46 | + "- /yds [xxx]\n" + |
| 47 | + "- /ydb [xxx]\n" + |
| 48 | + "[xxx]为搜索内容\np:返回一张图片\ns:返回一张效果描述\nb:全显示", |
| 49 | + }) |
| 50 | + |
| 51 | + en.OnRegex(`^/yd(p|s|b)\s?(.*)`).SetBlock(true).Handle(func(ctx *zero.Ctx) { |
| 52 | + function := ctx.State["regex_matched"].([]string)[1] |
| 53 | + ctxtext := ctx.State["regex_matched"].([]string)[2] |
| 54 | + if ctxtext == "" { |
| 55 | + ctx.SendChain(message.Text("你是想查询「空手假象」吗?")) |
| 56 | + return |
| 57 | + } |
| 58 | + data, err := web.GetData(api + url.QueryEscape(ctxtext)) |
| 59 | + if err != nil { |
| 60 | + ctx.SendChain(message.Text(serviceErr, err)) |
| 61 | + return |
| 62 | + } |
| 63 | + var result searchResult |
| 64 | + err = json.Unmarshal(data, &result) |
| 65 | + if err != nil { |
| 66 | + ctx.SendChain(message.Text(serviceErr, err)) |
| 67 | + return |
| 68 | + } |
| 69 | + maxpage := len(result.Result) |
| 70 | + switch { |
| 71 | + case maxpage == 0: |
| 72 | + ctx.SendChain(message.Text("没有找到相关的卡片额")) |
| 73 | + return |
| 74 | + case function == "p": |
| 75 | + ctx.SendChain(message.Image(picherf + strconv.Itoa(result.Result[0].ID) + ".jpg")) |
| 76 | + return |
| 77 | + case function == "s": |
| 78 | + cardtextout := cardtext(result, 0) |
| 79 | + ctx.SendChain(message.Text(cardtextout)) |
| 80 | + return |
| 81 | + case function == "d" && maxpage == 1: |
| 82 | + cardtextout := cardtext(result, 0) |
| 83 | + ctx.SendChain(message.Image(picherf+strconv.Itoa(result.Result[0].ID)+".jpg"), message.Text(cardtextout)) |
| 84 | + return |
| 85 | + } |
| 86 | + var listName []string |
| 87 | + var listid []int |
| 88 | + for _, v := range result.Result { |
| 89 | + listName = append(listName, strconv.Itoa(len(listName))+"."+v.CnName) |
| 90 | + listid = append(listid, v.ID) |
| 91 | + } |
| 92 | + var ( |
| 93 | + currentPage = 10 |
| 94 | + nextpage = 0 |
| 95 | + ) |
| 96 | + if maxpage < 10 { |
| 97 | + currentPage = maxpage |
| 98 | + } |
| 99 | + ctx.SendChain(message.Text("找到", strconv.Itoa(maxpage), "张相关卡片,当前显示以下卡名:\n", |
| 100 | + strings.Join(listName[:currentPage], "\n"), |
| 101 | + "\n————————————\n输入对应数字获取卡片信息,", |
| 102 | + "\n或回复“取消”、“下一页”指令")) |
| 103 | + recv, cancel := zero.NewFutureEvent("message", 999, false, zero.RegexRule(`(取消)|(下一页)|\d+`), zero.OnlyGroup, zero.CheckUser(ctx.Event.UserID)).Repeat() |
| 104 | + after := time.NewTimer(20 * time.Second) |
| 105 | + for { |
| 106 | + select { |
| 107 | + case <-after.C: |
| 108 | + cancel() |
| 109 | + ctx.Send( |
| 110 | + message.ReplyWithMessage(ctx.Event.MessageID, |
| 111 | + message.Text("等待超时,搜索结束"), |
| 112 | + ), |
| 113 | + ) |
| 114 | + return |
| 115 | + case e := <-recv: |
| 116 | + nextcmd := e.Event.Message.String() |
| 117 | + switch nextcmd { |
| 118 | + case "取消": |
| 119 | + cancel() |
| 120 | + after.Stop() |
| 121 | + ctx.Send( |
| 122 | + message.ReplyWithMessage(ctx.Event.MessageID, |
| 123 | + message.Text("用户取消,搜索结束"), |
| 124 | + ), |
| 125 | + ) |
| 126 | + return |
| 127 | + case "下一页": |
| 128 | + after.Reset(20 * time.Second) |
| 129 | + if maxpage < 11 { |
| 130 | + continue |
| 131 | + } |
| 132 | + nextpage++ |
| 133 | + if nextpage*10 >= maxpage { |
| 134 | + nextpage = 0 |
| 135 | + currentPage = 10 |
| 136 | + ctx.SendChain(message.Text("已是最后一页,返回到第一页")) |
| 137 | + } else if nextpage == maxpage/10 { |
| 138 | + currentPage = maxpage % 10 |
| 139 | + } |
| 140 | + ctx.SendChain(message.Text("找到", strconv.Itoa(maxpage), "张相关卡片,当前显示以下卡名:\n", |
| 141 | + strings.Join(listName[nextpage*10:nextpage*10+currentPage], "\n"), |
| 142 | + "\n————————————————\n输入对应数字获取卡片信息,", |
| 143 | + "\n或回复“取消”、“下一页”指令")) |
| 144 | + default: |
| 145 | + cardint, err := strconv.Atoi(nextcmd) |
| 146 | + switch { |
| 147 | + case err != nil: |
| 148 | + after.Reset(20 * time.Second) |
| 149 | + ctx.SendChain(message.At(ctx.Event.UserID), message.Text("请输入正确的序号")) |
| 150 | + default: |
| 151 | + if cardint < nextpage*10+currentPage { |
| 152 | + cancel() |
| 153 | + after.Stop() |
| 154 | + cardtextout := cardtext(result, cardint) |
| 155 | + ctx.SendChain(message.Image(picherf+strconv.Itoa(listid[cardint])+".jpg"), message.Text(cardtextout)) |
| 156 | + return |
| 157 | + } |
| 158 | + after.Reset(20 * time.Second) |
| 159 | + ctx.SendChain(message.At(ctx.Event.UserID), message.Text("请输入正确的序号")) |
| 160 | + } |
| 161 | + } |
| 162 | + } |
| 163 | + } |
| 164 | + }) |
| 165 | +} |
| 166 | + |
| 167 | +func cardtext(list searchResult, cardid int) string { |
| 168 | + var cardtext []string |
| 169 | + cardtext = append(cardtext, "中文卡名:\n "+list.Result[cardid].CnName) |
| 170 | + if list.Result[cardid].JpName == "" { |
| 171 | + cardtext = append(cardtext, "英文卡名:\n "+list.Result[cardid].EnName) |
| 172 | + } else { |
| 173 | + cardtext = append(cardtext, "日文卡名:\n "+list.Result[cardid].JpName) |
| 174 | + } |
| 175 | + cardtext = append(cardtext, "卡片密码:"+strconv.Itoa(list.Result[cardid].ID)) |
| 176 | + cardtext = append(cardtext, list.Result[cardid].Text.Types) |
| 177 | + if list.Result[cardid].Text.Pdesc != "" { |
| 178 | + cardtext = append(cardtext, "[灵摆效果]\n"+list.Result[cardid].Text.Pdesc) |
| 179 | + if strings.Contains(list.Result[cardid].Text.Types, "效果") { |
| 180 | + cardtext = append(cardtext, "[怪兽效果]") |
| 181 | + } else { |
| 182 | + cardtext = append(cardtext, "[怪兽描述]") |
| 183 | + } |
| 184 | + } |
| 185 | + cardtext = append(cardtext, list.Result[cardid].Text.Desc) |
| 186 | + return strings.Join(cardtext, "\n") |
| 187 | +} |
0 commit comments