aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/lib/Header.svelte2
-rw-r--r--src/lib/minecraft/Inventory.svelte45
-rw-r--r--src/lib/minecraft/Item.svelte32
-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.ts6
-rw-r--r--src/lib/sections/Armor.svelte7
-rw-r--r--src/lib/sections/Infobox.svelte3
-rw-r--r--src/lib/utils.ts3
-rw-r--r--src/routes/constants.json.ts18
-rw-r--r--src/routes/player/[player]/[profile].svelte57
-rw-r--r--src/routes/player/[player]/index.svelte6
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, '&amp;').replace(/</g, '&lt;').replace(/>/g, '&gt;')
}
}
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