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();
// Функция для получения последней версии релиза
export async function getLatestReleaseVersion(): Promise<string> {
// Модифицированная функция для получения последней версии релиза с произвольного URL
export async function getLatestReleaseVersion(apiUrl: string): Promise<string> {
try {
const response = await fetch(GITHUB_API_RELEASE_URL);
const response = await fetch(apiUrl);
const data = await response.json();
return data.tag_name || '0.0.0';
} catch (error) {
@ -345,15 +345,22 @@ async function ensureAuthlibInjectorExists(appPath: string): Promise<string> {
// Инициализация IPC обработчиков
export function initMinecraftHandlers() {
// Обработчик для скачивания и распаковки
ipcMain.handle('download-and-extract', async (event) => {
ipcMain.handle('download-and-extract', async (event, options) => {
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 minecraftDir = path.join(appPath, '.minecraft');
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 = '';
// Проверяем текущую версию, если файл существует
@ -363,7 +370,12 @@ export function initMinecraftHandlers() {
// Проверяем, нужно ли обновление
if (currentVersion === latestVersion) {
return { success: true, updated: false, version: currentVersion };
return {
success: true,
updated: false,
version: currentVersion,
packName,
};
}
const tempDir = path.join(appPath, 'temp');
@ -374,10 +386,10 @@ export function initMinecraftHandlers() {
}
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);
});
@ -406,7 +418,7 @@ export function initMinecraftHandlers() {
const versionsContents = fs.readdirSync(versionsDir);
console.log('Доступные версии:', versionsContents);
return { success: true, updated: true, version: latestVersion };
return { success: true, updated: true, version: latestVersion, packName };
} catch (error) {
console.error('Error in download-and-extract:', error);
throw error;
@ -416,7 +428,18 @@ export function initMinecraftHandlers() {
// Обработчик для запуска Minecraft
ipcMain.handle('launch-minecraft', async (event, gameConfig) => {
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 minecraftDir = path.join(appPath, '.minecraft');
const versionsDir = path.join(minecraftDir, 'versions');
@ -427,14 +450,17 @@ export function initMinecraftHandlers() {
: [];
console.log('Доступные версии:', versionsContents);
// Найти версию Comfort или версию с Fabric
let versionToLaunch = '';
if (versionsContents.includes('1.21.4-fabric0.16.14')) {
versionToLaunch = '1.21.4-fabric0.16.14';
} else if (versionsContents.includes('Comfort')) {
versionToLaunch = 'Comfort';
// Найти версию пакета, Fabric или базовую версию
let versionToLaunch = versionToLaunchOverride;
if (!versionToLaunch) {
if (versionsContents.includes(`${baseVersion}-fabric0.16.14`)) {
versionToLaunch = `${baseVersion}-fabric0.16.14`;
} else if (versionsContents.includes(packName)) {
versionToLaunch = packName;
} else {
versionToLaunch = '1.21.4';
versionToLaunch = baseVersion;
}
}
console.log('Запускаем версию:', versionToLaunch);
@ -642,22 +668,34 @@ export function initMinecraftHandlers() {
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({
gamePath: comfortDir,
gamePath: packDir,
resourcePath: minecraftDir,
javaPath,
version: versionToLaunch,
launcherName: 'popa-popa',
server: serverConfig, // Используем созданный объект конфигурации
extraJVMArgs: [
'-Dlog4j2.formatMsgNoLookups=true',
`-javaagent:${authlibPath}=ely.by`,
`-Xmx${gameConfig.memory || 2048}M`,
`-Xmx${memory}M`,
],
// Используем данные аутентификации Yggdrasil
accessToken: gameConfig.accessToken,
accessToken,
gameProfile: {
id: gameConfig.uuid,
name: gameConfig.username,
id: uuid,
name: username,
},
});

View File

@ -90,8 +90,21 @@ const LaunchPage = () => {
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(
'download-and-extract',
packOptions,
);
if (downloadResult?.success) {
@ -99,25 +112,31 @@ const LaunchPage = () => {
if (downloadResult.updated) {
showNotification(
`Сборка успешно обновлена до версии ${downloadResult.version}`,
`Сборка ${downloadResult.packName} успешно обновлена до версии ${downloadResult.version}`,
'success',
);
needsSecondAttempt = true;
} else {
showNotification(
`Установлена актуальная версия сборки ${downloadResult.version}`,
`Установлена актуальная версия сборки ${downloadResult.packName} (${downloadResult.version})`,
'info',
);
}
const launchResult = await window.electron.ipcRenderer.invoke(
'launch-minecraft',
{
// Опции для запуска
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(
'launch-minecraft',
launchOptions,
);
if (needsSecondAttempt) {
@ -135,6 +154,8 @@ const LaunchPage = () => {
uuid: savedConfig.uuid,
username: savedConfig.username,
memory: savedConfig.memory || 4096,
serverIp: packOptions.serverIp,
packName: packOptions.packName,
},
);