Game-Server/game-server/src/index.js
2026-04-01 20:43:07 +03:00

92 lines
2.4 KiB
JavaScript

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: "*",
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: "*",
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: config.host,
secret: config.serverSecret,
isModded: false,
description: config.serverDescription,
region: config.serverRegion,
});
} catch (error) {
console.log(`Error: API server not found at ${config.apiBaseUrl}`);
console.log("Please configure API_SERVER_URL= in your .env file");
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 ${config.host}. PORT: ${config.port}`);
} catch (error) {
console.log(error);
process.exit(1);
}
});