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';
} else {
versionToLaunch = '1.21.4';
// Найти версию пакета, 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 = 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,
},
});