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

90 lines
2.4 KiB
TypeScript
Raw Normal View History

2025-06-07 12:35:23 -05:00
import { Avatar, fetchGlossary, Gallery } from '@blitzkit/core';
2025-04-19 00:47:28 -05:00
import locales from '@blitzkit/i18n/locales.json';
import { extname } from 'path';
import ProgressBar from 'progress';
import { commitAssets } from '../core/github/commitAssets';
import { FileChange } from '../core/github/commitMultipleFiles';
export async function glossary() {
console.log('Building glossary...');
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(
`Found ${Object.keys(glossary).length} things for ${supported.locale}`,
);
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 (
!key.startsWith('avatar') ||
key.endsWith('_part') ||
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) {
avatars[key].avatar.name.locales[supported.locale] =
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
}
2025-04-19 00:48:29 -05:00
}),
);
2025-04-19 00:47:28 -05:00
const changes: FileChange[] = [];
const gallery: Gallery = { avatars: [] };
const totalCount = Object.keys(avatars).length;
const bar = new ProgressBar(
`Fetching avatars of ${totalCount} things :bar`,
totalCount,
);
await Promise.all(
Object.entries(avatars).map(async ([key, { url, avatar }]) => {
if (!(locales.default in avatars[key].avatar.name.locales)) {
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
changes.push({
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();
}),
);
changes.push({
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
});
await commitAssets('glossary', changes);
}