feat: proxy avatars

This commit is contained in:
TrèsAbhi committed 2026-01-02 20:04:19 -06:00
1 parent 4b8e73fa57
commit 437bee4a85
9 files changed
+47 -65

No files matched your search

@@ -16,4 +16,5 @@ export abstract class AbstractAPI {
abstract tank(id: string): Promise<Tank>;
abstract avatars(): Promise<CatalogItemAccessor[]>;
abstract avatar(id: string): Promise<CatalogItemAccessor>;
}
+1 -1
View File
@@ -6,7 +6,7 @@ import { AbstractAPI } from "./abstract";
export class ClientAPI extends AbstractAPI {
tanks() {
return fetchPB("/api/tanks.pb", Tanks);
return fetchPB("/api/tanks/all.pb", Tanks);
}
tankList() {
@@ -150,4 +150,8 @@ export class ServerAPI extends AbstractAPI {
async avatars() {
return this.metadata.group("ProfileAvatarEntity");
}
async avatar(id: string) {
return this.metadata.item(`ProfileAvatarEntity.${id}`);
}
}
+2 -55
View File
@@ -17,66 +17,13 @@ export const tools: Record<string, Tool> = {
button: "purple",
significant: true,
},
players: {
id: "players",
disabled: true,
button: "blue",
},
compare: {
id: "compare",
button: "crimson",
},
performance: {
id: "performance",
button: "jade",
},
charts: {
id: "charts",
disabled: true,
button: "bronze",
},
playlist: {
id: "playlist",
button: "tomato",
},
mixer: {
id: "mixer",
button: "gray",
},
guess: {
id: "guess",
button: "cyan",
},
gallery: {
id: "gallery",
avatars: {
id: "avatars",
button: "gold",
},
session: {
id: "session",
button: "blue",
},
discord: {
id: "discord",
href: "https://discord.com/application-directory/1097673957865443370",
button: "indigo",
},
tier_list: {
id: "tier-list",
strings: "tier_list",
button: "orange",
},
embed: {
id: "embed",
button: "red",
},
api: {
id: "api",
disabled: true,
button: "bronze",
},
more: {
id: "more",
href: "https://discord.gg/nDt7AjGJQH",
button: "plum",
},
};
@@ -0,0 +1,27 @@
import type { APIContext, GetStaticPaths } from "astro";
import { api } from "../../../core/api/dynamic";
export const getStaticPaths = (async () => {
const avatars = await api.avatars();
return avatars.map((avatar) => ({
params: { id: avatar.name },
}));
}) satisfies GetStaticPaths;
/**
* One day I will write documentation for this
*/
export async function GET({ params }: APIContext<never, { id: string }>) {
const avatar = await api.avatar(params.id);
const profileAvatar = avatar.ProfileAvatar();
if (import.meta.env.DEV) {
return Response.redirect(profileAvatar.avatar);
}
const response = await fetch(profileAvatar.avatar);
const buffer = await response.arrayBuffer();
return new Response(buffer);
}
@@ -1,4 +1,4 @@
import { api } from "../../core/api/dynamic";
import { api } from "../../../core/api/dynamic";
/**
* Literally all the tanks in one place lmao.
@@ -1,5 +1,5 @@
import { api } from "../../core/api/dynamic";
import { Tanks } from "../../protos/tanks";
import { api } from "../../../core/api/dynamic";
import { Tanks } from "../../../protos/tanks";
/**
* Literally all the tanks in one place lmao.
@@ -24,7 +24,7 @@ const avatars = await api.avatars();
{ui.obtaining_methods && <p>{ui.obtaining_methods}</p>}
{ui.features && <p>{ui.features}</p>}
<img width="128" src={profileAvatar.avatar} />
<img width="128" src={`/api/avatars/${avatar.name}.webp`} />
{avatar.components.sellableComponent && (
<pre>{JSON.stringify(avatar.Sellable(), null, 2)}</pre>
+8 -5
View File
@@ -1,6 +1,7 @@
---
import "@radix-ui/colors/amber-dark.css";
import packageJson from "../../../../package.json";
import { tools } from "../core/tools/tools";
import BaseLayout from "../layouts/BaseLayout.astro";
---
@@ -9,9 +10,11 @@ import BaseLayout from "../layouts/BaseLayout.astro";
<h1>blitzkit {packageJson.version}</h1>
<p><a href="/tanks">/tanks</a></p>
<p><a href="/avatars">/avatars</a></p>
<p><a href="/api">/api</a></p>
{
Object.values(tools).map((tool) => (
<p>
<a href={`/${tool.id}`}>{tool.id}</a>
</p>
))
}
</BaseLayout>