refactor: update Minecraft download logic with URL and args support
This commit is contained in:
@ -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,
|
||||||
},
|
},
|
||||||
});
|
});
|
||||||
|
|
||||||
|
@ -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,
|
||||||
},
|
},
|
||||||
);
|
);
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user