diff --git a/packages/core/src/blitzkit/assertSecret.ts b/packages/core/src/blitzkit/assertSecret.ts index 934379286..7217e0e92 100644 --- a/packages/core/src/blitzkit/assertSecret.ts +++ b/packages/core/src/blitzkit/assertSecret.ts @@ -1,4 +1,4 @@ -export function assertSecret(secret?: Type) { +export function assertSecret(secret?: string) { if (secret === undefined) throw new Error("Missing secret"); return secret; } diff --git a/packages/website/src/core/blitzkit/api.ts b/packages/website/src/core/blitzkit/api.ts index d96a3b9e3..21e5c4b9f 100644 --- a/packages/website/src/core/blitzkit/api.ts +++ b/packages/website/src/core/blitzkit/api.ts @@ -1,17 +1,13 @@ import { ClientBlitzKitAPI, - LocalVFS, ServerBlitzKitAPI, type BlitzKitAPI, } from "@blitzkit/core"; +import { vfs } from "./vfs"; let _api: BlitzKitAPI; if (import.meta.env.SSR) { - const vfs = new LocalVFS( - "/run/media/tresabhi/Windows/Program Files/WindowsApps/7458BE2C.WorldofTanksBlitz_11.19.272.0_x64__x4tje2y229k00", - ); - _api = await new ServerBlitzKitAPI(vfs).init(); } else { _api = new ClientBlitzKitAPI(); diff --git a/packages/website/src/core/blitzkit/chunkedStaticPaths.ts b/packages/website/src/core/blitzkit/chunkedStaticPaths.ts new file mode 100644 index 000000000..76c9a365e --- /dev/null +++ b/packages/website/src/core/blitzkit/chunkedStaticPaths.ts @@ -0,0 +1,15 @@ +import { assertSecret } from "@blitzkit/core"; +import type { GetStaticPaths } from "astro"; + +export function chunkedStaticPaths(chunk: string) { + return function () { + const chunksEnv = assertSecret(import.meta.env.CHUNKS); + const chunks = chunksEnv.split(","); + + if (chunksEnv !== "*" && !chunks.includes(chunk)) { + return []; + } + + return [{ params: { [`chunk_${chunk}`]: chunk } }]; + } satisfies GetStaticPaths; +} diff --git a/packages/website/src/core/blitzkit/mixStaticPaths.ts b/packages/website/src/core/blitzkit/mixStaticPaths.ts new file mode 100644 index 000000000..4fe056fc3 --- /dev/null +++ b/packages/website/src/core/blitzkit/mixStaticPaths.ts @@ -0,0 +1,32 @@ +import type { + GetStaticPathsItem, + GetStaticPathsOptions, + GetStaticPathsResult, +} from "astro"; + +type Promisable = T | Promise; + +export function mixStaticPaths< + TypeA extends GetStaticPathsItem, + TypeB extends GetStaticPathsItem, +>( + a: (options: GetStaticPathsOptions) => Promisable, + b: (options: GetStaticPathsOptions) => Promisable, +) { + return async function (options: GetStaticPathsOptions) { + const pathsA = await a(options); + const pathsB = await b(options); + const paths: GetStaticPathsResult = []; + + for (const pathA of pathsA) { + for (const pathB of pathsB) { + paths.push({ + params: { ...pathA.params, ...pathB.params }, + props: { ...pathA.props, ...pathB.props }, + }); + } + } + + return paths as (TypeA & TypeB)[]; + }; +} diff --git a/packages/website/src/core/blitzkit/vfs.ts b/packages/website/src/core/blitzkit/vfs.ts new file mode 100644 index 000000000..a08a49d21 --- /dev/null +++ b/packages/website/src/core/blitzkit/vfs.ts @@ -0,0 +1,5 @@ +import { LocalVFS } from "@blitzkit/core"; + +export const vfs = new LocalVFS( + "/run/media/tresabhi/Windows/Program Files/WindowsApps/7458BE2C.WorldofTanksBlitz_11.19.272.0_x64__x4tje2y229k00", +); diff --git a/packages/website/src/pages/[...chunk_api]/_index.ts b/packages/website/src/pages/[...chunk_api]/_index.ts new file mode 100644 index 000000000..22ddd5188 --- /dev/null +++ b/packages/website/src/pages/[...chunk_api]/_index.ts @@ -0,0 +1,3 @@ +import { chunkedStaticPaths } from "../../core/blitzkit/chunkedStaticPaths"; + +export const getStaticPaths = chunkedStaticPaths("api"); diff --git a/packages/website/src/pages/[...chunk_api]/flags/circle/[id].webp.ts b/packages/website/src/pages/[...chunk_api]/flags/circle/[id].webp.ts new file mode 100644 index 000000000..c32a13501 --- /dev/null +++ b/packages/website/src/pages/[...chunk_api]/flags/circle/[id].webp.ts @@ -0,0 +1,39 @@ +import type { APIContext, GetStaticPathsItem } from "astro"; +import sharp from "sharp"; +import { mixStaticPaths } from "../../../../core/blitzkit/mixStaticPaths"; +import { vfs } from "../../../../core/blitzkit/vfs"; +import { getStaticPaths as _getStaticPaths } from "../../_index"; + +export const getStaticPaths = mixStaticPaths(_getStaticPaths, async () => { + const paths: GetStaticPathsItem[] = []; + + const circleFiles = await vfs + .dir(`Data/Gfx/Lobby/flags`) + .then((files) => + files.filter( + (flag) => + flag.startsWith("flag_profile-stat_") && + !flag.endsWith("@2x.packed.webp"), + ), + ); + + for (const flag of circleFiles) { + const path = `Data/Gfx/Lobby/flags/${flag}`; + const id = flag.match(/flag_profile-stat_(.+)\.packed\.webp/)![1]; + + paths.push({ + params: { id }, + props: { path }, + }); + } + + return paths; +}); + +export async function GET({ props }: APIContext<{ path: string }>) { + const image = sharp(await vfs.file(props.path)); + const content = await image.trim({ threshold: 100 }).toBuffer(); + const bytes = new Uint8Array(content); + + return new Response(bytes); +}