diff --git a/package-lock.json b/package-lock.json index 078c586..7847346 100644 --- a/package-lock.json +++ b/package-lock.json @@ -18,7 +18,8 @@ "sqlite3": "^5.1.7", "typeorm": "^0.3.20", "uuid": "^9.0.1", - "vite-plugin-vsharp": "^1.7.3" + "vite-plugin-vsharp": "^1.7.3", + "ws": "^8.16.0" }, "devDependencies": { "@sveltejs/adapter-auto": "^3.0.0", @@ -28,6 +29,7 @@ "@types/cookie": "^0.6.0", "@types/jsonwebtoken": "^9.0.6", "@types/uuid": "^9.0.8", + "@types/ws": "^8.5.10", "autoprefixer": "^10.4.16", "express": "^4.18.3", "flowbite": "^2.3.0", @@ -1606,6 +1608,15 @@ "resolved": "https://registry.npmjs.org/@types/validator/-/validator-13.11.9.tgz", "integrity": "sha512-FCTsikRozryfayPuiI46QzH3fnrOoctTjvOYZkho9BTFLCOZ2rgZJHMOVgCOfttjPJcgOx52EpkY0CMfy87MIw==" }, + "node_modules/@types/ws": { + "version": "8.5.10", + "resolved": "https://registry.npmjs.org/@types/ws/-/ws-8.5.10.tgz", + "integrity": "sha512-vmQSUcfalpIq0R9q7uTo2lXs6eGIpt9wtnLdMv9LVpIjCA/+ufZRozlVoVelIYixx1ugCBKDhn89vnsEGOCx9A==", + "dev": true, + "dependencies": { + "@types/node": "*" + } + }, "node_modules/@yr/monotone-cubic-spline": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/@yr/monotone-cubic-spline/-/monotone-cubic-spline-1.0.3.tgz", @@ -7380,6 +7391,26 @@ "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==" }, + "node_modules/ws": { + "version": "8.16.0", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.16.0.tgz", + "integrity": "sha512-HS0c//TP7Ina87TfiPUz1rQzMhHrl/SG2guqRcTOIUYD2q8uhUdNHZYJUaQ8aTGPzCh+c6oawMKW35nFl1dxyQ==", + "engines": { + "node": ">=10.0.0" + }, + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": ">=5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } + } + }, "node_modules/y18n": { "version": "5.0.8", "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", diff --git a/package.json b/package.json index 30eb9bd..95c26d6 100644 --- a/package.json +++ b/package.json @@ -20,6 +20,7 @@ "@types/cookie": "^0.6.0", "@types/jsonwebtoken": "^9.0.6", "@types/uuid": "^9.0.8", + "@types/ws": "^8.5.10", "autoprefixer": "^10.4.16", "express": "^4.18.3", "flowbite": "^2.3.0", @@ -53,6 +54,7 @@ "sqlite3": "^5.1.7", "typeorm": "^0.3.20", "uuid": "^9.0.1", - "vite-plugin-vsharp": "^1.7.3" + "vite-plugin-vsharp": "^1.7.3", + "ws": "^8.16.0" } } diff --git a/src/components/Room.svelte b/src/components/Room.svelte index 4d58d5e..b520311 100644 --- a/src/components/Room.svelte +++ b/src/components/Room.svelte @@ -5,13 +5,56 @@
-

{room.name}

+

{room.name} ({room.preferredGameName || "No preferred game"})

{room.description}

+
+ {room.players.length} / {room.maxPlayers} | {#if room.players.length > 4} + {#each room.players.slice(0, 4) as player} + {player.nickname}{#if player !== room.players[3]},{" "} + {/if} + {/each} + and {room.players.length - 4} + {room.players.length - 4 === 1 ? "other" : "others"} + {:else} + {#each room.players as player} + {player.nickname}{#if player !== room.players[room.players.length - 1]},{" "} + {/if} + {/each} + {/if} | {room.hasPassword ? "Private" : "Public"} +
+
+ {room.address}:{room.port} +
diff --git a/src/hooks.server.ts b/src/hooks.server.ts index d7cbce9..2e51b8b 100644 --- a/src/hooks.server.ts +++ b/src/hooks.server.ts @@ -2,9 +2,25 @@ import { db } from "$lib/server/db"; import "reflect-metadata"; import { building } from "$app/environment"; import type { Handle } from "@sveltejs/kit"; +import {WebSocketServer} from "ws"; + +let server: WebSocketServer; + +function initServer() { + server = new WebSocketServer({ + port: 21563, + path: "/net" + }); + server.on("connection", (socket) => { + socket.on("message", (data) => { + socket.send(data); + }) + }) +} const runAllTheInitFunctions = async () => { if (!db.isInitialized) await db.initialize(); + if (!server) initServer(); }; if (!building) { diff --git a/src/routes/account/+page.svelte b/src/routes/account/+page.svelte index 1be18b6..f790259 100644 --- a/src/routes/account/+page.svelte +++ b/src/routes/account/+page.svelte @@ -46,6 +46,31 @@ alert("Failed to delete account: " + response.error); } } + + async function getWsMessage(event: MessageEvent): Promise { + return new Promise((resolve, reject) => { + if (event.data instanceof Blob) { + const reader = new FileReader(); + + reader.onload = () => { + resolve((reader.result as string) || ""); + }; + + reader.readAsText(event.data); + } else { + resolve(event.data); + } + }); + } + + onMount(() => { + const ws = new WebSocket("wss://sjqr2hlh-21563.uks1.devtunnels.ms/net"); + ws.onmessage = async (event) => { + const msg = await getWsMessage(event); + console.log(msg); + }; + ws.onopen = () => ws.send("hello, world"); + });
@@ -68,9 +93,13 @@

Rooms

- {#each data.rooms as room} - - {/each} + {#if data.rooms.length > 0} + {#each data.rooms as room} + + {/each} + {:else} +

No rooms are currently being hosted.

+ {/if}
@@ -87,6 +116,8 @@ max-width: 1000px; padding: 28px 36px; padding-top: 12px; + display: flex; + flex-direction: column; } .main-panel > h2 { @@ -113,4 +144,21 @@ margin-top: 4px; margin-bottom: 16px; } + + .rooms { + margin-top: -16px; + display: flex; + flex-direction: column; + gap: 24px; + height: 0px; + flex-grow: 1; + overflow-y: auto; + --mask-image: linear-gradient(transparent, black 8px, black calc(100% - 32px), transparent), + linear-gradient(to left, black 8px, transparent 8px); + padding-top: 8px; + padding-bottom: 32px; + mask-image: var(--mask-image); + -webkit-mask-image: var(--mask-image); + background-color: transparent; + } diff --git a/src/routes/lobby/[id]/+server.ts b/src/routes/lobby/[id]/+server.ts index c31ad74..b85cea8 100644 --- a/src/routes/lobby/[id]/+server.ts +++ b/src/routes/lobby/[id]/+server.ts @@ -11,8 +11,10 @@ export async function POST({ request, params }) { const user = await useAuth(request.headers.get("authorization") || ""); if (!user) return new Response(null, { status: 401 }); if (user.id !== room.host.id) return new Response(null, { status: 401 }); - console.log(body.players); - room.setPlayerList(body.players); + if (body.players.length === 0 && room.roomInfo.owner) { + console.log(room.roomInfo.players); + room.setPlayerList([{ gameId: 0, gameName: "", nickname: room.roomInfo.owner }]); + } return json({ message: "Lobby updated successfully" }); }