zustand auf server wiederhergestellt

This commit is contained in:
2026-01-09 08:43:18 +01:00
parent 1010fe7d11
commit f2f9e02fb2
30 changed files with 6403 additions and 139 deletions

View File

@@ -3,10 +3,10 @@ import { readFileSync } from 'fs';
import { dirname, join } from 'path';
import { fileURLToPath } from 'url';
import { authenticateToken, optionalAuth, requireRole } from '../middleware/auth.js';
import { getServerStatus, startServer, stopServer, restartServer, getConsoleLog, getProcessUptime, listFactorioSaves, createFactorioWorld, deleteFactorioSave, getFactorioCurrentSave, isHostFailed, listZomboidConfigs, readZomboidConfig, writeZomboidConfig, listPalworldConfigs, readPalworldConfig, writePalworldConfig } from '../services/ssh.js';
import { getServerStatus, startServer, stopServer, restartServer, getConsoleLog, getProcessUptime, listFactorioSaves, createFactorioWorld, deleteFactorioSave, getFactorioCurrentSave, isHostFailed, listZomboidConfigs, readZomboidConfig, writeZomboidConfig, listPalworldConfigs, readPalworldConfig, writePalworldConfig, readTerrariaConfig, writeTerrariaConfig, readOpenTTDConfig, writeOpenTTDConfig } from '../services/ssh.js';
import { sendRconCommand, getPlayers, getPlayerList } from '../services/rcon.js';
import { getServerMetricsHistory, getCurrentMetrics } from '../services/prometheus.js';
import { initWhitelistCache, getCachedWhitelist, setCachedWhitelist, initFactorioTemplates, getFactorioTemplates, createFactorioTemplate, deleteFactorioTemplate, initFactorioWorldSettings, getFactorioWorldSettings, saveFactorioWorldSettings, deleteFactorioWorldSettings, initAutoShutdownSettings, getAutoShutdownSettings, setAutoShutdownSettings, initActivityLog, logActivity, getActivityLog, initServerDisplaySettings, getServerDisplaySettings, getAllServerDisplaySettings, setServerDisplaySettings } from '../db/init.js';
import { initWhitelistCache, getCachedWhitelist, setCachedWhitelist, initFactorioTemplates, getFactorioTemplates, createFactorioTemplate, deleteFactorioTemplate, initFactorioWorldSettings, getFactorioWorldSettings, saveFactorioWorldSettings, deleteFactorioWorldSettings, initAutoShutdownSettings, getAutoShutdownSettings, setAutoShutdownSettings, initActivityLog, logActivity, getActivityLog, initServerDisplaySettings, getServerDisplaySettings, getAllServerDisplaySettings, setServerDisplaySettings, initGuildSettings } from '../db/init.js';
import { getEmptySince } from '../services/autoshutdown.js';
import { getDefaultMapGenSettings, getPresetNames, getPreset } from '../services/factorio.js';
@@ -15,6 +15,7 @@ const __dirname = dirname(fileURLToPath(import.meta.url));
function loadConfig() {
return JSON.parse(readFileSync(join(__dirname, '..', 'config.json'), 'utf-8'));
}
// RAM Budget Checkasync function checkRamBudget(serverToStart) { const config = loadConfig(); const ramBudget = config.ramBudget || 30; let usedRam = 0; for (const server of config.servers) { if (server.id === serverToStart.id) continue; try { const status = await getServerStatus(server); if (status === "online") usedRam += server.maxRam || 0; } catch (err) {} } const serverRam = serverToStart.maxRam || 0; const availableRam = ramBudget - usedRam; return { canStart: availableRam >= serverRam, usedRam, serverRam, availableRam, ramBudget };}
// Initialize tables
initWhitelistCache();
@@ -22,6 +23,7 @@ initActivityLog();
initFactorioTemplates();
initFactorioWorldSettings();
initServerDisplaySettings();
initGuildSettings();
const router = Router();
@@ -409,6 +411,73 @@ router.get("/display-settings", optionalAuth, async (req, res) => {
}
});
// ============ TERRARIA ROUTES ============
// Get Terraria config
router.get("/terraria/config", authenticateToken, requireRole("moderator"), async (req, res) => {
try {
const config = loadConfig();
const server = config.servers.find(s => s.id === "terraria");
if (!server) return res.status(404).json({ error: "Server not found" });
const content = await readTerrariaConfig(server);
res.json({ content });
} catch (error) {
console.error("Error reading Terraria config:", error);
res.status(500).json({ error: error.message });
}
});
// Save Terraria config
router.put("/terraria/config", authenticateToken, requireRole("moderator"), async (req, res) => {
try {
const config = loadConfig();
const server = config.servers.find(s => s.id === "terraria");
if (!server) return res.status(404).json({ error: "Server not found" });
const { content } = req.body;
if (!content) return res.status(400).json({ error: "Content required" });
await writeTerrariaConfig(server, content);
logActivity(req.user.id, req.user.username, "terraria_config", "terraria", "serverconfig.txt", req.user.discordId, req.user.avatar);
res.json({ success: true });
} catch (error) {
console.error("Error writing Terraria config:", error);
res.status(500).json({ error: error.message });
}
});
// ============ OPENTTD ROUTES ============
// Get OpenTTD config
router.get("/openttd/config", authenticateToken, requireRole("moderator"), async (req, res) => {
try {
const config = loadConfig();
const server = config.servers.find(s => s.id === "openttd");
if (!server) return res.status(404).json({ error: "Server not found" });
const content = await readOpenTTDConfig(server);
res.json({ content });
} catch (error) {
console.error("Error reading OpenTTD config:", error);
res.status(500).json({ error: error.message });
}
});
// Save OpenTTD config
router.put("/openttd/config", authenticateToken, requireRole("moderator"), async (req, res) => {
try {
const config = loadConfig();
const server = config.servers.find(s => s.id === "openttd");
if (!server) return res.status(404).json({ error: "Server not found" });
const { content } = req.body;
if (!content) return res.status(400).json({ error: "Content required" });
await writeOpenTTDConfig(server, content);
logActivity(req.user.id, req.user.username, "openttd_config", "openttd", "openttd.cfg", req.user.discordId, req.user.avatar);
res.json({ success: true });
} catch (error) {
console.error("Error writing OpenTTD config:", error);
res.status(500).json({ error: error.message });
}
});
// Get single server
router.get('/:id', optionalAuth, async (req, res) => {
const config = loadConfig();