109 lines
2.4 KiB
TypeScript
109 lines
2.4 KiB
TypeScript
import { shuffleArray } from '$lib/utils';
|
|
import { nanoid } from 'nanoid';
|
|
import type { PageServerLoad } from './$types';
|
|
import type { AlbumSolveState } from '$lib/types';
|
|
import { albumState } from '$lib/server/AlbumState.svelte';
|
|
import { playerState } from '$lib/server/PlayerState.svelte';
|
|
|
|
const count = 3;
|
|
|
|
export const load: PageServerLoad = async ({ fetch, locals }) => {
|
|
const { session } = locals;
|
|
|
|
if (!session?.data?.userId) {
|
|
await session.setData({ userId: nanoid() });
|
|
await session.save();
|
|
}
|
|
|
|
const user = session.data.userId;
|
|
let stage = playerState.getStage(user);
|
|
|
|
if (!stage) {
|
|
playerState.newPlayer(user);
|
|
stage = playerState.getStage(user);
|
|
}
|
|
|
|
const highscore = playerState.getHighscore(user);
|
|
|
|
if (!playerState.getPlaying(user)) {
|
|
return {
|
|
stage: stage,
|
|
highscore: highscore,
|
|
playing: false
|
|
};
|
|
}
|
|
|
|
const albumData = fetch(`/api/pakubiiti/getAlbums/${count}`)
|
|
.then((res) => {
|
|
return res.json();
|
|
})
|
|
.then((data) => {
|
|
const albumNames = data.albums.map((album: AlbumSolveState) => ({
|
|
id: nanoid(),
|
|
value: album.name
|
|
}));
|
|
const albumImages = data.albums.map((album: AlbumSolveState) => ({
|
|
id: nanoid(),
|
|
value: album.image
|
|
}));
|
|
const albumArtists = data.albums.map((album: AlbumSolveState) => ({
|
|
id: nanoid(),
|
|
value: album.artists
|
|
}));
|
|
|
|
return {
|
|
names: shuffleArray(albumNames),
|
|
images: shuffleArray(albumImages),
|
|
artists: shuffleArray(albumArtists)
|
|
};
|
|
});
|
|
|
|
return {
|
|
stage: stage,
|
|
highscore: highscore,
|
|
playing: true,
|
|
streamed: { albums: albumData }
|
|
};
|
|
};
|
|
|
|
export const actions = {
|
|
submit: async ({ request, locals }) => {
|
|
const { session } = locals;
|
|
if (!session?.data?.userId) {
|
|
return;
|
|
}
|
|
|
|
const user = session.data.userId;
|
|
|
|
const data = await request.formData();
|
|
|
|
const state: AlbumSolveState[] = [];
|
|
|
|
for (let i = 0; i < count; i++) {
|
|
const name = data.get(`names_${i}`);
|
|
const image = data.get(`images_${i}`);
|
|
const artists = data.get(`artists_${i}`);
|
|
|
|
state.push({ name: name, image: image, artists: artists });
|
|
}
|
|
|
|
const solved = albumState.checkSolve(state);
|
|
|
|
playerState.score(user, solved);
|
|
|
|
return { solved: solved };
|
|
},
|
|
|
|
restart: async ({ locals }) => {
|
|
const { session } = locals;
|
|
if (!session?.data?.userId) {
|
|
return;
|
|
}
|
|
|
|
const user = session.data.userId;
|
|
|
|
playerState.restart(user);
|
|
|
|
return { solved: undefined };
|
|
}
|
|
};
|