diff --git a/src/apis/index.ts b/src/apis/index.ts index 78d2f5d..547ee0b 100644 --- a/src/apis/index.ts +++ b/src/apis/index.ts @@ -2,11 +2,13 @@ import Router from "@koa/router"; import { p2dRoutes } from "./p2d/index.js"; import { DefaultContext, DefaultState, ParameterizedContext } from "koa"; import { ILaochanContext } from "../types.js"; +import { sdvxRoutes } from './sdvx/index.js'; const router = new Router({ prefix: '/api', }) - .use(p2dRoutes); + .use(p2dRoutes) + .use(sdvxRoutes); export const apiRoutes = router.routes(); export type Context = ParameterizedContext, any>; diff --git a/src/apis/sdvx/index.ts b/src/apis/sdvx/index.ts new file mode 100644 index 0000000..e9fed6b --- /dev/null +++ b/src/apis/sdvx/index.ts @@ -0,0 +1,70 @@ +import Router from '@koa/router'; +import { Context } from '../index.js'; +import {UserService} from '../../services/sdvx/user.js'; +import { SaveData } from '../../types/sdvx/savedata.js'; +import { PlayerMusicData } from '../../types/sdvx/index.js'; +import { tokenToCardNumber } from '../../utils/laochan-id.js'; +import { toObject } from '../../utils/kbinxml.js'; +import { Serializable } from '../../utils/kxml-value.js'; + +interface SdvxDataExport { + sdvx_profile: { + "1": { + card: string; + pin: "0000"; + sdvx_id: string; + version: { + "6": SaveData; + } + } + } + sdvx_scores_best: Record; + skill_scores_best: {}; +} + +const router = new Router({ + prefix: '/sdvx', +}) + .get('/data_export/:token', async (ctx: Context) => { + const { token } = ctx.params; + + if (!token) { + ctx.status = 400; + return; + } + + const userService = ctx.resolve(UserService); + + if (!await userService.hasPlayerData(token)){ + ctx.status = 404; + return; + } + + const [playerData, musicDatas] = await Promise.all([ + userService.getPlayerData(token), + userService.getPlayerMusicDatas(token), + ]); + + const scoreBests: Record = {}; + musicDatas.forEach((m, i) => { + scoreBests[i.toString()] = m; + }) + + ctx.status = 200; + ctx.body = { + sdvx_profile: { + "1": { + card: tokenToCardNumber(token), + pin: '0000', + sdvx_id: playerData.sdvx_id.__value as string, + version:{ + "6": toObject(playerData as unknown as Serializable), + } + } + }, + sdvx_scores_best: scoreBests, + skill_scores_best: {} + } as SdvxDataExport; + }) + +export const sdvxRoutes = router.routes();