From 089a5e64de1d636a6eda58f67f3b71e7e6a052de Mon Sep 17 00:00:00 2001 From: Fuwn Date: Sun, 21 Jan 2024 16:57:08 -0800 Subject: feat(badges): awc integration --- src/routes/user/[user]/badges/+page.svelte | 54 +++++++++++++++++++++++++++++- 1 file changed, 53 insertions(+), 1 deletion(-) (limited to 'src/routes') diff --git a/src/routes/user/[user]/badges/+page.svelte b/src/routes/user/[user]/badges/+page.svelte index 33e1b4d6..93db8c28 100644 --- a/src/routes/user/[user]/badges/+page.svelte +++ b/src/routes/user/[user]/badges/+page.svelte @@ -19,6 +19,7 @@ let error: null | string; // const socket = io(); let badgesPromise: Promise; + let awcPromise: Promise; let dark = true; let transparent = false; let confirmDelete = 0; @@ -30,6 +31,12 @@ type GroupedBadges = { [key: string]: Badge[] }; + interface AWCBadge { + link: string; + description: string; + image: string; + } + onMount(async () => { // socket.on('badges', (message) => (badges = message)); @@ -42,6 +49,7 @@ } badgesPromise = fetch(root(`/api/badges?id=${badger.id}`)); + awcPromise = fetch(`https://awc.moe/challenger/${badger.name}`); if (data.user) { currentUserIdentity = userIdentity(data.user); @@ -58,6 +66,21 @@ } }); + const awcBadges = (awcResponse: string): AWCBadge[] => { + return Array.from( + new DOMParser().parseFromString(awcResponse, 'text/html').querySelectorAll('.badge-display a') + ).map((b) => { + const badge = b as HTMLAnchorElement; + const image = badge.querySelector('img') as HTMLImageElement; + + return { + link: badge.href, + description: image.alt, + image: image.src + }; + }); + }; + const submitBadge = () => { const imageURL = document.querySelector('input[name="image_url"]') as HTMLInputElement; const activityURL = document.querySelector('input[name="activity_url"]') as HTMLInputElement; @@ -315,13 +338,42 @@ {:then ungroupedBadges}
+ {#await awcPromise then badges} + {#await badges.text() then text} + {@const parsedBadges = awcBadges(text)} + {#if parsedBadges.length > 0} +
+ Anime Watching Club + +

+ +

+ {#each parsedBadges as badge} + + {badge.description} + + {/each} +
+
+ +

+ {/if} + {/await} + {/await} + {#if ungroupedBadges === null} {@html nbsp('Loading badges ... 50%')} {:else if ungroupedBadges.length === 0}

- {@html nbsp('No badges found for this user.')} + {@html nbsp('No badges due.moe registered found for this user.')}
{:else} {@const groupedBadges = Object.entries(groupBadges(ungroupedBadges))} -- cgit v1.2.3