bc/bc.js
2025-05-13 04:14:01 +00:00

137 lines
6.9 KiB
JavaScript
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

// 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}`);
});