import { useTranslation } from 'react-i18next' import { useState, useEffect } from 'react' import Layout from '../components/Layout' import '../App.css' interface ServerInfo { name: string ip: string port: number category: 'Surf' | 'Kz' | 'Bhop' } interface A2SResponse { appID: number botCount: number environment: string gameDescription: string gameDirectory: string mapName: string maxPlayers: number playerCount: number serverName: string serverType: string vac: number version: string visibility: number } interface ServerData extends ServerInfo { a2sData?: A2SResponse status: 'online' | 'offline' | 'loading' error?: string } function Servers() { const { t } = useTranslation() // Server list from database export const serverList: ServerInfo[] = [ { name: 'Surf 66 Tick #1', ip: '14.103.233.1', port: 27015, category: 'Surf' }, { name: 'Surf 66 Tick #2', ip: '14.103.233.1', port: 27016, category: 'Surf' }, { name: 'Surf 66 Tick #3', ip: '14.103.233.1', port: 27017, category: 'Surf' }, { name: 'Surf 100 Tick #1', ip: '14.103.233.1', port: 28015, category: 'Surf' }, { name: 'Surf 100 Tick #2', ip: '14.103.233.1', port: 28016, category: 'Surf' }, { name: 'Kz #1', ip: '14.103.233.1', port: 29015, category: 'Kz' }, { name: 'Kz #2', ip: '14.103.233.1', port: 29016, category: 'Kz' }, { name: 'Bhop #1', ip: '14.103.233.1', port: 30015, category: 'Bhop' }, { name: 'Bhop #2', ip: '14.103.233.1', port: 30016, category: 'Bhop' } ] const [servers, setServers] = useState([]) const [selectedCategory, setSelectedCategory] = useState('All') // Fetch A2S data for all servers useEffect(() => { const fetchServerData = async () => { const serverPromises = serverList.map(async (server) => { try { const response = await fetch('/api/server/statistics/a2s-query', { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({ serverIP: server.ip, serverPort: server.port, timeout: 3000 }) }) if (!response.ok) { throw new Error(`HTTP ${response.status}`) } const a2sData: A2SResponse = await response.json() return { ...server, a2sData, status: 'online' as const } } catch (error) { console.error(`Failed to fetch data for ${server.name}:`, error) return { ...server, status: 'offline' as const, error: error instanceof Error ? error.message : 'Unknown error' } } }) const results = await Promise.all(serverPromises) setServers(results) } fetchServerData() }, []) // Filter servers by category const filteredServers = selectedCategory === 'All' ? servers : servers.filter(server => server.category === selectedCategory) const categories = ['All', ...Array.from(new Set(serverList.map(s => s.category)))] const getStatusColor = (status: string) => { switch (status) { case 'online': return '#10b981' case 'offline': return '#ef4444' case 'loading': return '#f59e0b' default: return '#6b7280' } } return ( {/* Servers Page Header */}

{t('servers.title')}

{t('servers.subtitle')}

{/* Category Filter */}
{categories.map(category => ( ))}
{/* Servers Grid */}
{filteredServers.map((server) => (
{ e.currentTarget.style.transform = 'translateY(-5px)' e.currentTarget.style.boxShadow = '0 10px 25px rgba(0,0,0,0.2)' }} onMouseLeave={(e) => { e.currentTarget.style.transform = 'translateY(0)' e.currentTarget.style.boxShadow = 'none' }} > {/* Status Indicator */}
{/* Server Header */}

{server.name}

🗺️ {server.a2sData?.mapName || 'Loading...'} {server.category}
{/* Server Stats */}
{t('servers.players')}
{server.a2sData ? `${server.a2sData.playerCount - server.a2sData.botCount}/${server.a2sData.maxPlayers}` : 'Loading...'}
{t('servers.status')}
{server.status === 'online' ? 'Online' : server.status === 'offline' ? 'Offline' : 'Loading'}
{/* Server Details */}
� {server.ip}:{server.port} {server.category}
{server.error && (

Error: {server.error}

)}
{/* Join Button */}
))}
{/* Server Stats Summary */}

{t('servers.serverStats')}

{servers.filter(s => s.status === 'online').length}
{t('servers.onlineServers')}
{servers.reduce((sum, s) => sum + (s.a2sData ? (s.a2sData.playerCount - s.a2sData.botCount) : 0), 0)}
{t('servers.totalPlayers')}
{Array.from(new Set(servers.map(s => s.category))).length}
{t('servers.categories')}
{servers.length}
{t('servers.totalServers')}
) } export default Servers