const express = require("express"); const cors = require("cors"); const axios = require("axios"); const config = require("./config/config.js"); const initSockets = require("./sockets/socket.js"); const { Server } = require("socket.io"); const http = require("http"); const sequelize = require("./config/db.js"); const DatapackLoader = require("./game/DatapackLoader.js"); const path = require("path"); const app = express(); const economyService = require("./game/EconomyService.js"); app.use( cors({ origin: "http://localhost:5173", methods: ["GET", "POST"], credentials: true, }), ); app.use("/static", express.static(path.join(__dirname, "../datapacks"))); app.use(express.json()); const server = http.createServer(app); const io = new Server(server, { cors: { origin: "http://localhost:5173", methods: ["GET", "POST"], credentials: true, }, transports: ["websocket", "polling"], allowEIO3: true, }); app.get("/api/game-metadata", (req, res) => { try { const gameData = DatapackLoader.getStaticData(); res.json(gameData); } catch (error) { res.status(500).json({ error: "Failed to load game metadata" }); } }); app.get("/status", (req, res) => { res.json({ status: "online", players: io.engine.clientsCount }); }); const registerInApi = async () => { try { await axios.post(`${config.apiBaseUrl}/servers/register`, { name: config.serverName, url: `http://localhost:${config.port}`, secret: config.serverSecret, isModded: false, description: config.serverDescription, region: config.serverRegion, }); } catch (error) { process.exit(1); } }; const HEARTBEAT_INTERVAL = 1000; const sendHeartbeat = async () => { try { await axios.post(`${config.apiBaseUrl}/servers/heartbeat`, { name: config.serverName, secret: config.serverSecret, playersOnline: io.engine.clientsCount, }); } catch (error) {} }; server.listen(config.port, async () => { try { const datapacksPath = path.join(__dirname, "../datapacks"); DatapackLoader.init(datapacksPath, io); await sequelize.initDatabase(); initSockets(io); economyService.init(io); await registerInApi(); setInterval(sendHeartbeat, HEARTBEAT_INTERVAL); console.log(`🚀 Server running on port ${config.port}`); } catch (error) { console.log(error); process.exit(1); } });