This commit is contained in:
2026-01-06 21:22:10 +01:00
parent 5049e7791f
commit 4194f68968
7 changed files with 497 additions and 16 deletions

Binary file not shown.

After

Width:  |  Height:  |  Size: 70 KiB

View File

@@ -20,6 +20,14 @@ const serverInfo = {
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/' }
]
}
}
@@ -28,6 +36,7 @@ const getServerInfo = (serverName) => {
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
}
@@ -127,6 +136,13 @@ export default function ServerCard({ server, onClick, isAuthenticated }) {
</div>
)}
{/* Project Zomboid notice - only for authenticated users */}
{isAuthenticated && server.type === 'zomboid' && (
<div className="mb-4 text-xs text-neutral-500">
Version 42.13
</div>
)}
{/* Metrics */}
<div className="space-y-3">
{/* CPU */}

View File

@@ -10,6 +10,7 @@ const getServerLogo = (serverName) => {
if (name.includes("minecraft") || name.includes("all the mods")) return "/minecraft.png"
if (name.includes("factorio")) return "/factorio.png"
if (name.includes("vrising") || name.includes("v rising")) return "/vrising.png"
if (name.includes("zomboid")) return "/zomboid.png"
return null
}
export default function ServerDetail() {
@@ -28,6 +29,7 @@ export default function ServerDetail() {
const [whitelistInput, setWhitelistInput] = useState('')
const [whitelistLoading, setWhitelistLoading] = useState(false)
const [currentSave, setCurrentSave] = useState(null)
const [logsUpdated, setLogsUpdated] = useState(null)
const logsRef = useRef(null)
const rconRef = useRef(null)
@@ -62,7 +64,10 @@ export default function ServerDetail() {
useEffect(() => {
fetchServer()
fetchCurrentSave()
const interval = setInterval(fetchServer, 10000)
const interval = setInterval(() => {
fetchServer()
fetchCurrentSave()
}, 10000)
return () => clearInterval(interval)
}, [token, serverId])
@@ -97,8 +102,9 @@ export default function ServerDetail() {
const fetchLogs = async () => {
try {
const data = await getServerLogs(token, server.id, 20)
const data = await getServerLogs(token, server.id, 50)
setLogs(data.logs || '')
setLogsUpdated(new Date())
if (logsRef.current) {
logsRef.current.scrollTop = logsRef.current.scrollHeight
}
@@ -299,6 +305,15 @@ const formatUptime = (seconds) => {
<div className="text-sm text-neutral-400">CPU Cores</div>
<div className="text-2xl font-semibold text-white mt-1">{server.metrics.cpuCores}</div>
</div>
{server.type === 'factorio' && currentSave?.save && (
<div className="card p-4">
<div className="text-sm text-neutral-400">{server.running ? 'Current World' : 'Next World'}</div>
<div className="text-lg font-semibold text-white mt-1 truncate">{currentSave.save}</div>
{!server.running && currentSave.source === 'newest' && (
<div className="text-xs text-neutral-500 mt-1">newest save</div>
)}
</div>
)}
</div>
{/* Players List */}
@@ -318,14 +333,6 @@ const formatUptime = (seconds) => {
<div className="card p-4">
<h3 className="text-sm font-medium text-neutral-300 mb-3">Server Controls</h3>
{/* Factorio: Show which save will be loaded */}
{server.type === 'factorio' && !server.running && currentSave?.save && (
<div className="text-sm text-neutral-400 mb-3">
Will load: <span className="text-white font-medium">{currentSave.save}</span>
{currentSave.source === 'newest' && <span className="text-neutral-500 ml-1">(newest save)</span>}
</div>
)}
<div className="flex flex-wrap gap-3">
{(server.status === 'online' || (server.running && server.status !== 'starting' && server.status !== 'stopping')) ? (
<>
@@ -369,7 +376,14 @@ const formatUptime = (seconds) => {
<div className="space-y-4 tab-content">
{/* Logs */}
<div className="flex justify-between items-center">
<span className="text-sm text-neutral-400">Server Logs (last 20 lines)</span>
<div className="flex items-center gap-3">
<span className="text-sm text-neutral-400">Server Logs (last 50 lines)</span>
{logsUpdated && (
<span className="text-xs text-neutral-600">
Aktualisiert: {logsUpdated.toLocaleTimeString('de-DE')}
</span>
)}
</div>
<button onClick={fetchLogs} className="btn btn-secondary">
Refresh
</button>