diff --git a/src/lib/websocket.svelte.ts b/src/lib/websocket.svelte.ts new file mode 100644 index 0000000..6b16087 --- /dev/null +++ b/src/lib/websocket.svelte.ts @@ -0,0 +1,106 @@ +export enum SocketConnectionType { + NONE, + HOST, + DISPLAY +} + +const messages: string[] = $state([]); +let connectionType = $state(SocketConnectionType.NONE); + +let socket: WebSocket | undefined; + +const connectAsHost = () => { + if (socket !== undefined) return; + socket = new WebSocket("ws://127.0.0.1:12345"); + socket.addEventListener("open", onOpen(SocketConnectionType.HOST)); + socket.addEventListener("message", onFirstMessage); + socket.addEventListener("close", onClose); + socket.addEventListener("error", onError); +}; + +const connectAsDisplay = () => { + if (socket !== undefined) return; + socket = new WebSocket("ws://127.0.0.1:12345"); + socket.addEventListener("open", onOpen(SocketConnectionType.DISPLAY)); + socket.addEventListener("message", onFirstMessage); +}; + +const sendMessage = (obj: unknown) => { + if (socket === undefined) return; + if (socket.readyState <= 1) { + try { + socket.send(JSON.stringify(obj)); + } catch { + console.error(`Could not send ${obj}`); + } + } +}; + +function onOpen(type: SocketConnectionType) { + return (event: Event) => { + console.log("Connection established"); + console.log(event); + if (socket === undefined) return; + socket.send(type == SocketConnectionType.HOST ? "HOST" : "DISPLAY"); + }; +} + +// eslint-disable-next-line @typescript-eslint/no-explicit-any +function onFirstMessage(event: MessageEvent) { + if (socket === undefined) return; + console.log(event.data); + if (event.data === "HOST") { + connectionType = SocketConnectionType.HOST; + socket.removeEventListener("message", onFirstMessage); + socket.addEventListener("message", onMessage); + } else if (event.data === "DISPLAY") { + connectionType = SocketConnectionType.DISPLAY; + socket.removeEventListener("message", onFirstMessage); + socket.addEventListener("message", onMessage); + } else { + console.error("Failed to register"); + socket.close(); + socket = undefined; + } +} + +// eslint-disable-next-line @typescript-eslint/no-explicit-any +function onMessage(event: MessageEvent) { + messages.push(event.data); +} + +function onClose(event: CloseEvent) { + console.log("Connection closed"); + console.log(event); + connectionType = SocketConnectionType.NONE; + if (socket === undefined) return; + socket.close(); + socket = undefined; +} + +function onError(event: Event) { + console.error("Websocket error occured"); + console.error(event); + connectionType = SocketConnectionType.NONE; + if (socket === undefined) return; + socket.close(); + socket = undefined; +} + +export default { + get message() { + return messages[0]; + }, + nextMessage() { + return messages.shift(); + }, + get messageNum() { + return messages.length; + }, + get connectionType() { + return connectionType; + }, + sendMessage, + connectAsHost, + connectAsDisplay +}; diff --git a/src/routes/+layout.svelte b/src/routes/+layout.svelte index 8c56a3c..07409f8 100644 --- a/src/routes/+layout.svelte +++ b/src/routes/+layout.svelte @@ -1,12 +1,12 @@ - + {@render children?.()} diff --git a/src/routes/+page.svelte b/src/routes/+page.svelte index e7e2fed..822c120 100644 --- a/src/routes/+page.svelte +++ b/src/routes/+page.svelte @@ -1,14 +1,28 @@ - - -

Jeopardy

- -
- {#each data.games as game, i} - {game.name} - {/each} -
+ + +
+

Jeopardy

+ +
+ + +
+
diff --git a/src/routes/connected/+layout.svelte b/src/routes/connected/+layout.svelte new file mode 100644 index 0000000..57794d1 --- /dev/null +++ b/src/routes/connected/+layout.svelte @@ -0,0 +1,14 @@ + + +{@render children?.()} diff --git a/src/routes/connected/display/+page.svelte b/src/routes/connected/display/+page.svelte new file mode 100644 index 0000000..7b18919 --- /dev/null +++ b/src/routes/connected/display/+page.svelte @@ -0,0 +1,15 @@ + + +
+

Waiting for game to start

+
diff --git a/src/routes/+page.server.ts b/src/routes/connected/games/+page.server.ts similarity index 100% rename from src/routes/+page.server.ts rename to src/routes/connected/games/+page.server.ts diff --git a/src/routes/connected/games/+page.svelte b/src/routes/connected/games/+page.svelte new file mode 100644 index 0000000..c9acd01 --- /dev/null +++ b/src/routes/connected/games/+page.svelte @@ -0,0 +1,14 @@ + + +

Games

+ +
+ {#each data.games as game, i} + {game.name} + {/each} +
diff --git a/src/routes/[game]/+page.server.ts b/src/routes/connected/games/[game]/+page.server.ts similarity index 100% rename from src/routes/[game]/+page.server.ts rename to src/routes/connected/games/[game]/+page.server.ts diff --git a/src/routes/[game]/+page.svelte b/src/routes/connected/games/[game]/+page.svelte similarity index 61% rename from src/routes/[game]/+page.svelte rename to src/routes/connected/games/[game]/+page.svelte index edccb86..fb9f894 100644 --- a/src/routes/[game]/+page.svelte +++ b/src/routes/connected/games/[game]/+page.svelte @@ -3,6 +3,24 @@ import type { Player } from "./Player"; import { GameState } from "./GameState"; import type { Game } from "$lib/games/games"; + import ws from "$lib/websocket.svelte"; + import { page } from "$app/state"; + + let startDisabled = $state(true); + let _startDisabled = true; + + $effect(() => { + if (!ws.message) return; + console.log(ws.message); + if (ws.nextMessage() == "DISPLAY-CONNECTED") { + if (!_startDisabled) { + gameManager?.sendStart(); + gameManager?.sendCurrentState(); + } + _startDisabled = false; + startDisabled = false; + } + }); class GameManager { public state: GameState = $state(GameState.INIT); @@ -17,8 +35,26 @@ } startGame(): void { - this.state = GameState.RUNNING; - console.log("hello"); + this.state = GameState.CHOOSING_QUESTION; + this.sendStart(); + this.sendCurrentState(); + } + + sendStart(): void { + ws.sendMessage({ + type: "start" + }); + } + + sendCurrentState(): void { + ws.sendMessage({ + type: "players", + players + }); + ws.sendMessage({ + type: "goto", + route: `/${page.params.game}/${this.currentWall}` + }); } } @@ -57,7 +93,9 @@

Spieler

- +
{#each gameManager.players as player, i} diff --git a/src/routes/[game]/GameState.ts b/src/routes/connected/games/[game]/GameState.ts similarity index 58% rename from src/routes/[game]/GameState.ts rename to src/routes/connected/games/[game]/GameState.ts index 4956b39..5096ed4 100644 --- a/src/routes/[game]/GameState.ts +++ b/src/routes/connected/games/[game]/GameState.ts @@ -1,4 +1,4 @@ export enum GameState { INIT, - RUNNING + CHOOSING_QUESTION } diff --git a/src/routes/[game]/Player.ts b/src/routes/connected/games/[game]/Player.ts similarity index 100% rename from src/routes/[game]/Player.ts rename to src/routes/connected/games/[game]/Player.ts diff --git a/src/routes/[game]/Wall.svelte b/src/routes/connected/games/[game]/Wall.svelte similarity index 100% rename from src/routes/[game]/Wall.svelte rename to src/routes/connected/games/[game]/Wall.svelte