feat: character list error handling

This commit is contained in:
2026-03-22 11:18:41 +07:00 Unverified
parent e228e47ceb
commit cf5fbf3ae2
+62 -26
View File
@@ -106,35 +106,71 @@ export function card(app: App) {
) )
.get( .get(
"/genshin/:uid", "/genshin/:uid",
async ({ params: { uid }, query: { debug, lang }, log }) => { async ({
// #region Character List params: { uid },
const [[avatarStore, locs, pfps, namecards], data] = query: { debug, lang, error: errorType },
await Promise.all([ log,
deduper.acquire("stores", () => }) => {
batchStore("avatars", "locs", "pfps", "namecards").finally( const error =
() => log`Stores loaded`, errorType === "card"
? (_: number, message: string) => ErrorPage(message)
: status;
const errorLoc = cardErrorLocs[lang === "th" ? "th" : "en"];
try {
// #region Character List
const [[avatarStore, locs, pfps, namecards], data] =
await Promise.all([
deduper.acquire("stores", () =>
batchStore("avatars", "locs", "pfps", "namecards").finally(
() => log`Stores loaded`,
),
), ),
), feature("API") || uid !== "775956514"
feature("API") || uid !== "775956514" ? deduper.acquire(`enka-${uid}`, () =>
? deduper.acquire(`enka-${uid}`, () => fetchEnka(uid, true).finally(
fetchEnka(uid, true).finally(() => log`Enka data loaded`), () => log`Enka data loaded`,
) ),
: mockData, )
]); : mockData,
]);
if (debug) return { data }; if (typeof data.playerInfo.showAvatarInfoList === "undefined")
return error(400, errorLoc.private);
return ListPage( if (debug) return { data };
data,
pfps[ return ListPage(
`${data.playerInfo.profilePicture.id ?? 1}` data,
].IconPath.replace("_Circle", ""), pfps[
namecards[`${data.playerInfo.nameCardId ?? 210001}`].Icon, `${data.playerInfo.profilePicture.id ?? 1}`
namecards, ].IconPath.replace("_Circle", ""),
avatarStore, namecards[`${data.playerInfo.nameCardId ?? 210001}`].Icon,
locs[lang ?? "en"], namecards,
log, avatarStore,
); locs[lang ?? "en"],
log,
);
} catch (err) {
if (err instanceof InvalidFormatError)
return error(400, errorLoc.uidFormat);
else if (err instanceof NotFoundError)
return error(404, errorLoc.notFound);
else if (err instanceof MaintenanceError)
return error(424, errorLoc.maintenance);
else if (err instanceof RatelimitError)
return error(429, errorLoc.ratelimit);
else if (err instanceof InternalError)
return status(502, errorLoc.internal);
console.error(err);
try {
return error(
500,
`Internal Error:\n${(err as { message: string })?.message || inspect(err)}` as "",
);
} catch {
throw err;
}
}
}, },
{ {
params: t.Object({ params: t.Object({