summaryrefslogtreecommitdiff
path: root/website/.vitepress/theme/components/download.data.ts
diff options
context:
space:
mode:
Diffstat (limited to 'website/.vitepress/theme/components/download.data.ts')
-rw-r--r--website/.vitepress/theme/components/download.data.ts105
1 files changed, 105 insertions, 0 deletions
diff --git a/website/.vitepress/theme/components/download.data.ts b/website/.vitepress/theme/components/download.data.ts
new file mode 100644
index 0000000..11e0489
--- /dev/null
+++ b/website/.vitepress/theme/components/download.data.ts
@@ -0,0 +1,105 @@
+const REPO = 'm1sk9/LunaticChat';
+
+interface ReleaseAsset {
+ name: string;
+ size: number;
+ browser_download_url: string;
+}
+
+interface GitHubRelease {
+ tag_name: string;
+ published_at: string;
+ html_url: string;
+ assets: ReleaseAsset[];
+}
+
+interface PlatformRelease {
+ version: string;
+ publishedAt: string;
+ releaseUrl: string;
+ downloadUrl: string | null;
+ fileName: string | null;
+ fileSize: number | null;
+}
+
+interface CIBuild {
+ url: string;
+}
+
+export interface DownloadData {
+ paper: PlatformRelease | null;
+ velocity: PlatformRelease | null;
+ ci: CIBuild;
+}
+
+async function fetchLatestRelease(
+ tagPrefix: string,
+): Promise<GitHubRelease | null> {
+ const res = await fetch(
+ `https://api.github.com/repos/${REPO}/releases?per_page=20`,
+ );
+ if (!res.ok) return null;
+
+ const releases: GitHubRelease[] = await res.json();
+ return (
+ releases.find(
+ (r) =>
+ r.tag_name.startsWith(tagPrefix) || r.tag_name.startsWith('v'),
+ ) ?? null
+ );
+}
+
+function parsePlatformRelease(
+ release: GitHubRelease | null,
+ jarPattern: RegExp,
+): PlatformRelease | null {
+ if (!release) return null;
+
+ const asset = release.assets.find((a) => jarPattern.test(a.name));
+ const version = release.tag_name.replace(/^(paper\/|velocity\/)?v/, '');
+
+ return {
+ version,
+ publishedAt: release.published_at,
+ releaseUrl: release.html_url,
+ downloadUrl: asset?.browser_download_url ?? null,
+ fileName: asset?.name ?? null,
+ fileSize: asset?.size ?? null,
+ };
+}
+
+export default {
+ async load(): Promise<DownloadData> {
+ // Fetch all recent releases and find the latest for each platform
+ const res = await fetch(
+ `https://api.github.com/repos/${REPO}/releases?per_page=30`,
+ );
+ const releases: GitHubRelease[] = res.ok ? await res.json() : [];
+
+ // Find latest Paper release (paper/v* or v*)
+ const paperRelease =
+ releases.find((r) => r.tag_name.startsWith('paper/v')) ??
+ releases.find((r) => /^v\d/.test(r.tag_name)) ??
+ null;
+
+ // Find latest Velocity release (velocity/v* or v*)
+ const velocityRelease =
+ releases.find((r) => r.tag_name.startsWith('velocity/v')) ??
+ releases.find((r) => /^v\d/.test(r.tag_name)) ??
+ null;
+
+ return {
+ paper: parsePlatformRelease(
+ paperRelease,
+ /^LunaticChat-[\d.]+\.jar$/,
+ ),
+ velocity: parsePlatformRelease(
+ velocityRelease,
+ /^LunaticChat-[\d.]+-velocity\.jar$/,
+ ),
+ ci: {
+ url: `https://github.com/${REPO}/actions/workflows/ci.yaml?query=branch%3Amain`,
+ },
+ };
+ },
+};