Files
blitzkit/packages/scripts/src/buildAssets/glossary.ts
T

89 lines
2.3 KiB
TypeScript
Raw Normal View History

2025-10-23 21:22:21 -05:00
import { Avatar, fetchGlossary, Gallery } from "@blitzkit/core";
import locales from "@blitzkit/i18n/locales.json";
import { extname } from "path";
import ProgressBar from "progress";
import { AssetUploader } from "../core/github/assetUploader";
2025-04-19 00:47:28 -05:00
export async function glossary() {
2025-10-23 21:22:21 -05:00
console.log("Building glossary...");
2025-04-19 00:47:28 -05:00
2025-10-23 21:22:21 -05:00
using uploader = new AssetUploader("glossary");
2025-04-19 00:47:28 -05:00
const avatars: Record<string, { avatar: Avatar; url: string }> = {};
2025-04-19 00:48:29 -05:00
await Promise.all(
locales.supported.map(async (supported) => {
const glossary = await fetchGlossary(supported.blitz ?? supported.locale);
2025-04-19 00:47:28 -05:00
2025-04-19 00:48:29 -05:00
console.log(
2026-03-31 14:11:45 -05:00
`Found ${Object.keys(glossary).length} things for ${supported.locale}`,
2025-04-19 00:48:29 -05:00
);
2025-04-19 00:47:28 -05:00
2025-04-19 00:48:29 -05:00
for (const key in glossary) {
const glossaryEntry = glossary[key];
2025-04-19 00:47:28 -05:00
2025-04-19 00:48:29 -05:00
if (
2025-10-23 21:22:21 -05:00
!key.startsWith("avatar") ||
key.endsWith("_part") ||
2025-04-19 00:48:29 -05:00
glossaryEntry.image_url === null
) {
continue;
}
2025-04-19 00:47:28 -05:00
2025-04-19 00:48:29 -05:00
if (key in avatars) {
2026-03-31 14:11:45 -05:00
avatars[key].avatar.name!.locales[supported.locale] =
2025-04-19 00:48:29 -05:00
glossaryEntry.title;
} else {
2025-04-20 20:49:54 -05:00
const extension = extname(glossaryEntry.image_url);
2025-04-19 00:48:29 -05:00
avatars[key] = {
url: glossaryEntry.image_url,
avatar: {
id: key,
name: { locales: { [supported.locale]: glossaryEntry.title } },
2025-04-20 20:49:54 -05:00
extension,
2025-04-19 00:48:29 -05:00
},
};
}
2025-04-19 00:47:28 -05:00
}
2026-03-31 14:11:45 -05:00
}),
2025-04-19 00:48:29 -05:00
);
2025-04-19 00:47:28 -05:00
const gallery: Gallery = { avatars: [] };
const totalCount = Object.keys(avatars).length;
const bar = new ProgressBar(
`Fetching avatars of ${totalCount} things :bar`,
2026-03-31 14:11:45 -05:00
totalCount,
2025-04-19 00:47:28 -05:00
);
await Promise.all(
Object.entries(avatars).map(async ([key, { url, avatar }]) => {
2026-03-31 14:11:45 -05:00
if (!(locales.default in avatars[key].avatar.name!.locales)) {
2025-04-19 00:47:28 -05:00
console.warn(`Avatar ${key} has no ${locales.default} name`);
bar.tick();
return;
}
gallery.avatars.push(avatar);
2025-06-07 12:35:23 -05:00
const content = await fetch(url)
.then((response) => response.arrayBuffer())
.then((buffer) => new Uint8Array(buffer));
2025-04-19 00:47:28 -05:00
2025-10-23 21:22:21 -05:00
await uploader.add({
2025-04-20 20:49:54 -05:00
path: `gallery/avatars/${key}${avatar.extension}`,
2025-06-07 12:35:23 -05:00
content,
2025-04-19 00:47:28 -05:00
});
bar.tick();
2026-03-31 14:11:45 -05:00
}),
2025-04-19 00:47:28 -05:00
);
2025-10-23 21:22:21 -05:00
await uploader.add({
path: "definitions/gallery.pb",
2025-06-07 12:35:23 -05:00
content: Gallery.encode(gallery).finish(),
2025-04-19 00:47:28 -05:00
});
2025-10-23 21:22:21 -05:00
await uploader.flush();
2025-04-19 00:47:28 -05:00
}