137 lines
6.9 KiB
JavaScript
137 lines
6.9 KiB
JavaScript
// 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}`);
|
||
}); |