全站通知:

沙盒/test

阅读

    

2023-08-14更新

    

最新编辑:小凯露official

阅读:

  

更新日期:2023-08-14

  

最新编辑:小凯露official

来自深空之眼WIKI_BWIKI_哔哩哔哩
跳到导航 跳到搜索
页面贡献者 :
百地希留耶i
泠佛

获取卡池阵列数据

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} Promise 对象,返回包含所有钥从卡片数据的对象
     */
    static async getAllServantCardDataList() {
        return new Promise(async (resolve, reject) => {
            const {
                apiUrl,
                askargsParams,
                askConditionsConfig: { servant: askServantConditions },
                askPrintoutKeyList: { servant: askServantPrintoutKeyList }
            } = this;

            const params = {
                ...askargsParams,
                "conditions": askServantConditions,
                "printouts": askServantPrintoutKeyList.join("|")
            }

            try {
                const response = await $.get(apiUrl, params);
                const { query: { results: askedServantCardList } } = response;
                const servantMap = askedServantCardList.reduce((cacheMap, dataObj) => {
                    const {
                        id: [id],
                        name: [name],
                        rare: [rare],
                        race: [race],
                        type: [type],
                        time: [time],
                        category: [category],
                        avatar: [avatar],
                        image: [image]
                    } = dataObj[Object.keys(dataObj)].printouts;
                    return (
                        cacheMap.set(
                            parseInt(rare),
                            [...(
                                cacheMap.get(
                                    parseInt(rare)
                                )
                            ),
                            { id, name, rare, race, type, time, category, avatar, image }
                            ]
                        )
                    ) && cacheMap;
                }, new Map([ [1, []], [2, []], [3, []], [4, []], [5, []]]));
                resolve(Object.fromEntries(servantMap));
            } catch (error) {
                console.error(error);
                reject([]);
            }
        })

    }

    /**
     * 获取所有角色卡片数据列表映射对象
     * @returns {Promise} Promise 对象,返回包含所有角色卡片数据的对象
     */
    static async getAllCharacterCardDataList() {
        return new Promise(async (resolve, reject) => {
            const {
                apiUrl,
                askargsParams,
                askConditionsConfig: { character: askCharacterConditions },
                askPrintoutKeyList: { character: askCharacterPrintoutKeyList }
            } = this;

            const params = {
                ...askargsParams,
                "conditions": askCharacterConditions,
                "printouts": askCharacterPrintoutKeyList.join("|")
            }

            try {
                const response = await $.get(apiUrl, params);
                const { query: { results: askedServantCardList } } = response;
                const characterMap = askedServantCardList.reduce((cacheMap, dataObj) => {
                    const {
                        id: [id],
                        name: [name],
                        rare: [rare],
                        race: [race],
                        type: [type],
                        time: [time],
                        category: [category],
                        avatar: [avatar],
                        image: [image]
                    } = dataObj[Object.keys(dataObj)].printouts;
                    return (
                        cacheMap.set(
                            parseInt(rare),
                            [
                                ...(cacheMap.get(parseInt(rare))),
                                { id, name, rare, race, type, time, category, avatar, image }
                            ])
                    ) && cacheMap;
                }, new Map([ [1, []], [2, []], [3, []], [4, []], [5, []]]));
                resolve(Object.fromEntries(characterMap));
            } catch (error) {
                console.error(error);
                reject([]);
            }
        })
    }
    
    /**
     * 获取处理后的卡池数据映射列表
     * @param {Array} param0 - 包含以下参数的数组
     * @param {Array} param0.0 - 所有卡池数据列表
     * @param {Object} param0.1 - 所有从者卡片数据映射
     * @param {Object} param0.2 - 所有角色卡片数据映射
     * @returns {Array} 处理后的卡池数据映射列表
     */
    static getHandledCardPoolDataMapList([
        allCardPoolDataList,
        allServantCardDataMap,
        allCharacterCardDataMap
    ]) {
        /**
         * 返回一个处理过后包含所有卡池数据对象的数组列表
         * 该列表结构:
         * [
         *      // 单个卡池数据对象映射结构
         *      {
         *          id,        ->  卡池的id
         *          bg,        ->  卡池的背景图片src地址
         *          name,      ->  卡池的名称
         *          type,      ->  卡池的类型列表
         *          time,      ->  卡池的开始时间(YYYY-MM-DD)
         *          up: {      ->  卡池的UP卡配置对象
         *              S:[],  ->  卡池UP五星卡列表
         *              A:[]   ->  卡池UP四星卡列表
         *          },
         *          data,      ->  卡池所有处理过后的货物列表
         *          category,  ->  卡池的分类
         *      },
         *      ...
         * ]
         */
        return (allCardPoolDataList.filter(({
            data: selfCardPoolGoodList,
            type: selfCardPoolTypeList,
            time: selfCardPoolStarTime,
            up: selfCardPoolUpCardMap,
            up: {
                S: selfCardPoolUpFiveStarCardList,
                A: selfCardPoolUpFourStarCardList
            },
            category: selfCardPoolCategory
        }) => {
            /**
             * 判断当前卡池归类属于角色卡池还是钥从卡池
             * if 当前卡池为钥从卡池,则进入
             * else 否则进入角色卡池
             */
            if (selfCardPoolCategory === "servant") {
                /**
                 * 当前作用域中的逻辑仅适用于钥从卡池
                 */

                // 解构出所有的三星、四星、五星钥从卡数据列表(全部卡的数据对象列表)
                const {
                    3: servantThreeStarCardDefaultList,
                    4: servantFourStarCardDefaultList,
                    5: servantFiveStarCardDefaultList
                } = allServantCardDataMap;

                // 获取需要设置UP的五星钥从卡(沉睡之子)
                selfCardPoolUpFiveStarCardList.push(
                    ...(servantFiveStarCardDefaultList.filter(servantCardMap => {
                        return servantCardMap.name.includes("沉睡之子");
                    }).map(servantCard => servantCard.name))
                );

                // 过滤默认的钥从卡数据对象列表
                const [
                    servantThreeStarCardFilterList,
                    servantFourStarCardFilterList,
                    servantFiveStarCardFilterList
                ] = [
                    servantThreeStarCardDefaultList,
                    servantFourStarCardDefaultList,
                    servantFiveStarCardDefaultList
                ].map(servantCardMapList => {
                    /**
                     * 钥从普池,非UP池,因为没有设置UP概率
                     * 该卡池货物列表包含所有的钥从卡
                     * @returns {Array} 一个过滤后的卡池货物卡片名称列表
                     */
                    return (servantCardMapList.filter(servantCardMap => {
                        // 过滤掉所有的沉睡之子钥从卡
                        return !selfCardPoolUpFiveStarCardList.includes(servantCardMap.name)
                    })).map(servantCardObj => servantCardObj.name);
                })
                /**
                 * 添加过滤后的卡数据列表到当前卡池货物列表中
                 * 阵列数据结构:
                 * [
                 *   [], -> 所有三星钥从卡(包括新增的)
                 *   [], -> 钥从卡池无角色,故默认为空数组
                 *   [], -> 所有四星钥从卡(包括新增的)
                 *   [], -> 所有五星钥从卡(包括新增的)
                 *   [], -> 钥从卡池无角色,故默认为空数组
                 *   [], -> 钥从卡池UP五星卡,默认出的是沉睡之子(抽卡逻辑中需要设置哪个UP出哪个)
                 * ]
                 */
                selfCardPoolGoodList.push(
                    servantThreeStarCardFilterList,
                    [],
                    servantFourStarCardFilterList,
                    servantFiveStarCardFilterList,
                    [],
                    selfCardPoolUpFiveStarCardList
                )
                return true;
            } else {
                /**
                 * 当前作用域下的逻辑代码仅适用于角色卡池
                 */

                // 当前卡池对象的卡池开始的时间戳,用于判定扩充卡池需要添加该时间戳之前的卡
                const selfCardPoolStarTimestamp = new Date(selfCardPoolStarTime).getTime();

                // 解构出所有的三星钥从卡数据列表,角色卡池货物里需要三星钥从卡(全部卡的数据对象列表)
                const {
                    3: servantThreeStarCardDefaultList
                } = allServantCardDataMap;

                // 解构出三星角色卡、四星角色卡、五星角色卡的默认数据列表(全部卡的数据对象列表)
                const {
                    3: characterThreeStarCardDefaultList,
                    4: characterFourStarCardDefaultList,
                    5: characterFiveStarCardDefaultList
                } = allCharacterCardDataMap;

                /**
                 * 该表达式判定的是(角色普池),也就是角色常驻卡池
                 * 如果当前卡池数据对象中的类型列表为 (["默认"]) 则判定为真
                 * 类型列表必须与判定条件列表一致,不能多也不能少,否则判定假
                 * 需要保证Wiki中的 卡池列表 页面设置的子对象属性一致,懒得再做判定了
                 */
                if (selfCardPoolTypeList.includes("默认")) {
                    const [
                        servantThreeStarCardFilterList,
                        characterThreeStarCardFilterList,
                        characterFourStarCardFilterList,
                        characterFiveStarCardFilterList
                    ] = [
                        servantThreeStarCardDefaultList,
                        characterThreeStarCardDefaultList,
                        characterFourStarCardDefaultList,
                        characterFiveStarCardDefaultList
                    ].map(cardDataArray => {
                        /**
                         * 角色普池,非常驻角色UP池,因为可能不会设置UP概率
                         * 该卡池货物列表包含所有的非限定的五星卡
                         * @returns {Array} 一个过滤后的卡池货物卡片名称列表
                         */
                        return (cardDataArray.filter(cardMap => {
                            return !cardMap?.type?.includes("限定");
                        })).map(card => card.name);
                    });
                    /**
                     * 添加过滤后的卡数据列表到当前卡池货物列表中
                     * 阵列数据结构:
                     * [
                     *   [], -> 所有当前(常驻卡池)的三星钥从卡(包括新增的)
                     *   [], -> 所有当前(常驻卡池)的三星角色卡(包括新增的)
                     *   [], -> 所有当前(常驻卡池)的四星角色卡(包括新增的)
                     *   [], -> 所有当前(常驻卡池)的五星角色卡(包括新增的)
                     *   [], -> 角色普池无UP卡,故默认是个空数组
                     *   [], -> 角色普池无UP卡,故默认是个空数组
                     * ]
                     */
                    selfCardPoolGoodList.push(
                        servantThreeStarCardFilterList,
                        characterThreeStarCardFilterList,
                        characterFourStarCardFilterList,
                        characterFiveStarCardFilterList,
                        [],
                        []
                    );
                    return true;
                }

                /**
                 * 该表达式判定的是(常驻UP卡池)
                 * 如果当前卡池数据对象中的类型列表为 (["常驻", "常规"]) 则判定为真
                 */
                if (selfCardPoolTypeList.every(type => ["常驻", "常规"].includes(type))) {
                    const [
                        servantThreeStarCardFilterList,
                        characterThreeStarCardFilterList,
                        characterFourStarCardFilterList,
                        characterFiveStarCardFilterList
                    ] = [
                        [servantThreeStarCardDefaultList, ""],
                        [characterThreeStarCardDefaultList, ""],
                        [characterFourStarCardDefaultList, "A"],
                        [characterFiveStarCardDefaultList, "S"]
                    ].map(([cardDataArray, cardFilterChar]) => {
                        /**
                         * 常驻卡池, 且类型是(常规)的池子(常驻UP卡池)
                         * 该卡池货物列表需要把前面所有(常驻卡池)的(常驻卡)都(添加)进去
                         * @returns {Array} 一个过滤后的卡池货物卡片名称列表
                         */
                        return (cardDataArray.filter(cardMap => {
                            const cardTimestamp = new Date(cardMap.time).getTime();
                            return (
                                /**
                                 * 常驻卡池默认时间戳为当前日期的时间戳
                                 * 所以当前时间戳前的所有卡都会被添加到过滤后的列表中
                                 */
                                (cardTimestamp <= selfCardPoolStarTimestamp) &&
                                (
                                    (cardFilterChar && !selfCardPoolUpCardMap[cardFilterChar]?.includes(cardMap.name)) &&
                                    (!cardMap.type?.includes("限定")) ||
                                    (!cardFilterChar)
                                )
                            )
                        }).map(card => card.name));
                    });
                    /**
                     * 添加过滤后的卡数据列表到当前卡池货物列表中
                     * 阵列数据结构:
                     * [
                     *   [], -> 所有当前(常驻卡池)的三星钥从卡(包括新增的)
                     *   [], -> 所有当前(常驻卡池)的三星角色卡(包括新增的)
                     *   [], -> 所有当前(常驻卡池)的四星角色卡(包括新增的)
                     *   [], -> 所有当前(常驻卡池)的五星角色卡(包括新增的)
                     *   [], -> 角色普池UP四星卡,无则UP列表是个空数组
                     *   [], -> 角色普池UP五星卡,无则UP列表是个空数组
                     * ]
                     */
                    selfCardPoolGoodList.push(
                        servantThreeStarCardFilterList,
                        characterThreeStarCardFilterList,
                        characterFourStarCardFilterList,
                        characterFiveStarCardFilterList,
                        selfCardPoolUpFourStarCardList,
                        selfCardPoolUpFiveStarCardList
                    );
                    return true;
                }

                /**
                 * 该表达式判定的是(常驻精准扩充卡池)
                 * 如果当前卡池数据对象中的类型列表为 (["常驻", "精准扩充"]) 则判定为真
                 */
                if (selfCardPoolTypeList.every(type => ["常驻", "精准扩充"].includes(type))) {
                    const [
                        servantThreeStarCardFilterList,
                        characterThreeStarCardFilterList,
                        characterFourStarCardFilterList,
                        characterFiveStarCardFilterList
                    ] = [
                        [servantThreeStarCardDefaultList, ""],
                        [characterThreeStarCardDefaultList, ""],
                        [characterFourStarCardDefaultList, "A"],
                        [characterFiveStarCardDefaultList, "S"]
                    ].map(([cardDataArray, cardFilterChar]) => {
                        /**
                         * 常驻卡池, 且类型是(精准扩充)的池子
                         * 该卡池货物列表需要把前面所有(常驻卡池)的(常驻卡)都(添加)进去
                         * @returns {Array} 一个过滤后的卡池货物卡片名称列表
                         */
                        return (cardDataArray.filter(cardMap => {
                            const cardTimestamp = new Date(cardMap.time).getTime();
                            return (
                                /**
                                 * 常驻卡池默认时间戳为当前日期的时间戳
                                 * 所以当前时间戳前的所有卡都会被添加到过滤后的列表中
                                 */
                                (cardTimestamp <= selfCardPoolStarTimestamp) &&
                                (
                                    (cardFilterChar && !selfCardPoolUpCardMap[cardFilterChar]?.includes(cardMap.name)) &&
                                    (!cardMap.type?.includes("限定")) ||
                                    (!cardFilterChar)
                                )
                            )
                        }).map(card => card.name));
                    });
                    /**
                     * 添加过滤后的卡数据列表到当前卡池货物列表中
                     * 阵列数据结构:
                     * [
                     *   [], -> 所有当前(常驻卡池)的三星钥从卡(包括新增的)
                     *   [], -> 所有当前(常驻卡池)的三星角色卡(包括新增的)
                     *   [], -> 所有当前(常驻卡池)的四星角色卡(包括新增的)
                     *   [], -> 所有当前(常驻卡池)的五星角色卡(包括新增的)
                     *   [], -> 角色普池UP四星卡(包括新增的)
                     *   [], -> 角色普池UP五星卡(包括新增的)
                     * ]
                     */
                    selfCardPoolGoodList.push(
                        servantThreeStarCardFilterList,
                        characterThreeStarCardFilterList,
                        characterFourStarCardFilterList,
                        characterFiveStarCardFilterList,
                        selfCardPoolUpFourStarCardList,
                        selfCardPoolUpFiveStarCardList
                    );
                    return true;
                }

                /**
                 * 该表达式判定的是(非)后来添加的(限定精准扩充卡池)
                 * 如果当前卡池数据对象中的类型列表为 (["限定", "精准"]) 则判定为真
                 */
                if (selfCardPoolTypeList.every(type => ["限定", "精准"].includes(type))) {
                    const [
                        servantThreeStarCardFilterList,
                        characterThreeStarCardFilterList,
                        characterFourStarCardFilterList,
                        characterFiveStarCardFilterList
                    ] = [
                        [servantThreeStarCardDefaultList, ""],
                        [characterThreeStarCardDefaultList, ""],
                        [characterFourStarCardDefaultList, "A"],
                        [characterFiveStarCardDefaultList, "S"]
                    ].map(([cardDataArray, cardFilterChar]) => {
                        /**
                         * 限定卡池, 且类型是(精准)的池子
                         * 该卡池货物列表需要把前面所有限定卡池的卡都(过滤)掉
                         * @returns {Array} 一个过滤后的卡池货物卡片名称列表
                         */
                        return (cardDataArray.filter(cardMap => {
                            const cardTimestamp = new Date(cardMap.time).getTime();
                            return (
                                (cardTimestamp <= selfCardPoolStarTimestamp) &&
                                (
                                    (cardFilterChar && !selfCardPoolUpCardMap[cardFilterChar]?.includes(cardMap.name)) &&
                                    (!cardMap.type?.includes("限定")) ||
                                    (!cardFilterChar)
                                )
                            )
                        })).map(card => card.name);
                    })
                    /**
                     * 添加过滤后的卡数据列表到当前卡池货物列表中
                     * 阵列数据结构:
                     * [
                     *   [], -> 所有当前(限定精准探测卡池)前的三星钥从卡
                     *   [], -> 所有当前(限定精准探测卡池)前的三星角色卡
                     *   [], -> 所有当前(限定精准探测卡池)前的四星角色卡(不包括UP卡)
                     *   [], -> 所有当前(限定精准探测卡池)前的五星角色卡(不包括UP卡)
                     *   [], -> 当前卡池UP的四星角色卡列表
                     *   [], -> 当前卡池UP的五星角色卡列表
                     * ]
                     */
                    selfCardPoolGoodList.push(
                        servantThreeStarCardFilterList,
                        characterThreeStarCardFilterList,
                        characterFourStarCardFilterList,
                        characterFiveStarCardFilterList,
                        selfCardPoolUpFourStarCardList,
                        selfCardPoolUpFiveStarCardList
                    );
                    return true;
                }

                /**
                 * 该表达式判定的是后来添加的(限定精准扩充卡池)
                 * 如果当前卡池数据对象中的类型列表为 (["限定", "精准扩充"]) 则判定为真
                 */
                if (selfCardPoolTypeList.every(type => ["限定", "精准扩充"].includes(type))) {
                    const [
                        servantThreeStarCardFilterList,
                        characterThreeStarCardFilterList,
                        characterFourStarCardFilterList,
                        characterFiveStarCardFilterList
                    ] = [
                        [servantThreeStarCardDefaultList, ""],
                        [characterThreeStarCardDefaultList, ""],
                        [characterFourStarCardDefaultList, "A"],
                        [characterFiveStarCardDefaultList, "S"]
                    ].map(([cardDataArray, cardFilterChar]) => {
                        /**
                         * 限定卡池, 且类型是(精准扩充)的池子
                         * 该卡池货物列表需要把前面所有限定、常驻卡池的卡都(添加)进去
                         * @returns {Array} 一个过滤后的卡池货物卡片名称列表
                         */
                        return (cardDataArray.filter(cardMap => {
                            const cardTimestamp = new Date(cardMap.time).getTime();
                            return (
                                (cardTimestamp <= selfCardPoolStarTimestamp) &&
                                (
                                    (cardFilterChar && !selfCardPoolUpCardMap[cardFilterChar]?.includes(cardMap.name)) ||
                                    (!cardFilterChar)
                                )
                            )
                        })).map(card => card.name);
                    })
                    /**
                     * 添加过滤后的卡数据列表到当前卡池货物列表中
                     * 阵列数据结构:
                     * [
                     *   [], -> 所有当前(限定精准扩充卡池)前的三星钥从卡
                     *   [], -> 所有当前(限定精准扩充卡池)前的三星角色卡
                     *   [], -> 所有当前(限定精准扩充卡池)前的四星角色卡(不包括UP卡)
                     *   [], -> 所有当前(限定精准扩充卡池)前的五星角色卡(不包括UP卡)
                     *   [], -> 当前卡池UP的四星角色卡列表
                     *   [], -> 当前卡池UP的五星角色卡列表
                     * ]
                     */
                    selfCardPoolGoodList.push(
                        servantThreeStarCardFilterList,
                        characterThreeStarCardFilterList,
                        characterFourStarCardFilterList,
                        characterFiveStarCardFilterList,
                        selfCardPoolUpFourStarCardList,
                        selfCardPoolUpFiveStarCardList
                    );
                    return true;
                }
            }
        }));
    }
}

new GachaSimulatorDataQueryEngine();