获取卡池阵列数据
class GachaSimulatorDataQueryEngine {
// 当前 Wiki api 的接口地址
static apiUrl = "https://wiki.biligame.com/dhmmr/api.php";
// 使用 Wiki api askargs 接口需要的参数
static askargsParams = {
"action": "askargs",
"format": "json",
"parameters": "limit=10000",
"utf8": 1,
"formatversion": "2",
"api_version": "3",
};
// 使用 askargs 接口需要的条件key参数
static askConditionsConfig = {
cardPool: "-Has subobject::卡池列表",
character: "分类:修正者|name::!潮音波塞冬",
servant: "分类:钥从"
};
// 使用 askargs 接口需要展示输出属性的key参数
static askPrintoutKeyList = {
cardPool: ["期数", "卡池名称", "卡池开始时间", "S级修正者", "A级修正者", "卡池类型", "卡池背景"],
character: ["id", "name", "rare", "race", "type", "time", "category", "avatar", "image"],
servant: ["id", "name", "rare", "race", "type", "time", "category", "avatar", "image"]
};
/**
* 构造函数
*/
constructor() {
this.allCardPoolDataList = [];
this.allServantCardDataMap = {};
this.allCharacterCardDataMap = {};
this.init();
}
/**
* 初始化函数,获取所有卡池数据、钥从卡数据、角色卡数据并生成一个Promise状态列表
* 使用Promise.all进行侦听数据获取状态,当全部完成后再执行处理获取所有卡池货物的函数
*/
init() {
const self = this.constructor;
// 获取所有卡池数据、钥从卡数据、角色卡数据生成一个Promise状态列表
const getDataPromiseList = [
self.getAllCardPoolDataList(),
self.getAllServantCardDataList(),
self.getAllCharacterCardDataList()
];
// 使用Promise.all进行侦听数据获取状态
Promise.all(getDataPromiseList).then(([
allCardPoolDataList,
allServantCardDataMap,
allCharacterCardDataMap
]) => {
// 赋值给实例对象
this.allCardPoolDataList = allCardPoolDataList;
this.allServantCardDataMap = allServantCardDataMap;
this.allCharacterCardDataMap = allCharacterCardDataMap;
this.allGachaCardDataMapList = [
[].concat(...Object.values(allServantCardDataMap)),
[].concat(...Object.values(allCharacterCardDataMap))
].flat();
// 当全部完成后再执行处理获取所有卡池货物的函数并返回一个数组赋值给实例对象
this.handledAllCardPoolDataMapList = self.getHandledCardPoolDataMapList([
allCardPoolDataList,
allServantCardDataMap,
allCharacterCardDataMap
]);
});
}
/**
* 获取当前格式化的时间列表
* @param {Date} [date=new Date()] - 要格式化的日期。默认为当前日期和时间。
* @param {string} [sliceChar="-"] - 用于分隔日期组件的字符。默认值为“-”。
* @returns {Array} 包含格式化日期和时间字符串的数组,["YYYY-MM-DD","hh:mm:ss"]
*/
static getNowFormatDateList(date = new Date(), sliceChar = "-") {
const [Y, M, D, h, m, s] = [
date.getFullYear(),
(date.getMonth() + 1).toString().padStart(2, "0"),
date.getDate().toString().padStart(2, "0"),
date.getHours().toString().padStart(2, "0"),
date.getMinutes().toString().padStart(2, "0"),
date.getSeconds().toString().padStart(2, "0")
];
return [`${Y}${sliceChar}${M}${sliceChar}${D}`, `${h}:${m}:${s}`]
}
/**
* 获取所有卡池数据列表
* @returns {Promise} Promise 对象,返回包含所有卡池数据的列表
*/
static getAllCardPoolDataList() {
return new Promise(async (resolve, reject) => {
const {
apiUrl,
askargsParams,
askConditionsConfig: { cardPool: askCardPoolConditions },
askPrintoutKeyList: { cardPool: askCardPoolPrintoutKeyList },
askPrintoutKeyList: { cardPool: [key1, key2, key3, key4, key5, key6, key7] },
getNowFormatDateList
} = this;
const params = {
...askargsParams,
"conditions": askCardPoolConditions,
"printouts": askCardPoolPrintoutKeyList.join("|")
};
const [nowTime] = getNowFormatDateList();
const defaultCardPoolList = [
{
id: "000", bg: null, name: "钥从普池",
type: ["默认"], time: nowTime, up: {
S: [],
A: []
}, data: [], category: "servant"
},
{
id: "000-1", bg: null, name: "角色普池",
type: ["默认"], time: nowTime, up: {
S: [],
A: []
}, data: [], category: "character"
}
];
try {
const response = await $.get(apiUrl, params);
const { query: { results: askedCardPoolList } } = response;
const handledCardPoolDataList = askedCardPoolList.reduce((arr, map) => {
const {
[key1]: [id = null],
[key2]: [name = null],
[key3]: [time = null],
[key4]: [...S],
[key5]: [...A],
[key6]: [...type],
[key7]: [bg = null],
} = map[Object.keys(map)]?.printouts;
return (arr.push({
id, bg, name,
type, time, up: { S, A },
data: [], category: "character"
})) && arr;
}, []);
resolve([...defaultCardPoolList, ...handledCardPoolDataList])
} catch (error) {
console.error(error);
reject([])
}
})
}
/**
* 获取所有钥从卡片数据列表映射对象
* @returns {Promise