Explorar o código

Game now saves to OS-specific data directory. Fixed issue where logs folder did not save to correct location. Fixed issue with authentication code. Continuing work on Java validation code.

Daniel Scalzi %!s(int64=7) %!d(string=hai) anos
pai
achega
13cc555afd

+ 80 - 2
app/assets/js/assetguard.js

@@ -33,6 +33,13 @@ const path = require('path')
 const Registry = require('winreg')
 const request = require('request')
 
+// Constants
+const PLATFORM_MAP = {
+    win32: '-windows-x64.tar.gz',
+    darwin: '-macosx-x64.tar.gz',
+    linux: '-linux-x64.tar.gz'
+}
+
 // Classes
 
 /** Class representing a base asset. */
@@ -514,6 +521,42 @@ class AssetGuard extends EventEmitter {
     // Static Java Utility
     // #region
 
+    /**
+     * @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 = 'http://www.oracle.com/technetwork/java/javase/downloads/jre8-downloads-2133155.html'
+        const regex = /http:\/\/.+?(?=\/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)
+                }
+            })
+        })
+    }
+
     /**
      * Validates that a Java binary is at least 64 bit. This makes use of the non-standard
      * command line option -XshowSettings:properties. The output of this contains a property,
@@ -737,7 +780,7 @@ class AssetGuard extends EventEmitter {
         return null
     }
 
-    static async validate(){
+    static async validateJava(){
         return await AssetGuard['_' + process.platform + 'JavaValidate']()
     }
 
@@ -778,6 +821,10 @@ class AssetGuard extends EventEmitter {
         })
     }
 
+    loadMojangLauncherData(){
+        //https://launchermeta.mojang.com/mc/launcher.json
+    }
+
 
     // Asset (Category=''') Validation Functions
     // #region
@@ -1141,6 +1188,36 @@ class AssetGuard extends EventEmitter {
         */
     }
 
+    // #endregion
+
+    // Java (Category=''') Validation (download) Functions
+    // #region
+
+    async _enqueueOracleJRE(dir){
+        const verData = await AssetGuard._latestJREOracle()
+
+        const combined = verData.uri + PLATFORM_MAP[process.platform]
+        const name = combined.substring(combined.lastIndexOf('/')+1)
+        const fDir = path.join(dir, name)
+
+        const opts = {
+            url: combined,
+            headers: {
+                'Cookie': 'oraclelicense=accept-securebackup-cookie'
+            }
+        }
+
+        if(verData != null){
+            const jre = new Asset(name, null, 0, opts, fDir)
+            this.java = new DLTracker([jre], jre.size)
+            return true
+        } else {
+            return false
+        }
+    }
+
+
+
     // #endregion
 
     // #endregion
@@ -1182,7 +1259,8 @@ class AssetGuard extends EventEmitter {
                         req.resume()
                     } else {
                         req.abort()
-                        console.log('Failed to download ' + asset.from + '. Response code', resp.statusCode)
+                        const realFrom = typeof asset.from === 'object' ? asset.from.url : asset.from
+                        console.log('Failed to download ' + realFrom + '. Response code', resp.statusCode)
                         self.progress += asset.size*1
                         self.emit('totaldlprogress', {acc: self.progress, total: self.totaldlsize})
                         cb()

+ 3 - 3
app/assets/js/authmanager.js

@@ -4,12 +4,12 @@ const Mojang = require('./mojang.js')
 exports.addAccount = async function(username, password){
     try{
         const session = await Mojang.authenticate(username, password, ConfigManager.getClientToken)
+        const ret = ConfigManager.addAuthAccount(session.selectedProfile.id, session.accessToken, username, session.selectedProfile.name)
+        ConfigManager.save()
+        return ret
     } catch (err){
         return Promise.reject(err)
     }
-    const ret = ConfigManager.addAuthAccount(session.selectedProfile.id, session.accessToken, username, session.selectedProfile.name)
-    ConfigManager.save()
-    return ret
 }
 
 exports.validateSelected = async function(){

+ 17 - 7
app/assets/js/configmanager.js

@@ -4,6 +4,9 @@ const os = require('os')
 const path = require('path')
 const uuidV4 = require('uuid/v4')
 
+const sysRoot = process.env.APPDATA || (process.platform == 'darwin' ? process.env.HOME + '/Library/Application Support' : '/var/local')
+const dataPath = path.join(sysRoot, '.westeroscraft')
+
 function resolveMaxRAM(){
     const mem = os.totalmem()
     return mem >= 8000000000 ? '4G' : (mem >= 6000000000 ? '3G' : '2G')
@@ -29,15 +32,13 @@ const DEFAULT_CONFIG = {
             ],
         },
         game: {
-            directory: path.join(__dirname, '..', '..', '..', 'target', 'test', 'mcfiles'),
+            directory: path.join(dataPath, 'game'),
             resWidth: 1280,
             resHeight: 720,
             fullscreen: false,
             autoConnect: true
         },
-        launcher: {
-
-        }
+        launcher: {}
     },
     clientToken: uuidV4().replace(/-/g, ''),
     selectedServer: null, // Resolved
@@ -53,7 +54,7 @@ let config = null;
  * Save the current configuration to a file.
  */
 exports.save = function(){
-    const filePath = path.join(config.settings.game.directory, 'config.json')
+    const filePath = path.join(dataPath, 'config.json')
     fs.writeFileSync(filePath, JSON.stringify(config, null, 4), 'UTF-8')
 }
 
@@ -65,8 +66,8 @@ exports.save = function(){
  */
 exports.load = function(){
     // Determine the effective configuration.
-    const EFFECTIVE_CONFIG = config == null ? DEFAULT_CONFIG : config
-    const filePath = path.join(EFFECTIVE_CONFIG.settings.game.directory, 'config.json')
+    //const EFFECTIVE_CONFIG = config == null ? DEFAULT_CONFIG : config
+    const filePath = path.join(dataPath, 'config.json')
 
     if(!fs.existsSync(filePath)){
         // Create all parent directories.
@@ -78,6 +79,15 @@ exports.load = function(){
     }
 }
 
+/**
+ * Retrieve the absolute path of the launcher directory.
+ * 
+ * @returns {string} The absolute path of the launcher directory.
+ */
+exports.getLauncherDirectory = function(){
+    return dataPath
+}
+
 // System Settings (Unconfigurable on UI)
 
 /**

+ 12 - 0
app/assets/js/javaguard.js

@@ -267,6 +267,18 @@ class JavaGuard extends EventEmitter {
         })
     }
 
+    _headOracleJREDlSize(url){
+        return new Promise((resolve, reject) => {
+            request.head(url, (err, resp, body) => {
+                if(err){
+                    reject(err)
+                } else {
+                    resolve(resp.headers['content-length'])
+                }
+            })
+        })
+    }
+
     async _downloadOracleJRE(acceptLicense, dir){
 
         if(!acceptLicense){

+ 3 - 1
app/assets/js/processbuilder.js

@@ -42,7 +42,9 @@ class ProcessBuilder {
 
         console.log(args)
 
-        const child = child_process.spawn(ConfigManager.getJavaExecutable(), args)
+        const child = child_process.spawn(ConfigManager.getJavaExecutable(), args, {
+            cwd: ConfigManager.getGameDirectory()
+        })
 
         child.stdout.on('data', (data) => {
             console.log('Minecraft:', data.toString('utf8'))