import { Box, Button, Slider, TextField, Typography } from '@mui/material'; import { useEffect, useState } from 'react'; export default function Login() { const [config, setConfig] = useState({ username: '', password: '', memory: 4096, comfortVersion: '', accessToken: '', clientToken: '', }); const [status, setStatus] = useState(''); const loadInitialConfig = () => { try { const savedConfig = localStorage.getItem('launcher_config'); if (savedConfig) { return JSON.parse(savedConfig); } } catch (error) { console.log('Ошибка загрузки конфигурации:', error); } // Возвращаем значения по умолчанию return { username: '', password: '', memory: 4096, comfortVersion: '', accessToken: '', clientToken: '', }; }; useEffect(() => { const savedConfig = loadInitialConfig(); setConfig(savedConfig); }, []); const handleInputChange = (e) => { const { name, value } = e.target; setConfig((prev) => ({ ...prev, [name]: value })); }; const saveConfig = ( username, memory, accessToken = '', clientToken = '', comfortVersion = '', password = '', ) => { try { const newConfig = { username, memory, accessToken: accessToken || config.accessToken, clientToken: clientToken || config.clientToken, comfortVersion: comfortVersion || config.comfortVersion, password: password || config.password, }; setConfig(newConfig); localStorage.setItem('launcher_config', JSON.stringify(newConfig)); } catch (error) { console.log(`Ошибка при сохранении конфигурации: ${error.message}`); } }; const loadConfig = () => { try { const savedConfig = localStorage.getItem('launcher_config'); if (savedConfig) { const parsedConfig = JSON.parse(savedConfig); setConfig(parsedConfig); return parsedConfig; } } catch (error) { console.log(`Ошибка при загрузке конфигурации: ${error.message}`); } return config; }; const refreshSession = async (accessToken, clientToken) => { try { const refreshData = { accessToken: accessToken, clientToken: clientToken, }; const response = await fetch('https://authserver.ely.by/auth/refresh', { method: 'POST', headers: { 'Content-Type': 'application/json', }, body: JSON.stringify(refreshData), }); if (response.ok) { const data = await response.json(); const newAccessToken = data.accessToken; const profile = data.selectedProfile; const uuid = profile.id; const name = profile.name; if (newAccessToken && uuid && name) { saveConfig( config.username, config.memory, newAccessToken, clientToken, ); return { accessToken: newAccessToken, uuid: uuid, username: name, clientToken: clientToken, }; } } return null; } catch (error) { console.log(`Ошибка при обновлении сессии: ${error.message}`); return null; } }; const authenticateWithElyBy = async (username, password) => { try { const clientToken = crypto.randomUUID(); const authData = { username: username, password: password, clientToken: clientToken, requestUser: true, }; console.log(`Аутентификация пользователя ${username} на Ely.by...`); const response = await fetch( 'https://authserver.ely.by/auth/authenticate', { method: 'POST', headers: { 'Content-Type': 'application/json', }, body: JSON.stringify(authData), }, ); const responseData = await response.json(); if (response.ok) { const accessToken = responseData.accessToken; const profile = responseData.selectedProfile; const uuid = profile.id; const name = profile.name; if (accessToken && uuid && name) { saveConfig( username, config.memory, accessToken, clientToken, '', password, ); console.log(`Аутентификация успешна: UUID=${uuid}, Username=${name}`); return { accessToken: accessToken, uuid: uuid, username: name, clientToken: clientToken, }; } } else { if (responseData.error === 'Account protected with two factor auth') { const totpToken = prompt( 'Введите код двухфакторной аутентификации:', '', ); if (totpToken) { authData.password = `${password}:${totpToken}`; const totpResponse = await fetch( 'https://authserver.ely.by/auth/authenticate', { method: 'POST', headers: { 'Content-Type': 'application/json', }, body: JSON.stringify(authData), }, ); if (totpResponse.ok) { const totpData = await totpResponse.json(); const newAccessToken = totpData.accessToken; const newProfile = totpData.selectedProfile; const newUuid = newProfile.id; const newName = newProfile.name; if (newAccessToken && newUuid && newName) { saveConfig( username, config.memory, newAccessToken, clientToken, '', password, ); return { accessToken: newAccessToken, uuid: newUuid, username: newName, clientToken: clientToken, }; } } } } throw new Error(responseData.error || 'Ошибка авторизации'); } } catch (error) { console.log(`Ошибка авторизации: ${error.message}`); return null; } }; const authorization = async () => { console.log('Начинаем процесс авторизации...'); if (!config.username.trim()) { console.log('Ошибка: не указан никнейм'); alert('Введите никнейм!'); return; } try { // Проверяем, есть ли сохранённый токен if (config.accessToken && config.clientToken) { console.log('Проверка валидности существующего токена...'); const isValid = await validateSession(config.accessToken); if (!isValid) { console.log('Токен недействителен, пытаемся обновить...'); const refreshedSession = await refreshSession( config.accessToken, config.clientToken, ); if (!refreshedSession) { console.log( 'Не удалось обновить токен, требуется новая авторизация', ); const newSession = await authenticateWithElyBy( config.username, config.password, ); if (!newSession) { console.log('Авторизация не удалась'); return; } } } else { console.log('Токен действителен'); } } else { console.log('Токен отсутствует, выполняем авторизацию...'); const session = await authenticateWithElyBy( config.username, config.password, ); if (!session) { console.log('Авторизация не удалась'); return; } } console.log('Авторизация успешно завершена'); // Здесь можно добавить логику для запуска игры } catch (error) { console.log(`ОШИБКА при авторизации: ${error.message}`); } }; return ( POPA - POPA ); }