refactor: update Minecraft download logic with URL and args support

This commit is contained in:
2025-07-07 01:45:03 +05:00
parent ff91303b18
commit 1b496288de
2 changed files with 92 additions and 33 deletions

View File

@ -28,10 +28,10 @@ const AUTHLIB_INJECTOR_FILENAME = 'authlib-injector-1.2.5.jar';
// Создаем экземпляр сервиса аутентификации // Создаем экземпляр сервиса аутентификации
const authService = new AuthService(); const authService = new AuthService();
// Функция для получения последней версии релиза // Модифицированная функция для получения последней версии релиза с произвольного URL
export async function getLatestReleaseVersion(): Promise<string> { export async function getLatestReleaseVersion(apiUrl: string): Promise<string> {
try { try {
const response = await fetch(GITHUB_API_RELEASE_URL); const response = await fetch(apiUrl);
const data = await response.json(); const data = await response.json();
return data.tag_name || '0.0.0'; return data.tag_name || '0.0.0';
} catch (error) { } catch (error) {
@ -345,15 +345,22 @@ async function ensureAuthlibInjectorExists(appPath: string): Promise<string> {
// Инициализация IPC обработчиков // Инициализация IPC обработчиков
export function initMinecraftHandlers() { export function initMinecraftHandlers() {
// Обработчик для скачивания и распаковки // Обработчик для скачивания и распаковки
ipcMain.handle('download-and-extract', async (event) => { ipcMain.handle('download-and-extract', async (event, options) => {
try { try {
const {
downloadUrl = 'https://github.com/DIKER0K/Comfort/releases/latest/download/Comfort.zip',
apiReleaseUrl = 'https://api.github.com/repos/DIKER0K/Comfort/releases/latest',
versionFileName = 'comfort_version.txt',
packName = 'Comfort',
} = options || {};
const appPath = path.dirname(app.getPath('exe')); const appPath = path.dirname(app.getPath('exe'));
const minecraftDir = path.join(appPath, '.minecraft'); const minecraftDir = path.join(appPath, '.minecraft');
const versionsDir = path.join(minecraftDir, 'versions'); const versionsDir = path.join(minecraftDir, 'versions');
const versionFilePath = path.join(minecraftDir, COMFORT_VERSION_FILE); const versionFilePath = path.join(minecraftDir, versionFileName);
// Получаем текущую и последнюю версии // Получаем текущую и последнюю версии
const latestVersion = await getLatestReleaseVersion(); const latestVersion = await getLatestReleaseVersion(apiReleaseUrl);
let currentVersion = ''; let currentVersion = '';
// Проверяем текущую версию, если файл существует // Проверяем текущую версию, если файл существует
@ -363,7 +370,12 @@ export function initMinecraftHandlers() {
// Проверяем, нужно ли обновление // Проверяем, нужно ли обновление
if (currentVersion === latestVersion) { if (currentVersion === latestVersion) {
return { success: true, updated: false, version: currentVersion }; return {
success: true,
updated: false,
version: currentVersion,
packName,
};
} }
const tempDir = path.join(appPath, 'temp'); const tempDir = path.join(appPath, 'temp');
@ -374,10 +386,10 @@ export function initMinecraftHandlers() {
} }
fs.mkdirSync(tempDir, { recursive: true }); fs.mkdirSync(tempDir, { recursive: true });
const zipPath = path.join(tempDir, 'Comfort.zip'); const zipPath = path.join(tempDir, `${packName}.zip`);
// Скачиваем файл // Скачиваем файл
await downloadFile(COMFORT_DOWNLOAD_URL, zipPath, (progress) => { await downloadFile(downloadUrl, zipPath, (progress) => {
event.sender.send('download-progress', progress); event.sender.send('download-progress', progress);
}); });
@ -406,7 +418,7 @@ export function initMinecraftHandlers() {
const versionsContents = fs.readdirSync(versionsDir); const versionsContents = fs.readdirSync(versionsDir);
console.log('Доступные версии:', versionsContents); console.log('Доступные версии:', versionsContents);
return { success: true, updated: true, version: latestVersion }; return { success: true, updated: true, version: latestVersion, packName };
} catch (error) { } catch (error) {
console.error('Error in download-and-extract:', error); console.error('Error in download-and-extract:', error);
throw error; throw error;
@ -416,7 +428,18 @@ export function initMinecraftHandlers() {
// Обработчик для запуска Minecraft // Обработчик для запуска Minecraft
ipcMain.handle('launch-minecraft', async (event, gameConfig) => { ipcMain.handle('launch-minecraft', async (event, gameConfig) => {
try { try {
const baseVersion = '1.21.4'; const {
accessToken,
uuid,
username,
memory = 2048,
baseVersion = '1.21.4',
packName = 'Comfort', // Название основной сборки
versionToLaunchOverride = '', // Возможность переопределить версию для запуска
serverIp = 'popa-popa.ru',
serverPort, // Добавляем опциональный порт без значения по умолчанию
} = gameConfig || {};
const appPath = path.dirname(app.getPath('exe')); const appPath = path.dirname(app.getPath('exe'));
const minecraftDir = path.join(appPath, '.minecraft'); const minecraftDir = path.join(appPath, '.minecraft');
const versionsDir = path.join(minecraftDir, 'versions'); const versionsDir = path.join(minecraftDir, 'versions');
@ -427,14 +450,17 @@ export function initMinecraftHandlers() {
: []; : [];
console.log('Доступные версии:', versionsContents); console.log('Доступные версии:', versionsContents);
// Найти версию Comfort или версию с Fabric // Найти версию пакета, Fabric или базовую версию
let versionToLaunch = ''; let versionToLaunch = versionToLaunchOverride;
if (versionsContents.includes('1.21.4-fabric0.16.14')) {
versionToLaunch = '1.21.4-fabric0.16.14'; if (!versionToLaunch) {
} else if (versionsContents.includes('Comfort')) { if (versionsContents.includes(`${baseVersion}-fabric0.16.14`)) {
versionToLaunch = 'Comfort'; versionToLaunch = `${baseVersion}-fabric0.16.14`;
} else { } else if (versionsContents.includes(packName)) {
versionToLaunch = '1.21.4'; versionToLaunch = packName;
} else {
versionToLaunch = baseVersion;
}
} }
console.log('Запускаем версию:', versionToLaunch); console.log('Запускаем версию:', versionToLaunch);
@ -642,22 +668,34 @@ export function initMinecraftHandlers() {
message: 'Запуск игры...', message: 'Запуск игры...',
}); });
const comfortDir = path.join(versionsDir, 'Comfort'); // При запуске используем переданные параметры
const packDir = path.join(versionsDir, packName);
// При формировании конфигурации запуска создаем объект server только с нужными параметрами
const serverConfig: any = { ip: serverIp };
// Добавляем порт только если он был передан
if (serverPort) {
serverConfig.port = serverPort;
}
const proc = await launch({ const proc = await launch({
gamePath: comfortDir, gamePath: packDir,
resourcePath: minecraftDir, resourcePath: minecraftDir,
javaPath, javaPath,
version: versionToLaunch, version: versionToLaunch,
launcherName: 'popa-popa',
server: serverConfig, // Используем созданный объект конфигурации
extraJVMArgs: [ extraJVMArgs: [
'-Dlog4j2.formatMsgNoLookups=true', '-Dlog4j2.formatMsgNoLookups=true',
`-javaagent:${authlibPath}=ely.by`, `-javaagent:${authlibPath}=ely.by`,
`-Xmx${gameConfig.memory || 2048}M`, `-Xmx${memory}M`,
], ],
// Используем данные аутентификации Yggdrasil // Используем данные аутентификации Yggdrasil
accessToken: gameConfig.accessToken, accessToken,
gameProfile: { gameProfile: {
id: gameConfig.uuid, id: uuid,
name: gameConfig.username, name: username,
}, },
}); });

View File

@ -90,8 +90,21 @@ const LaunchPage = () => {
localStorage.getItem('launcher_config') || '{}', localStorage.getItem('launcher_config') || '{}',
); );
// Опции для скачивания и запуска сборки
const packOptions = {
downloadUrl:
'https://github.com/DIKER0K/Comfort/releases/latest/download/Comfort.zip',
apiReleaseUrl:
'https://api.github.com/repos/DIKER0K/Comfort/releases/latest',
versionFileName: 'comfort_version.txt',
packName: 'Comfort',
serverIp: 'popa-popa.ru',
};
// Передаем опции для скачивания
const downloadResult = await window.electron.ipcRenderer.invoke( const downloadResult = await window.electron.ipcRenderer.invoke(
'download-and-extract', 'download-and-extract',
packOptions,
); );
if (downloadResult?.success) { if (downloadResult?.success) {
@ -99,25 +112,31 @@ const LaunchPage = () => {
if (downloadResult.updated) { if (downloadResult.updated) {
showNotification( showNotification(
`Сборка успешно обновлена до версии ${downloadResult.version}`, `Сборка ${downloadResult.packName} успешно обновлена до версии ${downloadResult.version}`,
'success', 'success',
); );
needsSecondAttempt = true; needsSecondAttempt = true;
} else { } else {
showNotification( showNotification(
`Установлена актуальная версия сборки ${downloadResult.version}`, `Установлена актуальная версия сборки ${downloadResult.packName} (${downloadResult.version})`,
'info', 'info',
); );
} }
// Опции для запуска
const launchOptions = {
accessToken: savedConfig.accessToken,
uuid: savedConfig.uuid,
username: savedConfig.username,
memory: savedConfig.memory || 4096,
baseVersion: '1.21.4',
packName: packOptions.packName,
serverIp: packOptions.serverIp,
};
const launchResult = await window.electron.ipcRenderer.invoke( const launchResult = await window.electron.ipcRenderer.invoke(
'launch-minecraft', 'launch-minecraft',
{ launchOptions,
accessToken: savedConfig.accessToken,
uuid: savedConfig.uuid,
username: savedConfig.username,
memory: savedConfig.memory || 4096,
},
); );
if (needsSecondAttempt) { if (needsSecondAttempt) {
@ -135,6 +154,8 @@ const LaunchPage = () => {
uuid: savedConfig.uuid, uuid: savedConfig.uuid,
username: savedConfig.username, username: savedConfig.username,
memory: savedConfig.memory || 4096, memory: savedConfig.memory || 4096,
serverIp: packOptions.serverIp,
packName: packOptions.packName,
}, },
); );