// bc.js - Главный файл сервера Battle Club
const express = require('express');
const http = require('http'); // Используем HTTP, так как SSL терминируется Apache
const { Server } = require('socket.io');
const path = require('path');
// Импорт ваших серверных модулей (предполагаем, что они есть и работают)
// const auth = require('./server_modules/auth');
// const GameManager = require('./server_modules/gameManager');
// const db = require('./server_modules/db');
// const GAME_CONFIG = require('./server_modules/config');
const app = express();
const server = http.createServer(app);
const BC_APP_INTERNAL_PORT = 3200; // Внутренний порт, на котором слушает bc.js
const BC_APP_INTERNAL_HOST = '127.0.0.1'; // Слушать только на localhost
const PUBLIC_PATH_PREFIX = '/battleclub'; // Публичный префикс пути, по которому приложение доступно через Apache
// Настройка Socket.IO
// Клиент будет подключаться к /battleclub/socket.io/
const io = new Server(server, {
path: `${PUBLIC_PATH_PREFIX}/socket.io`,
cors: {
origin: "https://pavel-chagovsky.com", // Укажите ваш домен для безопасности
// origin: "*", // Для разработки можно оставить, но для продакшена лучше конкретный домен
methods: ["GET", "POST"]
}
});
// Middleware для логирования каждого запроса (полезно для отладки)
app.use((req, res, next) => {
console.log(`[BC App] Request: ${req.method} ${req.originalUrl}`);
next();
});
// Раздача статических файлов из папки 'public'
// Так как Apache проксирует /battleclub/ на корень этого Express-приложения,
// Express должен отдавать статику от своего корня.
// В HTML ссылки на статику должны быть относительными или начинаться с /battleclub/
// Например, если в public/js/client.js, то в HTML:
// Или, если index.html отдается с /battleclub/, то
app.use(express.static(path.join(__dirname, 'public')));
// Пример простого маршрута API, если он нужен (доступен по /battleclub/api/test)
app.get('/api/test', (req, res) => {
res.json({ message: 'Battle Club API is working!' });
});
// Если ваше основное приложение - это SPA (Single Page Application),
// вам может понадобиться отдавать index.html для всех не-API и не-статических путей,
// начинающихся с префикса /battleclub/. Но так как Apache проксирует /battleclub/ на /,
// то Express будет видеть пути без /battleclub/.
// Поэтому, если index.html должен отдаваться для /battleclub/ или /battleclub/some/path,
// то здесь нужен роут для '*' или специфичные роуты.
// Пока для простоты, предположим, что Apache проксирует /battleclub/ на корень bc.js,
// и index.html находится в public/ и запрашивается как /battleclub/index.html (или просто /battleclub/)
app.get('/', (req, res) => {
// Этот роут будет срабатывать, если Apache проксировал /battleclub/ на / этого приложения
res.sendFile(path.join(__dirname, 'public', 'index.html'));
});
// --- Обработчики событий Socket.IO ---
io.on('connection', (socket) => {
console.log(`[BC App Socket.IO] User connected: ${socket.id} to path ${socket.nsp.name}`);
socket.on('messageFromClient', (data) => {
console.log(`[BC App Socket.IO] Message from client ${socket.id}:`, data);
socket.emit('messageFromServer', { text: `Server received: ${data.text}` });
});
socket.on('disconnect', (reason) => {
console.log(`[BC App Socket.IO] User disconnected: ${socket.id} (Reason: ${reason})`);
});
// ... ваши обработчики auth, GameManager и т.д. ...
// Убедитесь, что они не полагаются на префикс пути /battleclub/ во внутренних данных,
// так как Express его "не видит" после проксирования Apache.
});
// Запуск HTTP сервера
server.listen(BC_APP_INTERNAL_PORT, BC_APP_INTERNAL_HOST, () => {
console.log(`Battle Club HTTP Application Server running at http://${BC_APP_INTERNAL_HOST}:${BC_APP_INTERNAL_PORT}`);
console.log(`Socket.IO will be available via proxy at path: ${PUBLIC_PATH_PREFIX}/socket.io`);
console.log(`Serving static files from: ${path.join(__dirname, 'public')}`);
});
// Обработчики глобальных ошибок
process.on('unhandledRejection', (reason, promise) => {
console.error('[BC App UNHANDLED REJECTION] At:', promise, 'reason:', reason);
});
process.on('uncaughtException', (err) => {
console.error('[BC App UNCAUGHT EXCEPTION] Caught exception:', err);
// process.exit(1); // В продакшене может быть оправдано
});