Add Space Engineers server support
All checks were successful
Deploy GSM / deploy (push) Successful in 34s
All checks were successful
Deploy GSM / deploy (push) Successful in 34s
Integrates Space Engineers dedicated server (docker+wine on 192.168.2.78) into GSM: - config.json entry with docker runtime and log-based player detection - getSpaceEngineersPlayers() parses docker logs for connect/disconnect events - Extends type-check sites in rcon, autoshutdown, discordBot, servers routes - Frontend ServerCard/ServerDetail logo + address wiring Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -694,6 +694,42 @@ export async function getTerrariaPlayers(server) {
|
||||
}
|
||||
}
|
||||
|
||||
// ============ SPACE ENGINEERS FUNCTIONS ============
|
||||
|
||||
// Get Space Engineers players by parsing docker logs
|
||||
export async function getSpaceEngineersPlayers(server) {
|
||||
try {
|
||||
const ssh = await getConnection(server.host, server.sshUser);
|
||||
|
||||
// SE logs connect/disconnect lines through the wine-wrapped dedicated server.
|
||||
// Typical patterns emitted by SpaceEngineersDedicated:
|
||||
// "User <name> joined" / "User <name> connected"
|
||||
// "User <name> left" / "User <name> disconnected"
|
||||
// "Player '<name>' connected" / "Player '<name>' disconnected"
|
||||
const result = await ssh.execCommand(
|
||||
`docker logs --tail 2000 ${server.containerName} 2>&1 | ` +
|
||||
`grep -iE "user .* (joined|connected|left|disconnected)|player '.*' (connected|disconnected)" | tail -200`
|
||||
);
|
||||
|
||||
const players = new Map();
|
||||
const lines = result.stdout.split('\n').filter(l => l.trim());
|
||||
|
||||
for (const line of lines) {
|
||||
let m;
|
||||
if ((m = line.match(/Player '([^']+)' connected/i))) { players.set(m[1], true); continue; }
|
||||
if ((m = line.match(/Player '([^']+)' disconnected/i))) { players.delete(m[1]); continue; }
|
||||
if ((m = line.match(/User\s+(.+?)\s+(?:joined|connected)/i))) { players.set(m[1].trim(), true); continue; }
|
||||
if ((m = line.match(/User\s+(.+?)\s+(?:left|disconnected)/i))) { players.delete(m[1].trim()); continue; }
|
||||
}
|
||||
|
||||
const playerList = Array.from(players.keys());
|
||||
return { online: playerList.length, players: playerList };
|
||||
} catch (err) {
|
||||
console.error(`[SpaceEngineers] Error getting players:`, err.message);
|
||||
return { online: 0, players: [] };
|
||||
}
|
||||
}
|
||||
|
||||
// ============ HYTALE FUNCTIONS ============
|
||||
const HYTALE_CONFIG_PATH = "/opt/hytale/Server/config.json";
|
||||
const HYTALE_LOGS_PATH = "/opt/hytale/Server/logs";
|
||||
|
||||
Reference in New Issue
Block a user