119 lines
3.5 KiB
TypeScript
119 lines
3.5 KiB
TypeScript
import { Box, Typography, Avatar } from '@mui/material';
|
||
import { useEffect, useState } from 'react';
|
||
|
||
interface ServerStatusProps {
|
||
serverIp: string;
|
||
serverPort?: number;
|
||
refreshInterval?: number; // Интервал обновления в миллисекундах
|
||
}
|
||
|
||
const ServerStatus = ({
|
||
serverIp,
|
||
serverPort,
|
||
refreshInterval = 60000, // По умолчанию обновление раз в минуту
|
||
}: ServerStatusProps) => {
|
||
const [serverStatus, setServerStatus] = useState<{
|
||
online: number;
|
||
max: number;
|
||
loading: boolean;
|
||
error: string | null;
|
||
icon: string | null;
|
||
motd: string;
|
||
}>({
|
||
online: 0,
|
||
max: 0,
|
||
loading: true,
|
||
error: null,
|
||
icon: null,
|
||
motd: '',
|
||
});
|
||
|
||
useEffect(() => {
|
||
// Функция для получения статуса сервера
|
||
const fetchServerStatus = async () => {
|
||
try {
|
||
setServerStatus((prev) => ({ ...prev, loading: true, error: null }));
|
||
console.log('Отправляем запрос на сервер с параметрами:', {
|
||
host: serverIp,
|
||
port: serverPort || 25565,
|
||
});
|
||
|
||
// Проверяем, что serverIp имеет значение
|
||
if (!serverIp) {
|
||
throw new Error('Адрес сервера не указан');
|
||
}
|
||
|
||
const result = await window.electron.ipcRenderer.invoke(
|
||
'get-server-status',
|
||
{
|
||
host: serverIp,
|
||
port: serverPort || 25565,
|
||
},
|
||
);
|
||
|
||
if (result.success) {
|
||
setServerStatus({
|
||
online: result.online,
|
||
max: result.max,
|
||
loading: false,
|
||
error: null,
|
||
icon: result.icon,
|
||
motd: result.motd || serverIp,
|
||
});
|
||
} else {
|
||
setServerStatus({
|
||
online: 0,
|
||
max: 0,
|
||
loading: false,
|
||
error: result.error || 'Неизвестная ошибка',
|
||
icon: null,
|
||
motd: '',
|
||
});
|
||
}
|
||
} catch (error) {
|
||
console.error('Ошибка при получении статуса сервера:', error);
|
||
setServerStatus((prev) => ({
|
||
...prev,
|
||
loading: false,
|
||
error: 'Ошибка при получении статуса сервера',
|
||
icon: null,
|
||
}));
|
||
}
|
||
};
|
||
|
||
// Загрузка при первом рендере
|
||
fetchServerStatus();
|
||
|
||
// Периодическое обновление
|
||
const interval = setInterval(fetchServerStatus, refreshInterval);
|
||
|
||
return () => clearInterval(interval);
|
||
}, [serverIp, serverPort, refreshInterval]);
|
||
|
||
return (
|
||
<Box sx={{ display: 'flex', alignItems: 'center', gap: 1 }}>
|
||
{/* Отображаем иконку сервера или иконку по умолчанию */}
|
||
{serverStatus.icon ? (
|
||
<Avatar
|
||
src={serverStatus.icon}
|
||
alt={serverStatus.motd || 'Minecraft сервер'}
|
||
sx={{ width: '2em', height: '2em' }}
|
||
/>
|
||
) : (
|
||
<Avatar sx={{ width: '2em', height: '2em', bgcolor: 'primary.main' }}>
|
||
?
|
||
</Avatar>
|
||
)}
|
||
{serverStatus.error ? (
|
||
<Typography color="error">Ошибка загрузки</Typography>
|
||
) : (
|
||
<Typography sx={{ fontWeight: 'bold' }}>
|
||
{serverStatus.online} / {serverStatus.max} игроков
|
||
</Typography>
|
||
)}
|
||
</Box>
|
||
);
|
||
};
|
||
|
||
export default ServerStatus;
|