Files
GSM/gsm-backend/services/autoshutdown.js

114 lines
3.7 KiB
JavaScript

import { readFileSync } from 'fs';
import { dirname, join } from 'path';
import { fileURLToPath } from 'url';
import { getServerStatus, stopServer } from './ssh.js';
import { getPlayers } from './rcon.js';
import { getAllAutoShutdownSettings, getAutoShutdownSettings } from '../db/init.js';
const __dirname = dirname(fileURLToPath(import.meta.url));
// Track when each server became empty
const emptyPlayersSince = new Map();
// Check interval in ms (60 seconds)
const CHECK_INTERVAL = 60000;
function loadConfig() {
return JSON.parse(readFileSync(join(__dirname, '..', 'config.json'), 'utf-8'));
}
async function checkServers() {
try {
const config = loadConfig();
const enabledSettings = getAllAutoShutdownSettings();
// Create a map for quick lookup
const settingsMap = new Map(enabledSettings.map(s => [s.server_id, s]));
for (const server of config.servers) {
const settings = settingsMap.get(server.id);
// Skip if auto-shutdown not enabled for this server
if (!settings || !settings.enabled) {
emptyPlayersSince.delete(server.id);
continue;
}
try {
// Check if server is online
const status = await getServerStatus(server);
if (status !== 'online') {
// Server not running, clear timer
emptyPlayersSince.delete(server.id);
continue;
}
// Get player count
let playerCount = 0;
if (server.rconPassword) {
const players = await getPlayers(server);
playerCount = players.online || 0;
}
if (playerCount === 0) {
// No players online
if (!emptyPlayersSince.has(server.id)) {
// Start tracking empty time
emptyPlayersSince.set(server.id, Date.now());
console.log(`[AutoShutdown] ${server.id}: Keine Spieler online, Timer gestartet`);
}
const emptyMs = Date.now() - emptyPlayersSince.get(server.id);
const emptyMinutes = emptyMs / 60000;
if (emptyMinutes >= settings.timeout_minutes) {
console.log(`[AutoShutdown] ${server.id}: Timeout erreicht (${settings.timeout_minutes} Min), stoppe Server...`);
await stopServer(server);
emptyPlayersSince.delete(server.id);
console.log(`[AutoShutdown] ${server.id}: Server gestoppt`);
}
} else {
// Players online, reset timer
if (emptyPlayersSince.has(server.id)) {
console.log(`[AutoShutdown] ${server.id}: Spieler online (${playerCount}), Timer zurückgesetzt`);
emptyPlayersSince.delete(server.id);
}
}
} catch (err) {
console.error(`[AutoShutdown] Fehler bei ${server.id}:`, err.message);
}
}
} catch (err) {
console.error('[AutoShutdown] Fehler beim Laden der Config:', err.message);
}
}
export function startAutoShutdownService() {
console.log('[AutoShutdown] Service gestartet, prüfe alle 60 Sekunden');
// Initial check after 10 seconds (give server time to start)
setTimeout(() => {
checkServers();
}, 10000);
// Then check every 60 seconds
setInterval(checkServers, CHECK_INTERVAL);
}
// Get how long a server has been empty (for status display)
export function getEmptySince(serverId) {
const since = emptyPlayersSince.get(serverId);
if (!since) return null;
return Math.floor((Date.now() - since) / 60000); // Return minutes
}
// Get all empty-since times
export function getAllEmptySince() {
const result = {};
for (const [serverId, since] of emptyPlayersSince) {
result[serverId] = Math.floor((Date.now() - since) / 60000);
}
return result;
}