From adc2cd0d0f006776ccb982a19a98934cd8855132 Mon Sep 17 00:00:00 2001 From: mat Date: Sat, 19 Mar 2022 15:42:03 -0500 Subject: Add random backgrounds for players based on UUID --- scripts/updateBackgrounds.js | 2 + src/_backgrounds.json | 2 +- src/env.ts | 25 --------- src/lib/BackgroundImage.svelte | 30 ++++++----- src/lib/backgrounds.ts | 37 ++++++++++++++ src/lib/env.ts | 25 +++++++++ src/lib/minecraft/inventory.ts | 2 +- src/lib/packs.ts | 36 +++++++++++++ src/lib/profile.ts | 2 +- src/lib/sections/Collections.svelte | 5 +- src/routes/index.svelte | 2 - src/routes/leaderboards/[name].svelte | 6 +-- src/routes/login.ts | 2 +- src/routes/player/[player]/[profile].svelte | 79 ++++++++++------------------- src/routes/player/[player]/index.svelte | 9 +++- src/routes/profile/index.svelte | 1 + src/routes/profile/update.ts | 2 +- src/routes/verify.ts | 2 +- 18 files changed, 163 insertions(+), 106 deletions(-) delete mode 100644 src/env.ts create mode 100644 src/lib/backgrounds.ts create mode 100644 src/lib/env.ts create mode 100644 src/lib/packs.ts diff --git a/scripts/updateBackgrounds.js b/scripts/updateBackgrounds.js index 425e2fe..0c3e214 100644 --- a/scripts/updateBackgrounds.js +++ b/scripts/updateBackgrounds.js @@ -6,6 +6,8 @@ const imagePool = new ImagePool(cpus().length) // read the file names in the backgrounds folder const backgrounds = await fs.readdir('static/backgrounds') +// sort by natural order +backgrounds.sort((a, b) => a.localeCompare(b, 'en', { numeric: true, ignorePunctuation: true })) await fs.writeFile( 'src/_backgrounds.json', diff --git a/src/_backgrounds.json b/src/_backgrounds.json index e3737b5..b3f937a 100644 --- a/src/_backgrounds.json +++ b/src/_backgrounds.json @@ -1 +1 @@ -["1.jpg","10.jpg","11.jpg","12.jpg","13.jpg","14.jpg","15.jpg","16.jpg","17.jpg","18.jpg","19.jpg","2.jpg","20.jpg","21.jpg","22.jpg","23.jpg","24.jpg","25.jpg","26.jpg","27.jpg","28.jpg","29.jpg","3.jpg","30.jpg","31.jpg","32.jpg","33.jpg","34.jpg","35.jpg","36.jpg","37.jpg","38.jpg","39.jpg","4.jpg","40.jpg","41.jpg","42.jpg","43.jpg","44.jpg","45.jpg","46.jpg","47.jpg","48.jpg","49.jpg","5.jpg","50.jpg","51.jpg","52.jpg","53.jpg","54.jpg","55.jpg","56.jpg","57.jpg","58.jpg","59.jpg","6.jpg","60.jpg","61.jpg","62.jpg","63.jpg","64.jpg","65.jpg","66.jpg","67.jpg","68.jpg","69.jpg","7.jpg","70.jpg","71.jpg","8.jpg","9.jpg"] \ No newline at end of file +["1.jpg","2.jpg","3.jpg","4.jpg","5.jpg","6.jpg","7.jpg","8.jpg","9.jpg","10.jpg","11.jpg","12.jpg","13.jpg","14.jpg","15.jpg","16.jpg","17.jpg","18.jpg","19.jpg","20.jpg","21.jpg","22.jpg","23.jpg","24.jpg","25.jpg","26.jpg","27.jpg","28.jpg","29.jpg","30.jpg","31.jpg","32.jpg","33.jpg","34.jpg","35.jpg","36.jpg","37.jpg","38.jpg","39.jpg","40.jpg","41.jpg","42.jpg","43.jpg","44.jpg","45.jpg","46.jpg","47.jpg","48.jpg","49.jpg","50.jpg","51.jpg","52.jpg","53.jpg","54.jpg","55.jpg","56.jpg","57.jpg","58.jpg","59.jpg","60.jpg","61.jpg","62.jpg","63.jpg","64.jpg","65.jpg","66.jpg","67.jpg","68.jpg","69.jpg","70.jpg","71.jpg"] \ No newline at end of file diff --git a/src/env.ts b/src/env.ts deleted file mode 100644 index 2f0a632..0000000 --- a/src/env.ts +++ /dev/null @@ -1,25 +0,0 @@ -let skyblockStatsApiKey: string | undefined -let discordClientId: string | undefined - -export default function env(platform?: Readonly) { - try { - skyblockStatsApiKey = process.env.SKYBLOCK_STATS_API_KEY - } catch { - skyblockStatsApiKey = platform?.env.SKYBLOCK_STATS_API_KEY - } - if (!skyblockStatsApiKey) - console.warn('SKYBLOCK_STATS_API_KEY is not set as an environment variable. This is required for logging in with Discord to work. It should be the same as the `key` environment variable in skyblock-api.') - - try { - discordClientId = process.env.DISCORD_CLIENT_ID - } catch { - discordClientId = platform?.env.DISCORD_CLIENT_ID - } - if (!discordClientId) - console.warn('DISCORD_CLIENT_ID is not set as an environment variable. This is required for logging in with Discord to work.') - - return { - SKYBLOCK_STATS_API_KEY: skyblockStatsApiKey, - DISCORD_CLIENT_ID: discordClientId, - } -} \ No newline at end of file diff --git a/src/lib/BackgroundImage.svelte b/src/lib/BackgroundImage.svelte index 94bbc3f..fd62170 100644 --- a/src/lib/BackgroundImage.svelte +++ b/src/lib/BackgroundImage.svelte @@ -1,26 +1,30 @@ - - - {@html bodyStyle} - diff --git a/src/lib/backgrounds.ts b/src/lib/backgrounds.ts new file mode 100644 index 0000000..06157b8 --- /dev/null +++ b/src/lib/backgrounds.ts @@ -0,0 +1,37 @@ +// a hand picked list of backgrounds that i think look pretty good on the user profile +const coolBackgrounds = [ + '2.jpg', + '4.jpg', + '5.jpg', + '7.jpg', + '8.jpg', + '11.jpg', + '12.jpg', + '15.jpg', + '22.jpg', + '27.jpg', + '35.jpg', + '38.jpg', + '43.jpg', + '45.jpg', + '49.jpg', + '63.jpg', + '65.jpg', + '66.jpg', + '67.jpg', + '68.jpg', + '69.jpg', + '70.jpg', + '71.jpg', +] + +/** + * Choose a background for the user based on their UUID. + * @param uuid The dashed or undashed UUID of the user. + * @returns The URL of the chosen background. + */ +export function chooseDefaultBackground(uuid: string): string { + // choose a background based on the user's uuid + const uuidNumber = parseInt(uuid.replace(/[^0-9]/g, ''), 16) + return '/backgrounds/' + coolBackgrounds[uuidNumber % coolBackgrounds.length] +} diff --git a/src/lib/env.ts b/src/lib/env.ts new file mode 100644 index 0000000..2f0a632 --- /dev/null +++ b/src/lib/env.ts @@ -0,0 +1,25 @@ +let skyblockStatsApiKey: string | undefined +let discordClientId: string | undefined + +export default function env(platform?: Readonly) { + try { + skyblockStatsApiKey = process.env.SKYBLOCK_STATS_API_KEY + } catch { + skyblockStatsApiKey = platform?.env.SKYBLOCK_STATS_API_KEY + } + if (!skyblockStatsApiKey) + console.warn('SKYBLOCK_STATS_API_KEY is not set as an environment variable. This is required for logging in with Discord to work. It should be the same as the `key` environment variable in skyblock-api.') + + try { + discordClientId = process.env.DISCORD_CLIENT_ID + } catch { + discordClientId = platform?.env.DISCORD_CLIENT_ID + } + if (!discordClientId) + console.warn('DISCORD_CLIENT_ID is not set as an environment variable. This is required for logging in with Discord to work.') + + return { + SKYBLOCK_STATS_API_KEY: skyblockStatsApiKey, + DISCORD_CLIENT_ID: discordClientId, + } +} \ No newline at end of file diff --git a/src/lib/minecraft/inventory.ts b/src/lib/minecraft/inventory.ts index e9d840c..7bd06fc 100644 --- a/src/lib/minecraft/inventory.ts +++ b/src/lib/minecraft/inventory.ts @@ -1,5 +1,5 @@ import * as skyblockAssets from 'skyblock-assets' -import vanilla from 'skyblock-assets/matchers/vanilla.json' +import { vanilla } from '$lib/packs' export interface Item { diff --git a/src/lib/packs.ts b/src/lib/packs.ts new file mode 100644 index 0000000..01afee5 --- /dev/null +++ b/src/lib/packs.ts @@ -0,0 +1,36 @@ +import type { MatcherFile } from 'skyblock-assets' +export { default as vanilla } from 'skyblock-assets/matchers/vanilla.json' + +export const PACK_NAMES = { + 'ectoplasm': 'Ectoplasm', + 'furfsky': 'Furfsky', + 'furfsky_reborn': 'Furfsky Reborn', + 'hypixel+': 'Hypixel+', + 'packshq': 'PacksHQ', + 'rnbw': 'RNBW', + 'vanilla': 'Vanilla', + 'worlds_and_beyond': 'Worlds and Beyond', +} + +export async function loadPack(name?: keyof typeof PACK_NAMES | string): Promise { + switch (name) { + case 'ectoplasm': + return await import('skyblock-assets/matchers/ectoplasm.json') as any + case 'furfsky': + return await import('skyblock-assets/matchers/furfsky.json') as any + case 'furfsky_reborn': + return await import('skyblock-assets/matchers/furfsky_reborn.json') as any + case 'hypixel+': + return await import('skyblock-assets/matchers/hypixel+.json') as any + case 'packshq': + return await import('skyblock-assets/matchers/packshq.json') as any + case 'rnbw': + return await import('skyblock-assets/matchers/rnbw.json') as any + case 'vanilla': + return await import('skyblock-assets/matchers/vanilla.json') as any + case 'worlds_and_beyond': + return await import('skyblock-assets/matchers/worlds_and_beyond.json') as any + } + // if we can't find the pack, just return furfsky reborn + return await loadPack('furfsky_reborn') +} \ No newline at end of file diff --git a/src/lib/profile.ts b/src/lib/profile.ts index 62620e4..d2891ab 100644 --- a/src/lib/profile.ts +++ b/src/lib/profile.ts @@ -56,4 +56,4 @@ export function generateInfobox(data: CleanMemberProfile): string[] { } return result -} \ No newline at end of file +} diff --git a/src/lib/sections/Collections.svelte b/src/lib/sections/Collections.svelte index ca2da16..a2bd124 100644 --- a/src/lib/sections/Collections.svelte +++ b/src/lib/sections/Collections.svelte @@ -1,12 +1,13 @@ -{#if data.customization?.backgroundUrl} - +{#if backgroundUrl} + {/if}
- {#if data.customization?.blurBackground && data.customization?.backgroundUrl} + {#if data.customization?.blurBackground && backgroundUrl}
- Background + Background
{/if} @@ -180,7 +157,7 @@

Collections

- +
{/if} diff --git a/src/routes/player/[player]/index.svelte b/src/routes/player/[player]/index.svelte index 97b7d78..95156f9 100644 --- a/src/routes/player/[player]/index.svelte +++ b/src/routes/player/[player]/index.svelte @@ -32,6 +32,7 @@ import Username from '$lib/minecraft/Username.svelte' import Header from '$lib/Header.svelte' import Head from '$lib/Head.svelte' + import { chooseDefaultBackground } from '$lib/backgrounds' export let data: CleanUser @@ -53,10 +54,14 @@ isActiveProfileOnline = Date.now() / 1000 - 60 < activeProfileLastSave } + + $: backgroundUrl = + data.customization?.backgroundUrl ?? + (data.player ? chooseDefaultBackground(data.player.uuid) : null) -{#if data.customization?.backgroundUrl} - +{#if backgroundUrl} + {/if} diff --git a/src/routes/profile/index.svelte b/src/routes/profile/index.svelte index cdcd495..a69afc5 100644 --- a/src/routes/profile/index.svelte +++ b/src/routes/profile/index.svelte @@ -170,6 +170,7 @@ class="selectable-background-option" class:selected={thisBackgroundName === backgroundName} style="background-image: url(/backgrounds-small/{thisBackgroundName})" + title={thisBackgroundName} on:click={() => (backgroundName = thisBackgroundName)} /> {/each} diff --git a/src/routes/profile/update.ts b/src/routes/profile/update.ts index 8eb108c..7946597 100644 --- a/src/routes/profile/update.ts +++ b/src/routes/profile/update.ts @@ -5,7 +5,7 @@ import backgroundFileNames from '../../_backgrounds.json' import donators from '../../_donators.json' import admins from '../../_admins.json' import type { JSONValue } from '@sveltejs/kit/types/internal' -import env from '../../env' +import env from '$lib/env' const emojiRegex = /^(\u00a9|\u00ae|[\u2000-\u3300]|\ud83c[\ud000-\udfff]|\ud83d[\ud000-\udfff]|\ud83e[\ud000-\udfff])$/ diff --git a/src/routes/verify.ts b/src/routes/verify.ts index 1368344..2f9c49f 100644 --- a/src/routes/verify.ts +++ b/src/routes/verify.ts @@ -1,7 +1,7 @@ import { API_URL } from '$lib/api' import type { AccountSchema, CleanUser, SessionSchema } from '$lib/APITypes' import type { RequestHandler } from '@sveltejs/kit' -import env from '../env' +import env from '$lib/env' function redirect(status: number, location: string) { -- cgit