// bc.js (или server.js - ваш основной файл сервера) // КОД ОСТАЕТСЯ БЕЗ ИЗМЕНЕНИЙ ОТНОСИТЕЛЬНО ПРЕДЫДУЩЕЙ ВЕРСИИ, // ГДЕ УЖЕ БЫЛА ДОБАВЛЕНА ПЕРЕДАЧА characterKey В GameManager const express = require('express'); const http = require('http'); const socketIo = require('socket.io'); const path = require('path'); // Серверные модули const GameManager = require('./server_modules/gameManager'); // GameManager будет изменен const authController = require('./server_modules/auth'); const hostname = 'localhost'; const app = express(); const server = http.createServer(app); const io = socketIo(server); const PORT = process.env.PORT || 3200; app.use(express.static(path.join(__dirname, 'public'))); const gameManager = new GameManager(io); // GameManager будет содержать новую логику io.on('connection', (socket) => { console.log('[Server] New client connected:', socket.id); const availableGames = gameManager.getAvailablePvPGamesListForClient(); socket.emit('availablePvPGamesList', availableGames); socket.on('requestPvPGameList', () => { const currentAvailableGames = gameManager.getAvailablePvPGamesListForClient(); socket.emit('availablePvPGamesList', currentAvailableGames); }); socket.on('register', async (data) => { console.log(`[Server BC.JS] Received 'register' event from ${socket.id} with username: ${data?.username}`); if (!data || typeof data.username !== 'string' || typeof data.password !== 'string') { socket.emit('registerResponse', { success: false, message: 'Некорректные данные запроса.' }); return; } const result = await authController.registerUser(data.username, data.password); socket.emit('registerResponse', result); }); socket.on('login', async (data) => { console.log(`[Server BC.JS] Received 'login' event from ${socket.id} with username: ${data?.username}`); if (!data || typeof data.username !== 'string' || typeof data.password !== 'string') { socket.emit('loginResponse', { success: false, message: 'Некорректные данные запроса.' }); return; } const result = await authController.loginUser(data.username, data.password); if (result.success) { socket.userData = { userId: result.userId, username: result.username }; // Сохраняем userId console.log(`[Server BC.JS] User ${result.username} (ID: ${result.userId}) associated with socket ${socket.id}. Welcome!`); } socket.emit('loginResponse', result); }); socket.on('logout', () => { const username = socket.userData?.username || socket.id; console.log(`[Server BC.JS] Received 'logout' event from ${username}.`); if (socket.userData) { gameManager.handleDisconnect(socket.id); // Обработает выход из игр delete socket.userData; console.log(`[Server BC.JS] User data cleared for ${username}.`); } }); socket.on('createGame', (data) => { if (!socket.userData) { socket.emit('gameError', { message: "Ошибка: Вы не авторизованы для создания игры." }); return; } const mode = data?.mode || 'ai'; const characterKey = (data?.characterKey === 'almagest') ? 'almagest' : 'elena'; console.log(`[Server BC.JS] User ${socket.userData.username} (socket: ${socket.id}) requests createGame. Mode: ${mode}, Character: ${characterKey}`); // Передаем socket.userData.userId в GameManager, если он нужен для идентификации пользователя между сессиями gameManager.createGame(socket, mode, characterKey, socket.userData.userId); }); socket.on('joinGame', (data) => { if (!socket.userData) { socket.emit('gameError', { message: "Ошибка: Вы не авторизованы для присоединения к игре." }); return; } console.log(`[Server BC.JS] User ${socket.userData.username} (socket: ${socket.id}) requests joinGame for ID: ${data?.gameId}`); if (data && typeof data.gameId === 'string') { // Передаем socket.userData.userId gameManager.joinGame(socket, data.gameId, socket.userData.userId); } else { socket.emit('gameError', { message: 'Ошибка присоединения: неверный формат ID игры.' }); } }); socket.on('findRandomGame', (data) => { if (!socket.userData) { socket.emit('gameError', { message: "Ошибка: Вы не авторизованы для поиска игры." }); return; } const characterKey = (data?.characterKey === 'almagest') ? 'almagest' : 'elena'; console.log(`[Server BC.JS] User ${socket.userData.username} (socket: ${socket.id}) requests findRandomGame. Preferred Character: ${characterKey}`); // Передаем socket.userData.userId gameManager.findAndJoinRandomPvPGame(socket, characterKey, socket.userData.userId); }); socket.on('playerAction', (data) => { if (!socket.userData) return; gameManager.handlePlayerAction(socket.id, data); }); socket.on('requestRestart', (data) => { if (!socket.userData) { socket.emit('gameError', { message: "Ошибка: Вы не авторизованы для запроса рестарта." }); return; } console.log(`[Server BC.JS] User ${socket.userData.username} (socket: ${socket.id}) requests restart for game ID: ${data?.gameId}`); if (data && typeof data.gameId === 'string') { gameManager.requestRestart(socket.id, data.gameId); } else { socket.emit('gameError', { message: 'Ошибка рестарта: неверный формат ID игры.' }); } }); socket.on('disconnect', (reason) => { const username = socket.userData?.username || socket.id; console.log(`[Server] Client ${username} disconnected. Reason: ${reason}. Socket ID: ${socket.id}`); // Передаем userId, если он есть, для более точной обработки в GameManager const userId = socket.userData?.userId; gameManager.handleDisconnect(socket.id, userId); // socket.userData автоматически очистится для этого объекта socket }); }); server.listen(PORT, hostname, () => { console.log(`Server listening on http://${hostname}:${PORT}`); });