feat: chat v lobby
CI / Generate TypeScript types (push) Successful in 10s
CI / Server unit tests (push) Successful in 27s
CI / Build server (push) Successful in 31s
CI / Build client (push) Successful in 49s
CI / Playwright E2E tests (push) Successful in 2m35s
CI / Build and push Docker image (push) Successful in 1m4s
CI / Notify (push) Successful in 2s

This commit is contained in:
Vít Kilián committed 2026-10-21 11:52:08 +02:00
1 parent 9a3987a2fa
commit 2a5eb07778
11 files changed
+130 -2

No files matched your search

+2 -1
View File
@@ -1,3 +1,4 @@
[
"U oběda v restauraci si můžete zadat cenu (ikonka cenovky u vaší volby) — promítne se do měsíčního přehledu stravování a předvyplní se i v „Zaplatit za všechny“"
"U oběda v restauraci si můžete zadat cenu (ikonka cenovky u vaší volby) — promítne se do měsíčního přehledu stravování a předvyplní se i v „Zaplatit za všechny“",
"V lobby miniher (Pong, Reakční hra, Had, Tetris, Tanky) si hráči mohou psát v chatu, emotikony se vkládají jedním kliknutím 😉"
]
+17 -1
View File
@@ -1,4 +1,4 @@
import { Socket } from "socket.io";
import { Server, Socket } from "socket.io";
import { getLogin } from "./auth";
/** Sdílené pomůcky pro websocketové minihry (reakční hra, had). */
@@ -60,3 +60,19 @@ export function gameHandler(socket: Socket, errorEvent: string, action: (login:
/** Minimální počet hráčů — lokálně lze hrát i sám. */
export const minPlayersForEnv = (prod: number) => process.env.NODE_ENV === 'development' ? 1 : prod;
/**
* Jednoduchý chat v lobby miniher — zprávy se nikde neukládají, server je jen
* přepošle všem (klient si je filtruje podle hry).
*/
export function registerLobbyChat(io: Server) {
io.on('connection', socket => {
socket.on('lobbychat:send', gameHandler(socket, 'lobbychat:error', (login, payload) => {
const { game, text } = (payload ?? {}) as { game?: unknown, text?: unknown };
if (typeof game !== 'string' || typeof text !== 'string') return;
const trimmed = text.trim().slice(0, 200);
if (!trimmed) return;
io.emit('lobbychat:message', { game: game.slice(0, 20), login, text: trimmed });
}));
});
}
+2
View File
@@ -7,6 +7,7 @@ import { registerTetrisGame } from "./tetrisGame";
import { registerPongGame } from "./pongGame";
import { registerDrawingGame } from "./drawingGame";
import { registerTankGame } from "./tankGame";
import { registerLobbyChat } from "./minigames";
let io: Server<DefaultEventsMap, DefaultEventsMap, DefaultEventsMap, any>;
let pubClient: ReturnType<typeof createClient>;
@@ -40,6 +41,7 @@ export const initWebsocket = (server: any) => {
registerPongGame(io);
registerDrawingGame(io);
registerTankGame(io);
registerLobbyChat(io);
return io;
};