mirror of
https://github.com/dscalzi/HeliosLauncher.git
synced 2024-12-22 11:42:14 -08:00
Compare commits
2 Commits
f119985211
...
c6221e2afe
Author | SHA1 | Date | |
---|---|---|---|
|
c6221e2afe | ||
|
f0121e9597 |
2
.github/workflows/build.yml
vendored
2
.github/workflows/build.yml
vendored
@ -17,7 +17,7 @@ jobs:
|
|||||||
- name: Install Node.js, NPM and Yarn
|
- name: Install Node.js, NPM and Yarn
|
||||||
uses: actions/setup-node@v1
|
uses: actions/setup-node@v1
|
||||||
with:
|
with:
|
||||||
node-version: 16
|
node-version: 14
|
||||||
|
|
||||||
- name: Build/release Electron app
|
- name: Build/release Electron app
|
||||||
uses: samuelmeuli/action-electron-builder@v1
|
uses: samuelmeuli/action-electron-builder@v1
|
||||||
|
@ -83,7 +83,7 @@ This section details the setup of a basic developmentment environment.
|
|||||||
|
|
||||||
**System Requirements**
|
**System Requirements**
|
||||||
|
|
||||||
* [Node.js][nodejs] v16
|
* [Node.js][nodejs] v14
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
|
@ -5,7 +5,6 @@ const child_process = require('child_process')
|
|||||||
const crypto = require('crypto')
|
const crypto = require('crypto')
|
||||||
const EventEmitter = require('events')
|
const EventEmitter = require('events')
|
||||||
const fs = require('fs-extra')
|
const fs = require('fs-extra')
|
||||||
const StreamZip = require('node-stream-zip')
|
|
||||||
const path = require('path')
|
const path = require('path')
|
||||||
const Registry = require('winreg')
|
const Registry = require('winreg')
|
||||||
const request = require('request')
|
const request = require('request')
|
||||||
@ -223,6 +222,42 @@ class JavaGuard extends EventEmitter {
|
|||||||
this.mcVersion = mcVersion
|
this.mcVersion = mcVersion
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// /**
|
||||||
|
// * @typedef OracleJREData
|
||||||
|
// * @property {string} uri The base uri of the JRE.
|
||||||
|
// * @property {{major: string, update: string, build: string}} version Object containing version information.
|
||||||
|
// */
|
||||||
|
|
||||||
|
// /**
|
||||||
|
// * Resolves the latest version of Oracle's JRE and parses its download link.
|
||||||
|
// *
|
||||||
|
// * @returns {Promise.<OracleJREData>} Promise which resolved to an object containing the JRE download data.
|
||||||
|
// */
|
||||||
|
// static _latestJREOracle(){
|
||||||
|
|
||||||
|
// const url = 'https://www.oracle.com/technetwork/java/javase/downloads/jre8-downloads-2133155.html'
|
||||||
|
// const regex = /https:\/\/.+?(?=\/java)\/java\/jdk\/([0-9]+u[0-9]+)-(b[0-9]+)\/([a-f0-9]{32})?\/jre-\1/
|
||||||
|
|
||||||
|
// return new Promise((resolve, reject) => {
|
||||||
|
// request(url, (err, resp, body) => {
|
||||||
|
// if(!err){
|
||||||
|
// const arr = body.match(regex)
|
||||||
|
// const verSplit = arr[1].split('u')
|
||||||
|
// resolve({
|
||||||
|
// uri: arr[0],
|
||||||
|
// version: {
|
||||||
|
// major: verSplit[0],
|
||||||
|
// update: verSplit[1],
|
||||||
|
// build: arr[2]
|
||||||
|
// }
|
||||||
|
// })
|
||||||
|
// } else {
|
||||||
|
// resolve(null)
|
||||||
|
// }
|
||||||
|
// })
|
||||||
|
// })
|
||||||
|
// }
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @typedef OpenJDKData
|
* @typedef OpenJDKData
|
||||||
* @property {string} uri The base uri of the JRE.
|
* @property {string} uri The base uri of the JRE.
|
||||||
@ -246,41 +281,30 @@ class JavaGuard extends EventEmitter {
|
|||||||
if(process.platform === 'darwin') {
|
if(process.platform === 'darwin') {
|
||||||
return this._latestCorretto(major)
|
return this._latestCorretto(major)
|
||||||
} else {
|
} else {
|
||||||
return this._latestAdoptium(major)
|
return this._latestAdoptOpenJDK(major)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static _latestAdoptium(major) {
|
static _latestAdoptOpenJDK(major) {
|
||||||
|
|
||||||
const majorNum = Number(major)
|
|
||||||
const sanitizedOS = process.platform === 'win32' ? 'windows' : (process.platform === 'darwin' ? 'mac' : process.platform)
|
const sanitizedOS = process.platform === 'win32' ? 'windows' : (process.platform === 'darwin' ? 'mac' : process.platform)
|
||||||
const url = `https://api.adoptium.net/v3/assets/latest/${major}/hotspot?vendor=eclipse`
|
|
||||||
|
|
||||||
|
const url = `https://api.adoptopenjdk.net/v2/latestAssets/nightly/openjdk${major}?os=${sanitizedOS}&arch=x64&heap_size=normal&openjdk_impl=hotspot&type=jre`
|
||||||
|
|
||||||
return new Promise((resolve, reject) => {
|
return new Promise((resolve, reject) => {
|
||||||
request({url, json: true}, (err, resp, body) => {
|
request({url, json: true}, (err, resp, body) => {
|
||||||
if(!err && body.length > 0){
|
if(!err && body.length > 0){
|
||||||
|
resolve({
|
||||||
const targetBinary = body.find(entry => {
|
uri: body[0].binary_link,
|
||||||
return entry.version.major === majorNum
|
size: body[0].binary_size,
|
||||||
&& entry.binary.os === sanitizedOS
|
name: body[0].binary_name
|
||||||
&& entry.binary.image_type === 'jdk'
|
|
||||||
&& entry.binary.architecture === 'x64'
|
|
||||||
})
|
})
|
||||||
|
|
||||||
if(targetBinary != null) {
|
|
||||||
resolve({
|
|
||||||
uri: targetBinary.binary.package.link,
|
|
||||||
size: targetBinary.binary.package.size,
|
|
||||||
name: targetBinary.binary.package.name
|
|
||||||
})
|
|
||||||
} else {
|
|
||||||
resolve(null)
|
|
||||||
}
|
|
||||||
} else {
|
} else {
|
||||||
resolve(null)
|
resolve(null)
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
})
|
})
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static _latestCorretto(major) {
|
static _latestCorretto(major) {
|
||||||
@ -815,7 +839,6 @@ class JavaGuard extends EventEmitter {
|
|||||||
pathSet1 = new Set([
|
pathSet1 = new Set([
|
||||||
...pathSet1,
|
...pathSet1,
|
||||||
...(await JavaGuard._scanFileSystem('C:\\Program Files\\Java')),
|
...(await JavaGuard._scanFileSystem('C:\\Program Files\\Java')),
|
||||||
...(await JavaGuard._scanFileSystem('C:\\Program Files\\Eclipse Foundation')),
|
|
||||||
...(await JavaGuard._scanFileSystem('C:\\Program Files\\AdoptOpenJDK'))
|
...(await JavaGuard._scanFileSystem('C:\\Program Files\\AdoptOpenJDK'))
|
||||||
])
|
])
|
||||||
}
|
}
|
||||||
@ -1560,7 +1583,21 @@ class AssetGuard extends EventEmitter {
|
|||||||
this.java = new DLTracker([jre], jre.size, (a, self) => {
|
this.java = new DLTracker([jre], jre.size, (a, self) => {
|
||||||
if(verData.name.endsWith('zip')){
|
if(verData.name.endsWith('zip')){
|
||||||
|
|
||||||
this._extractJdkZip(a.to, dataDir, self)
|
const zip = new AdmZip(a.to)
|
||||||
|
const pos = path.join(dataDir, zip.getEntries()[0].entryName)
|
||||||
|
zip.extractAllToAsync(dataDir, true, (err) => {
|
||||||
|
if(err){
|
||||||
|
console.log(err)
|
||||||
|
self.emit('complete', 'java', JavaGuard.javaExecFromRoot(pos))
|
||||||
|
} else {
|
||||||
|
fs.unlink(a.to, err => {
|
||||||
|
if(err){
|
||||||
|
console.log(err)
|
||||||
|
}
|
||||||
|
self.emit('complete', 'java', JavaGuard.javaExecFromRoot(pos))
|
||||||
|
})
|
||||||
|
}
|
||||||
|
})
|
||||||
|
|
||||||
} else {
|
} else {
|
||||||
// Tar.gz
|
// Tar.gz
|
||||||
@ -1601,31 +1638,67 @@ class AssetGuard extends EventEmitter {
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
async _extractJdkZip(zipPath, runtimeDir, self) {
|
// _enqueueOracleJRE(dataDir){
|
||||||
|
// return new Promise((resolve, reject) => {
|
||||||
const zip = new StreamZip.async({
|
// JavaGuard._latestJREOracle().then(verData => {
|
||||||
file: zipPath,
|
// if(verData != null){
|
||||||
storeEntries: true
|
|
||||||
})
|
|
||||||
|
|
||||||
let pos = ''
|
// const combined = verData.uri + PLATFORM_MAP[process.platform]
|
||||||
try {
|
|
||||||
const entries = await zip.entries()
|
// const opts = {
|
||||||
pos = path.join(runtimeDir, Object.keys(entries)[0])
|
// url: combined,
|
||||||
|
// headers: {
|
||||||
|
// 'Cookie': 'oraclelicense=accept-securebackup-cookie'
|
||||||
|
// }
|
||||||
|
// }
|
||||||
|
|
||||||
|
// request.head(opts, (err, resp, body) => {
|
||||||
|
// if(err){
|
||||||
|
// resolve(false)
|
||||||
|
// } else {
|
||||||
|
// dataDir = path.join(dataDir, 'runtime', 'x64')
|
||||||
|
// const name = combined.substring(combined.lastIndexOf('/')+1)
|
||||||
|
// const fDir = path.join(dataDir, name)
|
||||||
|
// const jre = new Asset(name, null, parseInt(resp.headers['content-length']), opts, fDir)
|
||||||
|
// this.java = new DLTracker([jre], jre.size, (a, self) => {
|
||||||
|
// let h = null
|
||||||
|
// fs.createReadStream(a.to)
|
||||||
|
// .on('error', err => console.log(err))
|
||||||
|
// .pipe(zlib.createGunzip())
|
||||||
|
// .on('error', err => console.log(err))
|
||||||
|
// .pipe(tar.extract(dataDir, {
|
||||||
|
// map: (header) => {
|
||||||
|
// if(h == null){
|
||||||
|
// h = header.name
|
||||||
|
// }
|
||||||
|
// }
|
||||||
|
// }))
|
||||||
|
// .on('error', err => console.log(err))
|
||||||
|
// .on('finish', () => {
|
||||||
|
// fs.unlink(a.to, err => {
|
||||||
|
// if(err){
|
||||||
|
// console.log(err)
|
||||||
|
// }
|
||||||
|
// if(h.indexOf('/') > -1){
|
||||||
|
// h = h.substring(0, h.indexOf('/'))
|
||||||
|
// }
|
||||||
|
// const pos = path.join(dataDir, h)
|
||||||
|
// self.emit('complete', 'java', JavaGuard.javaExecFromRoot(pos))
|
||||||
|
// })
|
||||||
|
// })
|
||||||
|
|
||||||
|
// })
|
||||||
|
// resolve(true)
|
||||||
|
// }
|
||||||
|
// })
|
||||||
|
|
||||||
console.log('Extracting jdk..')
|
// } else {
|
||||||
await zip.extract(null, runtimeDir)
|
// resolve(false)
|
||||||
console.log('Cleaning up..')
|
// }
|
||||||
await fs.remove(zipPath)
|
// })
|
||||||
console.log('Jdk extraction complete.')
|
// })
|
||||||
|
|
||||||
} catch(err) {
|
// }
|
||||||
console.log(err)
|
|
||||||
} finally {
|
|
||||||
zip.close()
|
|
||||||
self.emit('complete', 'java', JavaGuard.javaExecFromRoot(pos))
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// _enqueueMojangJRE(dir){
|
// _enqueueMojangJRE(dir){
|
||||||
// return new Promise((resolve, reject) => {
|
// return new Promise((resolve, reject) => {
|
||||||
|
@ -4,8 +4,7 @@
|
|||||||
// Requirements
|
// Requirements
|
||||||
const cp = require('child_process')
|
const cp = require('child_process')
|
||||||
const crypto = require('crypto')
|
const crypto = require('crypto')
|
||||||
const { URL } = require('url')
|
const {URL} = require('url')
|
||||||
const { getServerStatus } = require('helios-core')
|
|
||||||
|
|
||||||
// Internal Requirements
|
// Internal Requirements
|
||||||
const DiscordWrapper = require('./assets/js/discordwrapper')
|
const DiscordWrapper = require('./assets/js/discordwrapper')
|
||||||
@ -226,11 +225,11 @@ const refreshServerStatus = async function(fade = false){
|
|||||||
|
|
||||||
try {
|
try {
|
||||||
const serverURL = new URL('my://' + serv.getAddress())
|
const serverURL = new URL('my://' + serv.getAddress())
|
||||||
|
const servStat = await ServerStatus.getStatus(serverURL.hostname, serverURL.port)
|
||||||
const servStat = await getServerStatus(47, serverURL.hostname, Number(serverURL.port))
|
if(servStat.online){
|
||||||
console.log(servStat)
|
pLabel = 'PLAYERS'
|
||||||
pLabel = 'PLAYERS'
|
pVal = servStat.onlinePlayers + '/' + servStat.maxPlayers
|
||||||
pVal = servStat.players.online + '/' + servStat.players.max
|
}
|
||||||
|
|
||||||
} catch (err) {
|
} catch (err) {
|
||||||
loggerLanding.warn('Unable to refresh server status, assuming offline.')
|
loggerLanding.warn('Unable to refresh server status, assuming offline.')
|
||||||
@ -324,7 +323,7 @@ function asyncSystemScan(mcVersion, launchAfter = true){
|
|||||||
// Show this information to the user.
|
// Show this information to the user.
|
||||||
setOverlayContent(
|
setOverlayContent(
|
||||||
'No Compatible<br>Java Installation Found',
|
'No Compatible<br>Java Installation Found',
|
||||||
'In order to join WesterosCraft, you need a 64-bit installation of Java 8. Would you like us to install a copy?',
|
'In order to join WesterosCraft, you need a 64-bit installation of Java 8. Would you like us to install a copy? By installing, you accept <a href="http://www.oracle.com/technetwork/java/javase/terms/license/index.html">Oracle\'s license agreement</a>.',
|
||||||
'Install Java',
|
'Install Java',
|
||||||
'Install Manually'
|
'Install Manually'
|
||||||
)
|
)
|
||||||
|
@ -85,7 +85,7 @@ bindFileSelectors()
|
|||||||
/**
|
/**
|
||||||
* Bind value validators to the settings UI elements. These will
|
* Bind value validators to the settings UI elements. These will
|
||||||
* validate against the criteria defined in the ConfigManager (if
|
* validate against the criteria defined in the ConfigManager (if
|
||||||
* any). If the value is invalid, the UI will reflect this and saving
|
* and). If the value is invalid, the UI will reflect this and saving
|
||||||
* will be disabled until the value is corrected. This is an automated
|
* will be disabled until the value is corrected. This is an automated
|
||||||
* process. More complex UI may need to be bound separately.
|
* process. More complex UI may need to be bound separately.
|
||||||
*/
|
*/
|
||||||
|
10
index.js
10
index.js
@ -1,5 +1,4 @@
|
|||||||
const remoteMain = require('@electron/remote/main')
|
require('@electron/remote/main').initialize()
|
||||||
remoteMain.initialize()
|
|
||||||
|
|
||||||
// Requirements
|
// Requirements
|
||||||
const { app, BrowserWindow, ipcMain, Menu } = require('electron')
|
const { app, BrowserWindow, ipcMain, Menu } = require('electron')
|
||||||
@ -88,6 +87,9 @@ ipcMain.on('distributionIndexDone', (event, res) => {
|
|||||||
// https://electronjs.org/docs/tutorial/offscreen-rendering
|
// https://electronjs.org/docs/tutorial/offscreen-rendering
|
||||||
app.disableHardwareAcceleration()
|
app.disableHardwareAcceleration()
|
||||||
|
|
||||||
|
// https://github.com/electron/electron/issues/18397
|
||||||
|
app.allowRendererProcessReuse = true
|
||||||
|
|
||||||
// Keep a global reference of the window object, if you don't, the window will
|
// Keep a global reference of the window object, if you don't, the window will
|
||||||
// be closed automatically when the JavaScript object is garbage collected.
|
// be closed automatically when the JavaScript object is garbage collected.
|
||||||
let win
|
let win
|
||||||
@ -102,11 +104,11 @@ function createWindow() {
|
|||||||
webPreferences: {
|
webPreferences: {
|
||||||
preload: path.join(__dirname, 'app', 'assets', 'js', 'preloader.js'),
|
preload: path.join(__dirname, 'app', 'assets', 'js', 'preloader.js'),
|
||||||
nodeIntegration: true,
|
nodeIntegration: true,
|
||||||
contextIsolation: false
|
contextIsolation: false,
|
||||||
|
enableRemoteModule: true
|
||||||
},
|
},
|
||||||
backgroundColor: '#171614'
|
backgroundColor: '#171614'
|
||||||
})
|
})
|
||||||
remoteMain.enable(win.webContents)
|
|
||||||
|
|
||||||
ejse.data('bkid', Math.floor((Math.random() * fs.readdirSync(path.join(__dirname, 'app', 'assets', 'images', 'backgrounds')).length)))
|
ejse.data('bkid', Math.floor((Math.random() * fs.readdirSync(path.join(__dirname, 'app', 'assets', 'images', 'backgrounds')).length)))
|
||||||
|
|
||||||
|
6706
package-lock.json
generated
6706
package-lock.json
generated
File diff suppressed because it is too large
Load Diff
16
package.json
16
package.json
@ -20,30 +20,28 @@
|
|||||||
"lint": "eslint --config .eslintrc.json ."
|
"lint": "eslint --config .eslintrc.json ."
|
||||||
},
|
},
|
||||||
"engines": {
|
"engines": {
|
||||||
"node": "16.x.x"
|
"node": "14.x.x"
|
||||||
},
|
},
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@electron/remote": "^2.0.1",
|
"@electron/remote": "^1.2.0",
|
||||||
"adm-zip": "^0.5.9",
|
"adm-zip": "^0.5.5",
|
||||||
"async": "^3.2.1",
|
"async": "^3.2.0",
|
||||||
"discord-rpc": "^3.2.0",
|
"discord-rpc": "^3.2.0",
|
||||||
"ejs": "^3.1.6",
|
"ejs": "^3.1.6",
|
||||||
"ejs-electron": "^2.1.1",
|
"ejs-electron": "^2.1.1",
|
||||||
"electron-updater": "^4.3.9",
|
"electron-updater": "^4.3.9",
|
||||||
"fs-extra": "^10.0.0",
|
"fs-extra": "^10.0.0",
|
||||||
"github-syntax-dark": "^0.5.0",
|
"github-syntax-dark": "^0.5.0",
|
||||||
"helios-core": "^0.1.0-alpha.3",
|
|
||||||
"jquery": "^3.6.0",
|
"jquery": "^3.6.0",
|
||||||
"node-stream-zip": "^1.15.0",
|
|
||||||
"request": "^2.88.2",
|
"request": "^2.88.2",
|
||||||
"semver": "^7.3.5",
|
"semver": "^7.3.5",
|
||||||
"tar-fs": "^2.1.1",
|
"tar-fs": "^2.1.1",
|
||||||
"winreg": "^1.2.4"
|
"winreg": "^1.2.4"
|
||||||
},
|
},
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
"electron": "^15.2.0",
|
"electron": "^13.1.4",
|
||||||
"electron-builder": "^22.13.1",
|
"electron-builder": "^22.11.7",
|
||||||
"eslint": "^8.0.1"
|
"eslint": "^7.29.0"
|
||||||
},
|
},
|
||||||
"repository": {
|
"repository": {
|
||||||
"type": "git",
|
"type": "git",
|
||||||
|
Loading…
Reference in New Issue
Block a user