UNPKG

koishi-plugin-sve-helper

Version:

Unofficial card search plugin for Shadowverse Evolve (SVE) based on sve-helper and Koishi.

282 lines (277 loc) 11.9 kB
var __defProp = Object.defineProperty; var __getOwnPropDesc = Object.getOwnPropertyDescriptor; var __getOwnPropNames = Object.getOwnPropertyNames; var __hasOwnProp = Object.prototype.hasOwnProperty; var __name = (target, value) => __defProp(target, "name", { value, configurable: true }); var __export = (target, all) => { for (var name2 in all) __defProp(target, name2, { get: all[name2], enumerable: true }); }; var __copyProps = (to, from, except, desc) => { if (from && typeof from === "object" || typeof from === "function") { for (let key of __getOwnPropNames(from)) if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); } return to; }; var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); // src/index.ts var src_exports = {}; __export(src_exports, { Config: () => Config, apply: () => apply, name: () => name }); module.exports = __toCommonJS(src_exports); var import_koishi = require("koishi"); // src/types/enums.ts var SVEAbilityName = /* @__PURE__ */ ((SVEAbilityName2) => { SVEAbilityName2[SVEAbilityName2["入场曲"] = 0] = "入场曲"; SVEAbilityName2[SVEAbilityName2["谢幕曲"] = 1] = "谢幕曲"; SVEAbilityName2[SVEAbilityName2["启动"] = 2] = "启动"; SVEAbilityName2[SVEAbilityName2["进化"] = 3] = "进化"; SVEAbilityName2[SVEAbilityName2["进化时"] = 4] = "进化时"; SVEAbilityName2[SVEAbilityName2["疾驰"] = 5] = "疾驰"; SVEAbilityName2[SVEAbilityName2["突进"] = 6] = "突进"; SVEAbilityName2[SVEAbilityName2["守护"] = 7] = "守护"; SVEAbilityName2[SVEAbilityName2["吸血"] = 8] = "吸血"; SVEAbilityName2[SVEAbilityName2["必杀"] = 9] = "必杀"; SVEAbilityName2[SVEAbilityName2["真红"] = 10] = "真红"; SVEAbilityName2[SVEAbilityName2["觉醒"] = 11] = "觉醒"; SVEAbilityName2[SVEAbilityName2["指定攻击"] = 12] = "指定攻击"; SVEAbilityName2[SVEAbilityName2["威压"] = 13] = "威压"; SVEAbilityName2[SVEAbilityName2["灵气"] = 14] = "灵气"; SVEAbilityName2[SVEAbilityName2["死灵充能"] = 15] = "死灵充能"; SVEAbilityName2[SVEAbilityName2["魔力连锁"] = 16] = "魔力连锁"; SVEAbilityName2[SVEAbilityName2["快速"] = 17] = "快速"; SVEAbilityName2[SVEAbilityName2["积蓄"] = 18] = "积蓄"; SVEAbilityName2[SVEAbilityName2["土之秘术"] = 19] = "土之秘术"; return SVEAbilityName2; })(SVEAbilityName || {}); var SVECardTypeName = /* @__PURE__ */ ((SVECardTypeName2) => { SVECardTypeName2["Follower"] = "Follower"; SVECardTypeName2["从者"] = "Follower"; SVECardTypeName2["FollowerEvo"] = "FollowerEvo"; SVECardTypeName2["从者·进化"] = "FollowerEvo"; SVECardTypeName2["进化"] = "FollowerEvo"; SVECardTypeName2["FollowerAdv"] = "FollowerAdv"; SVECardTypeName2["从者·Advance"] = "FollowerAdv"; SVECardTypeName2["Advance"] = "FollowerAdv"; SVECardTypeName2["Spell"] = "Spell"; SVECardTypeName2["法术"] = "Spell"; SVECardTypeName2["SpellEvo"] = "SpellEvo"; SVECardTypeName2["法术·进化"] = "SpellEvo"; SVECardTypeName2["法术进化"] = "SpellEvo"; SVECardTypeName2["SpellAdv"] = "SpellAdv"; SVECardTypeName2["法术·Advance"] = "SpellAdv"; SVECardTypeName2["法术Advance"] = "SpellAdv"; SVECardTypeName2["Amulet"] = "Amulet"; SVECardTypeName2["护符"] = "Amulet"; SVECardTypeName2["AmuletEvo"] = "AmuletEvo"; SVECardTypeName2["护符·进化"] = "AmuletEvo"; SVECardTypeName2["护符进化"] = "AmuletEvo"; SVECardTypeName2["AmuletAdv"] = "AmuletAdv"; SVECardTypeName2["护符·Advance"] = "AmuletAdv"; SVECardTypeName2["护符Advance"] = "AmuletAdv"; SVECardTypeName2["Leader"] = "Leader"; SVECardTypeName2["主战者"] = "Leader"; SVECardTypeName2["FollowerToken"] = "FollowerToken"; SVECardTypeName2["从者·Token"] = "FollowerToken"; SVECardTypeName2["从者Token"] = "FollowerToken"; SVECardTypeName2["SpellToken"] = "SpellToken"; SVECardTypeName2["法术·Token"] = "SpellToken"; SVECardTypeName2["法术Token"] = "SpellToken"; SVECardTypeName2["AmuletToken"] = "AmuletToken"; SVECardTypeName2["护符·Token"] = "AmuletToken"; SVECardTypeName2["护符Token"] = "AmuletToken"; SVECardTypeName2["Other"] = "Other"; SVECardTypeName2["其他"] = "Other"; SVECardTypeName2["follower"] = "Follower"; SVECardTypeName2["followerevo"] = "FollowerEvo"; SVECardTypeName2["followeradv"] = "FollowerAdv"; SVECardTypeName2["spell"] = "Spell"; SVECardTypeName2["spellevo"] = "SpellEvo"; SVECardTypeName2["spelladv"] = "SpellAdv"; SVECardTypeName2["amulet"] = "Amulet"; SVECardTypeName2["amuletevo"] = "AmuletEvo"; SVECardTypeName2["amuletadv"] = "AmuletAdv"; SVECardTypeName2["leader"] = "Leader"; SVECardTypeName2["followertoken"] = "FollowerToken"; SVECardTypeName2["spelltoken"] = "SpellToken"; SVECardTypeName2["amulettoken"] = "AmuletToken"; SVECardTypeName2["other"] = "Other"; return SVECardTypeName2; })(SVECardTypeName || {}); var SVECraftName = /* @__PURE__ */ ((SVECraftName2) => { SVECraftName2["Forest"] = "Forest"; SVECraftName2["精灵"] = "Forest"; SVECraftName2["妖"] = "Forest"; SVECraftName2["Sword"] = "Sword"; SVECraftName2["皇家"] = "Sword"; SVECraftName2["皇"] = "Sword"; SVECraftName2["Rune"] = "Rune"; SVECraftName2["巫师"] = "Rune"; SVECraftName2["法"] = "Rune"; SVECraftName2["Dragon"] = "Dragon"; SVECraftName2["龙族"] = "Dragon"; SVECraftName2["龙"] = "Dragon"; SVECraftName2["Nightmare"] = "Nightmare"; SVECraftName2["梦魇"] = "Nightmare"; SVECraftName2["梦"] = "Nightmare"; SVECraftName2["Haven"] = "Haven"; SVECraftName2["主教"] = "Haven"; SVECraftName2["教"] = "Haven"; SVECraftName2["Neutral"] = "Neutral"; SVECraftName2["中立"] = "Neutral"; SVECraftName2["forest"] = "Forest"; SVECraftName2["sword"] = "Sword"; SVECraftName2["rune"] = "Rune"; SVECraftName2["dragon"] = "Dragon"; SVECraftName2["nightmare"] = "Nightmare"; SVECraftName2["haven"] = "Haven"; SVECraftName2["neutral"] = "Neutral"; return SVECraftName2; })(SVECraftName || {}); // package.json var version = "1.0.1"; var homepage = "https://github.com/manipEgo/koishi-plugin-sve-helper"; // src/index.ts var developer = "manipEgo"; var appName = "koishi-plugin-sve-helper"; var userAgent = `${developer}/${appName}/${version} (${homepage})`; var name = "sve-helper"; var Config = import_koishi.Schema.object({}); var sveHelperUrl = "https://www.svehelperwin.com"; var raceUrl = sveHelperUrl + "/api/race/getAll"; var queryUrl = sveHelperUrl + "/api/card/getCardList"; var backCardUrl = sveHelperUrl + "/api/backCard/getCardByCardNo"; var imgUrl = "https://shadowverse-evolve.com/wordpress/wp-content/images/cardlist"; function parseCardImagePath(card) { let imgName = `${card.card_no}`; if (!card.from.startsWith("SD")) { imgName = imgName.toLowerCase(); } if (["BP01", "BP02", "SD"].includes(card.from)) { imgName = `${imgName.replace("-", "_")}`; } if (["bp03-u03", "bp03-u04", "bp03-u06"].includes(imgName)) { imgName = `${imgName}-2`; } imgName = imgName === "cp01-p33" ? "cp01-p330" : imgName === "etd01-002" ? "etd01-002%20" : imgName === "cp03-124" ? "cp03-124re" : imgName === "cp03-004" ? "cp03-004re" : imgName; if (card.has_back !== 0) { if (imgName.startsWith("bp08")) { imgName = `${imgName}_${card.has_back === -1 ? "back" : "front"}`; } else { imgName = `${imgName}${card.has_back === -1 ? "_ura" : ""}`; } } return `${imgUrl}/${card.from}/${imgName}.png`; } __name(parseCardImagePath, "parseCardImagePath"); async function findBackCards(ctx, cards) { return new Promise(async (resolve) => { let backCards = []; for (let i = 0; i < cards.length; i++) { if (cards[i].has_back) { const res = await ctx.http.post( backCardUrl, { card_no: cards[i].card_no }, { "headers": { "User-Agent": userAgent } } ); if (res.code === 200) { let backData = res.data; backData.has_back = -1; backCards.push(backData); } } } resolve(backCards); }); } __name(findBackCards, "findBackCards"); function makeCardMessage(ctx, session, card) { let cardImgUrl = parseCardImagePath(card); ctx.logger("sve-helper").info(`inferred image url (please report if incorrect) | ${card.name_cn}: ${cardImgUrl}`); return (0, import_koishi.h)("message", (0, import_koishi.h)("img", { src: cardImgUrl }), `${card.name_cn} ${card.desc_cn}`); } __name(makeCardMessage, "makeCardMessage"); function apply(ctx) { ctx.command("sve-helper <query>", "影之诗卡牌查询").alias("sve").option("limit", "-n <limit> 返回数量").option("offset", "-o <offset> 偏移量").option("cost", "-c <cost> 费用").option("race", "-r <race> 类型").option("rare", "-R <rare> 罕度").option("from", "-f <from> 卡包").option("craft", "-C <craft> 职业").option("ability", "-a <ability> 能力").option("card_type", "-t <card_type> 卡牌种类").action(async ({ session, options }, query) => { let raceIds = []; if (options.race) { let raceQuery = options.race.split(","); const race_res = await ctx.http.post( raceUrl, { "headers": { "Host": sveHelperUrl, "User-Agent": userAgent } } ); if (race_res.code !== 200) { ctx.logger("sve-helper").warn("获取卡牌类型列表失败", race_res.data); return "获取卡牌类型列表失败"; } const raceList = race_res.data; if (!raceList) { ctx.logger("sve-helper").warn("获取卡牌类型列表 - 响应数据无效", race_res.data); return "获取卡牌类型列表 - 响应数据无效"; } raceIds = raceList.filter((raceItem) => raceQuery.includes(raceItem.jp_name) || raceQuery.includes(raceItem.cn_name)).map((raceItem) => raceItem.id); } const payload = { from: options.from ? options.from.toUpperCase().split(",") : [], card_type: options.card_type ? options.card_type.toLowerCase().replace("token", "FollowerToken,SpellToken,AmuletToken").split(",").map((cardType) => SVECardTypeName[cardType] || "") : [], rare: options.rare ? options.rare.toUpperCase().split(",") : [], cost: options.cost ? options.cost.split(",").map(Number) : [], craft: options.craft ? options.craft.toLowerCase().split(",").map((craft) => SVECraftName[craft] || "") : [], race: raceIds, sort_by: "byCostAsc", ability: options.ability ? options.ability.split(",").map((ability) => SVEAbilityName[ability] || null) : [], name: query, pageable: { limit: Number(options.limit) || 5, offset: Number(options.offset) || 0 } }; const res = await ctx.http.post( queryUrl, payload, { "headers": { "User-Agent": userAgent } } ); if (res.code !== 200) { ctx.logger("sve-helper").warn("查询失败", res.data); return "查询失败"; } if (!res.data || !res.data.list) { ctx.logger("sve-helper").warn("响应数据无效", res.data); return "响应数据无效"; } const cards = res.data.list; if (cards.length === 0) { return "未找到卡片"; } const backCards = await findBackCards(ctx, cards); cards.push(...backCards); session.send((0, import_koishi.h)("message", { "forward": true }, cards.map((card) => makeCardMessage(ctx, session, card)))); ctx.logger("sve-helper").info("查询成功"); }); } __name(apply, "apply"); // Annotate the CommonJS export names for ESM import in node: 0 && (module.exports = { Config, apply, name });