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();
|
||||
|
||||
// Функция для получения последней версии релиза
|
||||
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,
|
||||
},
|
||||
});
|
||||
|
||||
|
Reference in New Issue
Block a user