const serverInfo = { minecraft: { address: 'minecraft.dimension47.de', logo: '/minecraft.png', links: [ { label: 'ATM10 Modpack', url: 'https://www.curseforge.com/minecraft/modpacks/all-the-mods-10' } ] }, factorio: { hint: 'Serverpasswort: affe', address: 'factorio.dimension47.de', logo: '/factorio.png', links: [ { label: 'Steam', url: 'https://store.steampowered.com/app/427520/Factorio/' } ] }, vrising: { address: 'Zeasy Software Vampire', logo: '/vrising.png', links: [ { label: 'Steam', url: 'https://store.steampowered.com/app/1604030/V_Rising/' } ] }, zomboid: { hint: 'Version 42.13', address: 'pz.zeasy.dev:16261', logo: '/zomboid.png', links: [ { label: 'Steam', url: 'https://store.steampowered.com/app/108600/Project_Zomboid/' } ] } } const getServerInfo = (serverName) => { const name = serverName.toLowerCase() if (name.includes('minecraft') || name.includes('all the mods')) return serverInfo.minecraft if (name.includes('factorio')) return serverInfo.factorio if (name.includes('vrising') || name.includes('v rising')) return serverInfo.vrising if (name.includes('zomboid')) return serverInfo.zomboid return null } export default function ServerCard({ server, onClick, isAuthenticated }) { const info = getServerInfo(server.name) const formatUptime = (seconds) => { const hours = Math.floor(seconds / 3600) if (hours > 24) { const days = Math.floor(hours / 24) return days + 'd ' + (hours % 24) + 'h' } const minutes = Math.floor((seconds % 3600) / 60) return hours + 'h ' + minutes + 'm' } const cpuPercent = Math.min(server.metrics.cpu, 100) const memPercent = Math.min(server.metrics.memory, 100) const getProgressColor = (percent) => { if (percent > 80) return 'progress-bar-danger' if (percent > 60) return 'progress-bar-warning' return 'progress-bar-success' } const getStatusBadge = () => { const status = server.status || (server.running ? 'online' : 'offline') switch (status) { case 'online': return { class: 'badge badge-success', text: 'Online' } case 'starting': return { class: 'badge badge-warning', text: 'Startet...' } case 'stopping': return { class: 'badge badge-warning', text: 'Stoppt...' } case 'unreachable': return { class: 'badge badge-muted', text: 'Nicht erreichbar' } default: return { class: 'badge badge-destructive', text: 'Offline' } } } const statusBadge = getStatusBadge() return (
{/* Header */}
{info && info.logo && }

{server.name}

{statusBadge.text}
{/* Server Address & Links */} {info && (
{info.address} {info.links.map((link, i) => ( e.stopPropagation()} className="text-blue-400 hover:text-blue-300 hover:underline" > {link.label} ))}
)} {/* Whitelist notice for Minecraft - only for authenticated users */} {isAuthenticated && server.type === 'minecraft' && (
Whitelist erforderlich - im Whitelist-Tab freischalten
)} {/* Factorio notice - only for authenticated users */} {isAuthenticated && server.type === 'factorio' && (
Serverpasswort: affe
)} {/* V Rising notice - only for authenticated users */} {isAuthenticated && server.type === 'vrising' && (
In der Serverliste suchen - Passwort: affe
)} {/* Project Zomboid notice - only for authenticated users */} {isAuthenticated && server.type === 'zomboid' && (
Version 42.13
)} {/* Metrics */}
{/* CPU */}
CPU {server.metrics.cpu.toFixed(1)}%
{/* RAM */}
Arbeitsspeicher {server.metrics.memoryUsed?.toFixed(1) || 0} / {server.metrics.memoryTotal?.toFixed(1) || 0} {server.metrics.memoryUnit}
{/* Footer Stats */}
{server.players.online} {server.players.max ? ' / ' + server.players.max : ''} Spieler
{server.running && (
Laufzeit: {formatUptime(server.metrics.uptime)}
)}
{/* Players List */} {server.players?.list?.length > 0 && (
{server.players.list.map((player, i) => ( {player} ))}
)}
) }