Compare commits

..

2 Commits

Author SHA1 Message Date
Daniel Scalzi
c6221e2afe
Add version.jar to cp until 1.17. 2021-08-26 20:19:25 -04:00
Daniel Scalzi
f0121e9597
Patches to get 1.17 working, need to revise into real solutions. 2021-08-26 01:11:09 -04:00
9 changed files with 1289 additions and 5629 deletions

View File

@ -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

2
.nvmrc
View File

@ -1 +1 @@
16 14

View File

@ -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
--- ---

View File

@ -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) => {

View File

@ -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'
) )

View File

@ -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.
*/ */

View File

@ -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

File diff suppressed because it is too large Load Diff

View File

@ -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",