This commit is contained in:
2025-05-11 07:58:45 +02:00
parent 0c01e826d9
commit 1106ced049
4 changed files with 169 additions and 175 deletions

View File

@@ -1,182 +1,79 @@
const os = require("os")
const { execSync } = require("child_process")
const fs = require("fs")
const path = require("path")
const osmeta = require("./osmeta")
const { exec } = require("child_process")
const files = require("./files")
const config = require("../config.json")
const settings = require("./settings")
const { dialog, BrowserWindow, shell } = require("electron")
const os = require("os")
const download = require("download")
const AdmZip = require("adm-zip")
function isJavaInstalled() {
return new Promise((resolve, reject) => {
try {
exec(`"${settings.get("javaPath") == "" ? "java" : settings.get("javaPath")}" -version`, (error, stdout, stderr) => {
if (error) {
reject({
java: false
})
}
const output = `${stdout}\n${stderr}`
const lines = output.split("\n")
const version = lines.filter(line => line.includes("version \""))[0]
try {
let matchRegEx
if (version.includes("_")) {
matchRegEx = /(?<major>\d+)\.(?<minor>\d+)\.(?<patch>\d+)\_(?<update>\d+)/
} else {
matchRegEx = /(?<major>\d+)\.(?<minor>\d+)\.(?<patch>\d+)/
}
const versionMatch = version.match(matchRegEx)
const { major, minor, patch, update } = versionMatch.groups
resolve({
java: true,
version: {
major: parseInt(major),
minor: parseInt(minor),
patch: parseInt(patch),
update: update ? parseInt(update) : null
}
})
} catch (error) {
reject({
java: false,
error
})
}
})
} catch (error) {
reject({
java: false,
error
})
}
})
const JAVA_DOWNLOAD_URL = {
win32: "https://download.oracle.com/java/17/archive/jdk-17.0.12_windows-x64_bin.zip",
darwin: "https://download.oracle.com/java/17/archive/jdk-17.0.12_macos-x64_bin.tar.gz",
linux: "https://download.oracle.com/java/17/archive/jdk-17.0.12_linux-aarch64_bin.tar.gz",
}
async function showJavaErrorBox() {
const javaErrorBox = await dialog.showMessageBox(BrowserWindow.getFocusedWindow(), {
title: "Mauvaise version de Java",
message: "Mauvaise version de Java",
detail: "La version de java installé sur votre ordinateur n'est pas compatible avec la version de minecraft utilisé",
icon: path.join(__dirname, "code/app/assets/img/java.png"),
buttons: [
"Fermer",
"Installer automatiquement java",
"Installer manuellement java",
"Utilise un chemin d'accès personnalié",
],
cancelId: 0,
defaultId: 1
})
return javaErrorBox
}
function installJava(dest) {
return new Promise(async (resolve, reject) => {
const response = await fetch(`${config.apiServicesURL}/api/java`)
const java = await response.json()
const arch = osmeta.arch() == "unknow" ? "x64" : osmeta.arch()
if (java.downloads[os.platform()]) {
if (java.downloads[os.platform()][arch]) {
files.downloadFile(config.apiServicesURL + java.downloads[os.platform()][arch].url, path.join(dest, "java.zip"), (error, file) => {
if (error) throw error
try {
const zip = new AdmZip(path.join(dest, "java.zip"))
zip.extractAllTo(path.join(dest, "java"), true)
files.removeFile(path.join(dest, "java.zip"))
if (os.platform() == "darwin") {
exec(`chmod +x "${path.join(dest, "java", "jre-1.8.0_411.jre", "Contents", "Home", "bin", "java")}"`, (error) => {
if (error) reject(error)
resolve(path.join(dest, "java", "jre-1.8.0_411.jre", "Contents", "Home", "bin", "java"))
})
} else {
exec(`chmod +x "${path.join(dest, "java", "bin", "java")}"`, (error) => {
if (error) reject(error)
resolve(path.join(dest, "java", "bin", "java"))
})
}
} catch (err) {
reject(err)
}
})
function checkJavaVersion(requiredVersion = "17") {
try {
const javaVersionOutput = execSync("java -version", {
encoding: "utf8",
stdio: "pipe"
})
const versionMatch = javaVersionOutput.match(/"(\d+\.\d+)(\.\d+)?_\d+"/)
if (versionMatch) {
const installedVersion = versionMatch[1]
console.log(`Java is installed. Version: ${installedVersion}`)
if (parseFloat(installedVersion) >= parseFloat(requiredVersion)) {
console.log("Required Java version is already installed.")
return true
} else {
reject(new Error("Java are not supported for your OS arch"))
console.log(`Installed Java version (${installedVersion}) is less than required version (${requiredVersion}).`)
return false
}
} else {
reject(new Error("Java are not supported for your OS"))
console.log("Java is installed but version could not be determined.")
return false
}
})
} catch (error) {
console.log("Java is not installed.")
return false
}
}
async function main(requiredJavaVersionMinor, dest) {
return new Promise(async (resolve, reject) => {
try {
const java = await isJavaInstalled()
if (java.version.minor < parseInt(requiredJavaVersionMinor)) {
const javaErrorBox = await showJavaErrorBox()
switch (javaErrorBox.response) {
case 0:
resolve()
break
case 1:
installJava(dest).then(javaPath => {
resolve(javaPath)
})
break
case 2:
shell.openExternal(`https://www.java.com/fr/download/manual.jsp`)
resolve()
break
case 3:
const javaBinPathSelect = await dialog.showOpenDialog(BrowserWindow.getFocusedWindow(), {
filters: [
{
name: "java",
}
]
})
if (javaBinPathSelect.canceled) {
showJavaErrorBox()
} else {
resolve(javaBinPathSelect.filePaths[0])
}
break
}
} else {
resolve()
}
} catch (error) {
const javaErrorBox = await showJavaErrorBox()
switch (javaErrorBox.response) {
case 0:
resolve()
break
case 1:
installJava(dest).then(javaPath => {
resolve(javaPath)
})
break
case 2:
shell.openExternal(`https://www.java.com/fr/download/manual.jsp`)
resolve()
break
case 3:
const javaBinPathSelect = await dialog.showOpenDialog(BrowserWindow.getFocusedWindow(), {
filters: [
{
name: "java",
}
]
})
if (javaBinPathSelect.canceled) {
showJavaErrorBox()
} else {
resolve(javaBinPathSelect.filePaths[0])
}
break
}
}
async function downloadAndInstallJava(extractPath = null) {
const platform = os.platform()
const tempDir = fs.mkdtempSync(path.join(os.tmpdir(), "java-installer-"))
const downloadUrl = JAVA_DOWNLOAD_URL[platform]
if (!downloadUrl) {
console.error("Unsupported platform for Java installation.")
return
}
const zipPath = path.join(tempDir, "java-package.zip")
await download(downloadUrl, tempDir, {
filename: "java-package.zip"
})
const extractionDir = extractPath || tempDir
const zip = new AdmZip(zipPath)
zip.extractAllTo(extractionDir, true)
fs.unlinkSync(zipPath)
}
module.exports.java = main
async function main(customExtractPath) {
const requiredVersion = "17"
const isJavaInstalled = checkJavaVersion(requiredVersion)
if (!isJavaInstalled) {
if (!fs.existsSync(path.join(customExtractPath, "jdk-17.0.12", "bin", os.platform() == "win32" ? "java.exe" : "java"))) {
await downloadAndInstallJava(customExtractPath || path.join(__dirname, "..", "..", "java"))
}
} else {
console.log("No further action is required.")
}
}
module.exports = {
main
}