diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/lib/Header.svelte | 2 | ||||
-rw-r--r-- | src/lib/minecraft/Inventory.svelte | 45 | ||||
-rw-r--r-- | src/lib/minecraft/Item.svelte | 32 | ||||
-rw-r--r-- | src/lib/minecraft/Username.svelte (renamed from src/lib/Username.svelte) | 0 | ||||
-rw-r--r-- | src/lib/minecraft/heads/Head2d.svelte (renamed from src/lib/heads/Head2d.svelte) | 0 | ||||
-rw-r--r-- | src/lib/minecraft/heads/Head3d.svelte (renamed from src/lib/heads/Head3d.svelte) | 0 | ||||
-rw-r--r-- | src/lib/profile.ts | 6 | ||||
-rw-r--r-- | src/lib/sections/Armor.svelte | 7 | ||||
-rw-r--r-- | src/lib/sections/Infobox.svelte | 3 | ||||
-rw-r--r-- | src/lib/utils.ts | 3 | ||||
-rw-r--r-- | src/routes/constants.json.ts | 18 | ||||
-rw-r--r-- | src/routes/player/[player]/[profile].svelte | 57 | ||||
-rw-r--r-- | src/routes/player/[player]/index.svelte | 6 |
13 files changed, 135 insertions, 44 deletions
diff --git a/src/lib/Header.svelte b/src/lib/Header.svelte index a5ec702..48f5167 100644 --- a/src/lib/Header.svelte +++ b/src/lib/Header.svelte @@ -6,7 +6,7 @@ </script> <header id="main-header"> - <a href={backArrowHref} class="back-arrow-anchor" aria-label="back"> + <a href={backArrowHref} class="back-arrow-anchor" aria-label="back" sveltekit:prefetch> <svg class="back-arrow" height="33" width="23"> <path d="M 14 0 l -13 13 l 13 13" stroke-width="2" fill="none" /> </svg> diff --git a/src/lib/minecraft/Inventory.svelte b/src/lib/minecraft/Inventory.svelte new file mode 100644 index 0000000..3d3b9c0 --- /dev/null +++ b/src/lib/minecraft/Inventory.svelte @@ -0,0 +1,45 @@ +<script lang="ts"> + import Item from './Item.svelte' + + export let items + export let name = '' + export let pack = '' + + if (name === 'inventory') + // in the inventory, the first 9 items are the hotbar and should be at the end + items = items.slice(9).concat(items.slice(0, 9)) + + // each item group has 9 items + let itemGroups = [] + $: { + itemGroups = [] + for (let i = 0; i < items.length; i += 9) { + itemGroups.push(items.slice(i, i + 9)) + } + } +</script> + +<div class:inventory-container-{name}={name !== ''}> + {#each itemGroups as itemGroup, groupIndex} + <div> + {#each itemGroup as item} + <Item {item} {pack} isslot /> + {/each} + </div> + {/each} +</div> + +<!-- {%- macro inventory(items, name='', pack='') -%} + <div{% if name %} class="inventory-container-{{ name }}"{% endif %}> + {%- if name == 'inventory' -%} + {%- set items = items|slice(9)|append(items|slice(0, 9)) -%} + {%- endif -%} + + {%- for itemData in items -%} + {%- if loop.index0 > 0 and loop.index0 % 9 == 0 %}</div>{%- endif -%} + {%- if loop.index0 % 9 == 0 %}<div>{%- endif -%} + {{- item(itemData, slot=true, pack=pack) -}} + {%- endfor -%} + </div> + </div> +{%- endmacro -%} --> diff --git a/src/lib/minecraft/Item.svelte b/src/lib/minecraft/Item.svelte new file mode 100644 index 0000000..86bd8f1 --- /dev/null +++ b/src/lib/minecraft/Item.svelte @@ -0,0 +1,32 @@ +<script lang="ts"> + import { formattingCodeToHtml } from '$lib/utils' + + export let item: any | null + export let isslot = true + export let pack = '' + + $: itemLoreHtml = item.display.lore.map(l => formattingCodeToHtml(l)).join('<br>') + $: itemNameHtml = formattingCodeToHtml(item.display.name) +</script> + +<!-- {#if data}{/if} --> + +<!-- {%- macro item(data, slot=true, pack='') -%} + {%- if data -%} + {%- set itemLoreHtml -%} + {%- for line in data.display.lore -%} + {{- line|formattingCodeToHtml -}}{% if not loop.last %}<br>{% endif %} + {%- endfor -%} + {%- endset -%} + {%- set itemNameHtml = data.display.name|formattingCodeToHtml -%} + {%- endif -%} + <span class="item{% if slot %} item-slot{% endif %}"{% if data %} data-lore-html="{{- itemLoreHtml -}}" data-name-html="{{- itemNameHtml -}}"{% endif %}> + {%- if data -%} + {%- set imageUrl = data|itemToUrl(pack) -%} + {%- if imageUrl -%} + <img loading="lazy" src="{{ imageUrl }}" alt="{{ data.display.name|removeFormattingCode }}"{% if imageUrl|startsWith('https://mc-heads.net/head/') %} class="item-custom-head"{% endif %}> + {%- endif -%} + {%- if data.count != 1 %}<span class="item-count">{{ data.count }}</span>{% endif -%} + {%- endif -%} + </span> +{%- endmacro -%} --> diff --git a/src/lib/Username.svelte b/src/lib/minecraft/Username.svelte index d415511..d415511 100644 --- a/src/lib/Username.svelte +++ b/src/lib/minecraft/Username.svelte diff --git a/src/lib/heads/Head2d.svelte b/src/lib/minecraft/heads/Head2d.svelte index d4e9ca8..d4e9ca8 100644 --- a/src/lib/heads/Head2d.svelte +++ b/src/lib/minecraft/heads/Head2d.svelte diff --git a/src/lib/heads/Head3d.svelte b/src/lib/minecraft/heads/Head3d.svelte index f8d2657..f8d2657 100644 --- a/src/lib/heads/Head3d.svelte +++ b/src/lib/minecraft/heads/Head3d.svelte diff --git a/src/lib/profile.ts b/src/lib/profile.ts index 973a6da..320a5dc 100644 --- a/src/lib/profile.ts +++ b/src/lib/profile.ts @@ -10,16 +10,16 @@ export function prettyTimestamp(ms: number) { return timeAsString } -export function generateInfobox(data, constants, opts: { meta: boolean }): string[] { +export function generateInfobox(data, opts: { meta: boolean }): string[] { const result: string[] = [] result.push(`💾 Last save: ${prettyTimestamp(data.member.last_save * 1000)}`) result.push(`🚶 Profile created: ${prettyTimestamp(data.member.first_join * 1000)}`) - result.push(`✨ Fairy souls: ${data.member.fairy_souls.total}/${constants.max_fairy_souls}`) + result.push(`✨ Fairy souls: ${data.member.fairy_souls.total}/${data.member.fairy_souls.max}`) - if (data.profile.minion_count >= constants.max_minions) + if (data.profile.minion_count >= data.profile.maxUniqueMinions) result.push(`🤖 Minion count: ${data.profile.minion_count}`) let mostSignificantKillsStat = null diff --git a/src/lib/sections/Armor.svelte b/src/lib/sections/Armor.svelte new file mode 100644 index 0000000..c4e7950 --- /dev/null +++ b/src/lib/sections/Armor.svelte @@ -0,0 +1,7 @@ +<script lang="ts"> + import Inventory from '$lib/minecraft/Inventory.svelte' + export let data + export let pack +</script> + +<Inventory items={data.member.inventories.armor} name="armor" {pack} /> diff --git a/src/lib/sections/Infobox.svelte b/src/lib/sections/Infobox.svelte index eda7d22..c5c3454 100644 --- a/src/lib/sections/Infobox.svelte +++ b/src/lib/sections/Infobox.svelte @@ -4,7 +4,6 @@ import Emoji from '$lib/Emoji.svelte' export let data - export let constants </script> <!-- <div id="infobox"> @@ -33,7 +32,7 @@ <div id="infobox"> <h2><Username player={data.member} prefix /> ({data.member.profileName})</h2> - {#each generateInfobox(data, constants, { meta: false }) as item} + {#each generateInfobox(data, { meta: false }) as item} <p><Emoji value={item} /></p> {/each} </div> diff --git a/src/lib/utils.ts b/src/lib/utils.ts index c2a955a..ae0c5f0 100644 --- a/src/lib/utils.ts +++ b/src/lib/utils.ts @@ -61,7 +61,8 @@ export function formattingCodeToHtml(formatted: string): string { reset() } } else { - htmlOutput += character + // no xss! + htmlOutput += character.replace(/&/g, '&').replace(/</g, '<').replace(/>/g, '>') } } reset() diff --git a/src/routes/constants.json.ts b/src/routes/constants.json.ts deleted file mode 100644 index 301da58..0000000 --- a/src/routes/constants.json.ts +++ /dev/null @@ -1,18 +0,0 @@ -import { API_URL } from '$lib/api' - -export let constants: any = {} - -async function updateConstants() { - constants = await fetch(API_URL + 'constants').then(r => r.json()) - console.log('updated constants') -} - -updateConstants() -setInterval(updateConstants, 60 * 60 * 1000) // update every hour - -export async function get({ request }) { - console.log('gotten constants') - return { - body: constants || {} - } -}
\ No newline at end of file diff --git a/src/routes/player/[player]/[profile].svelte b/src/routes/player/[player]/[profile].svelte index 9c3fb31..36b731a 100644 --- a/src/routes/player/[player]/[profile].svelte +++ b/src/routes/player/[player]/[profile].svelte @@ -9,30 +9,29 @@ r.json() ) - const constants = await fetch('/constants.json').then(r => r.json()) - return { props: { data, - constants, + pack: params.pack ?? data?.customization?.pack, }, } } </script> <script lang="ts"> + import Username from '$lib/minecraft/Username.svelte' import Infobox from '$lib/sections/Infobox.svelte' import { generateInfobox } from '$lib/profile' - import Username from '$lib/Username.svelte' import Header from '$lib/Header.svelte' import Emoji from '$lib/Emoji.svelte' import { cleanId } from '$lib/utils' import Head from '$lib/Head.svelte' import Toc from '$lib/Toc.svelte' import Skills from '$lib/sections/Skills.svelte' + import Armor from '$lib/sections/Armor.svelte' export let data - export let constants + export let pack: string const categories = [ 'skills', @@ -58,7 +57,7 @@ <Head title="{data.member.username}'s SkyBlock profile ({data.member.profileName})" - description={generateInfobox(data, constants, { meta: true }).join('\n')} + description={generateInfobox(data, { meta: true }).join('\n')} metaTitle={(data.member.rank.name ? `[${data.member.rank.name}] ` : '') + `${data.member.username}\'s SkyBlock profile (${data.member.profileName})`} /> @@ -73,7 +72,7 @@ ({data.member.profileName}) </h1> - <Infobox {data} {constants} /> + <Infobox {data} /> <Toc {categories} /> @@ -83,10 +82,42 @@ <Skills {data} /> </section> {/if} - <!-- {%- if data.member.skills|length > 0 -%} - <section id="skills" class="profile-skills"> - <h2>Skills</h2> - {%- include 'sections/skills.njk' -%} - </section> - {%- endif -%} --> + + <br /> + + <div> + <div id="categories"> + {#if data.member.inventories.armor} + <section id="armor" class:armor-float={data.member.inventories.inventory}> + <h2>Armor</h2> + <Armor {data} {pack} /> + </section> + {/if} + <!-- {%- if data.member.inventories.armor -%} + <section id="armor"{% if data.member.inventories.inventory %} class="armor-float"{% endif %}> + <h2>Armor</h2> + {%- include 'sections/armor.njk' -%} + </section> + {%- endif -%} + {%- if data.member.inventories.inventory -%} + <section id="inventories"> + <h2>Inventories</h2> + {%- include 'sections/inventories.njk' -%} + </section> + {%- endif -%} + {%- asyncAll category in categories -%} + {%- set sectionContents -%} + {% with { data: data, category: category } %} + {%- include 'sections/' + category + '.njk' -%} + {% endwith %} + {%- endset -%} + {%- if sectionContents|trim and sectionContents|trim != '<ul></ul>' -%} + <section id="{{ category }}" class="collapsible"> + <h2>{{ category|replace('_', ' ')|title }}</h2> + {{- sectionContents|safe -}} + </section> + {%- endif -%} + {%- endall -%} --> + </div> + </div> </main> diff --git a/src/routes/player/[player]/index.svelte b/src/routes/player/[player]/index.svelte index 8704b09..7252a80 100644 --- a/src/routes/player/[player]/index.svelte +++ b/src/routes/player/[player]/index.svelte @@ -11,11 +11,6 @@ return { fallthrough: true } as unknown } - // this should happen instantly - // const constants = await fetch('/_constants.json').then(r => r.json()) - - // console.log('constants', constants) - if (data.player.username !== player) { return { redirect: `/player/${data.player.username}`, @@ -37,7 +32,6 @@ import Head from '$lib/Head.svelte' export let data - // export let constants let activeProfile = null let activeProfileLastSave: number = 0 |