xd
This commit is contained in:
BIN
gsm-frontend/public/zomboid.png
Normal file
BIN
gsm-frontend/public/zomboid.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 70 KiB |
@@ -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 */}
|
||||
|
||||
@@ -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>
|
||||
|
||||
Reference in New Issue
Block a user