import {z} from 'zod' export type Region = 'JP' | 'NA' | 'CN' | 'KR' | 'TW'; export type GetApiRawRegionClassBoardClassBoardIdArgs = {region: Region, class_board_id: number}; export type GetApiRawRegionClassBoardClassBoardIdOptions = {baseUrl?: string | undefined, fetch?: typeof fetch | undefined}; export const mstClassBoardBase = z.object({dispItemIds: z.array(z.number().int()), id: z.number().int(), name: z.string(), iconId: z.number().int(), closedMessage: z.string(), condType: z.number().int(), condTargetId: z.number().int(), condNum: z.number().int(), parentClassBoardBaseId: z.number().int().nullable().optional()}); export const mstClassBoardClass = z.object({classBoardBaseId: z.number().int(), classId: z.number().int(), condType: z.number().int(), condTargetId: z.number().int(), condNum: z.number().int()}); export const mstClassBoardLine = z.object({classBoardBaseId: z.number().int(), id: z.number().int(), prevSquareId: z.number().int(), nextSquareId: z.number().int()}); export const mstClassBoardSquare = z.object({itemIds: z.array(z.number().int()), itemNums: z.array(z.number().int()), classBoardBaseId: z.number().int(), id: z.number().int(), iconId: z.number().int(), posX: z.number().int(), posY: z.number().int(), skillType: z.number().int(), targetId: z.number().int(), upSkillLv: z.number().int(), lockId: z.number().int(), assetId: z.number().int(), flag: z.number().int(), priority: z.number().int()}); export const mstClassBoardLock = z.object({itemIds: z.array(z.number().int()), itemNums: z.array(z.number().int()), id: z.number().int(), closedMessage: z.string(), condType: z.number().int(), condTargetId: z.number().int(), condNum: z.number().int()}); export const mstBuff = z.object({vals: z.array(z.number().int()), tvals: z.array(z.number().int()), ckSelfIndv: z.array(z.number().int()), ckOpIndv: z.array(z.number().int()), script: z.record(z.string(), z.unknown()), id: z.number().int(), buffGroup: z.number().int(), type: z.number().int(), name: z.string(), detail: z.string(), iconId: z.number().int(), maxRate: z.number().int()}); export const buffEntityNoReverse = z.object({mstBuff: mstBuff}); export const mstFunc = z.object({vals: z.array(z.number().int()), expandedVals: z.array(buffEntityNoReverse).optional(), tvals: z.array(z.number().int()), questTvals: z.array(z.number().int()), effectList: z.array(z.number().int()), popupTextColor: z.number().int(), script: z.record(z.string(), z.unknown()).nullable().optional(), overWriteTvalsList: z.array(z.array(z.number().int())).nullable().optional(), id: z.number().int(), cond: z.number().int().optional(), funcType: z.number().int(), targetType: z.number().int(), applyTarget: z.number().int(), popupIconId: z.number().int(), popupText: z.string()}); export const mstFuncGroup = z.object({funcId: z.number().int(), eventId: z.number().int(), baseFuncId: z.number().int(), nameTotal: z.string(), name: z.string(), iconId: z.number().int(), priority: z.number().int(), isDispValue: z.boolean()}); export const functionEntityNoReverse = z.object({mstFunc: mstFunc, mstFuncGroup: z.array(mstFuncGroup)}); export const mstClassBoardCommandSpell = z.object({funcIds: z.array(z.number().int()), expandedFuncId: z.array(functionEntityNoReverse).optional(), svals: z.array(z.string()), id: z.number().int(), commandSpellId: z.number().int(), lv: z.number().int(), name: z.string(), detail: z.string(), vals: z.string()}); export const mstItemSelect = z.object({itemId: z.number().int(), idx: z.number().int(), candidateGiftId: z.number().int(), requireNum: z.number().int(), detail: z.string()}); export const mstGift = z.object({sort_id: z.number().int().optional(), id: z.number().int(), type: z.number().int(), objectId: z.number().int(), priority: z.number().int(), num: z.number().int(), lv: z.number().int().nullable().optional(), limitCount: z.number().int().nullable().optional()}); export const mstGiftAdd = z.object({priorGiftIconIds: z.array(z.number().int()), giftId: z.number().int(), priority: z.number().int().nullable().optional(), condType: z.number().int(), targetId: z.number().int(), targetNum: z.number().int(), priorGiftId: z.number().int(), script: z.string()}); export const mstItem = z.object({individuality: z.array(z.number().int()), script: z.record(z.string(), z.unknown()), eventId: z.number().int().optional(), eventGroupId: z.number().int().optional(), isPresent: z.boolean().optional(), maxNum: z.number().int().optional(), id: z.number().int(), name: z.string(), detail: z.string(), imageId: z.number().int(), bgImageId: z.number().int(), type: z.number().int(), unit: z.string(), value: z.number().int(), sellQp: z.number().int(), isSell: z.boolean(), priority: z.number().int(), dropPriority: z.number().int(), startedAt: z.number().int(), endedAt: z.number().int(), useSkill: z.boolean().optional(), useAppendSkill: z.boolean().optional(), useAscension: z.boolean().optional(), useCostume: z.boolean().optional(), mstItemSelect: z.array(mstItemSelect).optional(), mstGift: z.array(mstGift).optional(), mstGiftAdd: z.array(mstGiftAdd).optional()}); export const mstSkill = z.object({effectList: z.array(z.number().int()), actIndividuality: z.array(z.number().int()), script: z.record(z.string(), z.unknown()), id: z.number().int(), type: z.number().int(), name: z.string(), ruby: z.string(), maxLv: z.number().int(), iconId: z.number().int(), motion: z.number().int()}); export const mstSkillDetail = z.object({id: z.number().int(), detail: z.string(), detailShort: z.string()}); export const mstSvtSkill = z.object({script: z.record(z.string(), z.unknown()).nullable().optional(), strengthStatus: z.number().int(), svtId: z.number().int(), num: z.number().int(), priority: z.number().int(), skillId: z.number().int(), condQuestId: z.number().int(), condQuestPhase: z.number().int(), condLv: z.number().int().optional(), condLimitCount: z.number().int(), eventId: z.number().int(), flag: z.number().int()}); export const mstSkillAdd = z.object({skillId: z.number().int(), priority: z.number().int(), commonReleaseId: z.number().int(), name: z.string(), ruby: z.string()}); export const mstSvtSkillRelease = z.object({svtId: z.number().int(), num: z.number().int(), priority: z.number().int(), idx: z.number().int(), condType: z.number().int(), condTargetId: z.number().int(), condNum: z.number().int(), condGroup: z.number().int()}); export const mstCommonRelease = z.object({id: z.number().int(), priority: z.number().int(), condGroup: z.number().int(), condType: z.number().int(), condId: z.number().int(), condNum: z.number().int()}); export const mstSkillLv = z.object({funcId: z.array(z.number().int()), expandedFuncId: z.array(functionEntityNoReverse).nullable().optional(), svals: z.array(z.string()), script: z.record(z.string(), z.unknown()), skillId: z.number().int(), lv: z.number().int(), chargeTurn: z.number().int(), skillDetailId: z.number().int(), priority: z.number().int()}); export const mstSkillGroup = z.object({id: z.number().int(), skillId: z.number().int(), lv: z.number().int()}); export const mstSkillGroupOverwrite = z.object({funcId: z.array(z.number().int()), svals: z.array(z.string()), skillGroupId: z.number().int(), startedAt: z.number().int(), endedAt: z.number().int(), iconId: z.number().int(), vals: z.string(), skillDetailId: z.number().int(), expandedFuncId: z.array(functionEntityNoReverse).nullable().optional()}); export const mstSkillIndividuality = z.object({individuality: z.array(z.number().int()), skillId: z.number().int()}); export const skillEntityNoReverse = z.object({mstSkill: mstSkill, mstSkillDetail: z.array(mstSkillDetail), mstSvtSkill: z.array(mstSvtSkill), mstSkillAdd: z.array(mstSkillAdd), mstSvtSkillRelease: z.array(mstSvtSkillRelease), mstCommonRelease: z.array(mstCommonRelease), mstSkillLv: z.array(mstSkillLv), mstSkillGroup: z.array(mstSkillGroup), mstSkillGroupOverwrite: z.array(mstSkillGroupOverwrite), mstSkillIndividuality: mstSkillIndividuality.nullable().optional(), aiIds: z.record(z.string(), z.array(z.number().int())).nullable().optional()}); export const classBoardEntity = z.object({mstClassBoardBase: mstClassBoardBase, mstClassBoardClass: z.array(mstClassBoardClass), mstClassBoardLine: z.array(mstClassBoardLine), mstClassBoardSquare: z.array(mstClassBoardSquare), mstClassBoardLock: z.array(mstClassBoardLock), mstClassBoardCommandSpell: z.array(mstClassBoardCommandSpell), mstItem: z.array(mstItem), mstSkill: z.array(skillEntityNoReverse)}); export const validateResponse = async ( schema: { readonly '~standard': { readonly validate: (value: unknown) => ({ readonly value: Output; readonly issues?: undefined } | { readonly issues: ReadonlyArray<{ readonly message: string; readonly path?: ReadonlyArray | undefined }> }) | Promise<{ readonly value: Output; readonly issues?: undefined } | { readonly issues: ReadonlyArray<{ readonly message: string; readonly path?: ReadonlyArray | undefined }> }> } }, value: unknown ): Promise => { const result = await schema['~standard'].validate(value) if (result.issues !== undefined) { const detail = result.issues .map(({ message, path }) => path?.length ? `${path.map((segment) => String(typeof segment === 'object' ? segment.key : segment)).join('.')}: ${message}` : message ) .join('; ') throw new Error(`Response does not match the schema: ${detail}`, { cause: { issues: result.issues } }) } return result.value }; /** * Get Class Board data * * GET /raw/{region}/class-board/{class_board_id} */ export const getApiRawRegionClassBoardClassBoardId = async (args: GetApiRawRegionClassBoardClassBoardIdArgs, options?: GetApiRawRegionClassBoardClassBoardIdOptions) => { const {baseUrl = "https://api.atlasacademy.io", fetch: fetchFn = fetch} = options ?? {} const query = new URLSearchParams() const headers = new Headers() headers.set('accept', "application/json") const url = `${baseUrl.replace(/\/+$/, '')}/raw/${encodeURIComponent(String(args.region))}/class-board/${encodeURIComponent(String(args.class_board_id))}${query.size > 0 ? `?${query}` : ''}` const res = await fetchFn(url, {method: "GET", headers}) if (!res.ok) throw new Error(`Request failed with status ${res.status}`, {cause: {status: res.status, body: await res.text()}}) return validateResponse(classBoardEntity, await res.json()) };