koishi-plugin-sve-helper
Version:
Unofficial card search plugin for Shadowverse Evolve (SVE) based on sve-helper and Koishi.
348 lines (343 loc) • 13.9 kB
JavaScript
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.1.0";
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}`;
imgName = imgName.replace("LDⓈ", "lds");
imgName = imgName.replace("ldⓈ", "lds");
const specialPrefixes = ["BP01", "BP02", "SD01", "SD02", "SD03", "SD04", "SD05", "SD06"];
if (specialPrefixes.some((prefix) => card.card_no.startsWith(prefix))) {
if (card.card_no.startsWith("BP")) {
imgName = imgName.toLowerCase();
imgName = imgName.replace("-", "_");
}
} else {
imgName = imgName.toLowerCase();
}
if (["bp03-u03", "bp03-u04", "bp03-u06"].includes(imgName)) {
imgName = `${imgName}-2`;
}
if (imgName === "cp01-p33") {
imgName = "cp01-p330";
} else if (imgName === "etd01-002") {
imgName = "etd01-002 ";
} else if (imgName === "cp03-124") {
imgName = "cp03-124re";
} else if (imgName === "cp03-004") {
imgName = "cp03-004re";
}
if (card.has_back !== 0) {
if (card.card_no.startsWith("BP08")) {
imgName = `${imgName}_${card.has_back === -1 ? "back" : "front"}`;
} else {
imgName = `${imgName}${card.has_back === -1 ? "_ura" : ""}`;
}
}
let cardSet = card.from;
if (card.card_no.startsWith("DSD01")) {
cardSet = "DSD01";
}
return `${imgUrl}/${cardSet}/${imgName}.png`;
}
__name(parseCardImagePath, "parseCardImagePath");
async function getBackCard(ctx, card) {
const res = await ctx.http.post(
backCardUrl,
{ card_no: card.card_no },
{
"headers": {
"User-Agent": userAgent
}
}
);
if (res.code === 200) {
let backData = res.data;
backData.has_back = -1;
return backData;
}
return null;
}
__name(getBackCard, "getBackCard");
async function makeCardMessage(ctx, card) {
const cardImgUrl = parseCardImagePath(card);
ctx.logger("sve-helper").info(`inferred image url (please report if incorrect) | ${card.name_cn}: ${cardImgUrl}`);
try {
await ctx.http.head(cardImgUrl);
} catch {
return (0, import_koishi.h)("message", `[图片加载失败]
${card.name_cn}
${card.desc_cn}`);
}
return (0, import_koishi.h)("message", (0, import_koishi.h)("img", { src: cardImgUrl }), `${card.name_cn}
${card.desc_cn}`);
}
__name(makeCardMessage, "makeCardMessage");
async function tryGetPRCardImagePath(ctx, prNo) {
const prUrlPrefix = `${imgUrl}/PR/`;
const possibleFilenames = [
`pr-${prNo.padStart(3, "0")}`,
`PR-${prNo.padStart(3, "0")}`,
`PR_${prNo.padStart(3, "0")}`
];
for (const filename of possibleFilenames) {
const imgUrl2 = `${prUrlPrefix}${filename}.png`;
try {
await ctx.http.head(imgUrl2);
return imgUrl2;
} catch {
continue;
}
}
return null;
}
__name(tryGetPRCardImagePath, "tryGetPRCardImagePath");
async function makePRCardMessage(ctx, prNo) {
const cardImgUrl = await tryGetPRCardImagePath(ctx, prNo);
if (!cardImgUrl) {
return (0, import_koishi.h)("message", `[图片加载失败]
PR-${prNo.padStart(3, "0")}`);
}
return (0, import_koishi.h)("message", (0, import_koishi.h)("img", { src: cardImgUrl }), `PR-${prNo.padStart(3, "0")}`);
}
__name(makePRCardMessage, "makePRCardMessage");
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 "未找到卡片";
}
for (let i = 0; i < cards.length; i++) {
if (cards[i].has_back === 1) {
const backCard = await getBackCard(ctx, cards[i]);
if (backCard) {
cards.splice(i + 1, 0, backCard);
}
}
}
const messages = await Promise.all(cards.map((card) => makeCardMessage(ctx, card)));
session.send((0, import_koishi.h)("message", { "forward": true }, messages));
ctx.logger("sve-helper").info("查询完成");
});
ctx.command("sve-helper-pr <prNos>", "影之诗PR卡牌查询").alias("pr").action(async ({ session }, prNos) => {
if (!prNos) return "请输入PR卡牌编号";
let prNoList = [];
if (prNos.includes("-")) {
const [start, end] = prNos.split("-").map(Number);
for (let i = start; i <= end; i++) {
prNoList.push(i.toString());
}
} else {
prNoList = prNos.split(",").map(Number).map(String);
}
const messages = await Promise.all(prNoList.map((prNo) => makePRCardMessage(ctx, prNo)));
session.send((0, import_koishi.h)("message", { "forward": true }, messages));
});
}
__name(apply, "apply");
// Annotate the CommonJS export names for ESM import in node:
0 && (module.exports = {
Config,
apply,
name
});