ConfigManager improvements. v0.0.1-alpha.1

Added new configuration option, launchDetached.
Added validation function to ConfigManager to add missing keys (due to updates).
Updated westeroscraft.json
Game process can now be detached from the launcher.
This commit is contained in:
Daniel Scalzi 2018-05-10 00:01:38 -04:00
parent f1a98f2d45
commit d33476bcf9
No known key found for this signature in database
GPG Key ID: 5CA2F145B63535F9
6 changed files with 67 additions and 16 deletions

View File

@ -1562,6 +1562,7 @@ class AssetGuard extends EventEmitter {
if(concurrentDlQueue.length === 0){ if(concurrentDlQueue.length === 0){
return false return false
} else { } else {
console.debug('DLQueue', concurrentDlQueue)
async.eachLimit(concurrentDlQueue, limit, (asset, cb) => { async.eachLimit(concurrentDlQueue, limit, (asset, cb) => {
let count = 0; let count = 0;
mkpath.sync(path.join(asset.to, "..")) mkpath.sync(path.join(asset.to, ".."))

View File

@ -38,7 +38,8 @@ const DEFAULT_CONFIG = {
resWidth: 1280, resWidth: 1280,
resHeight: 720, resHeight: 720,
fullscreen: false, fullscreen: false,
autoConnect: true autoConnect: true,
launchDetached: true
}, },
launcher: {} launcher: {}
}, },
@ -78,9 +79,36 @@ exports.load = function(){
exports.save() exports.save()
} else { } else {
config = JSON.parse(fs.readFileSync(filePath, 'UTF-8')) config = JSON.parse(fs.readFileSync(filePath, 'UTF-8'))
config = validateKeySet(DEFAULT_CONFIG, config)
exports.save()
} }
} }
/**
* Validate that the destination object has at least every field
* present in the source object. Assign a default value otherwise.
*
* @param {Object} srcObj The source object to reference against.
* @param {Object} destObj The destination object.
* @returns {Object} A validated destination object.
*/
function validateKeySet(srcObj, destObj){
if(srcObj == null){
srcObj = {}
}
const validationBlacklist = ['authenticationDatabase']
const keys = Object.keys(srcObj)
console.log(keys)
for(let i=0; i<keys.length; i++){
if(typeof destObj[keys[i]] === 'undefined'){
destObj[keys[i]] = srcObj[keys[i]]
} else if(typeof srcObj[keys[i]] === 'object' && srcObj[keys[i]] != null && !(srcObj[keys[i]] instanceof Array) && validationBlacklist.indexOf(keys[i]) === -1){
destObj[keys[i]] = validateKeySet(srcObj[keys[i]], destObj[keys[i]])
}
}
return destObj
}
/** /**
* Retrieve the absolute path of the launcher directory. * Retrieve the absolute path of the launcher directory.
* *
@ -444,3 +472,22 @@ exports.isAutoConnect = function(def = false){
exports.setAutoConnect = function(autoConnect){ exports.setAutoConnect = function(autoConnect){
config.settings.game.autoConnect = autoConnect config.settings.game.autoConnect = autoConnect
} }
/**
* Check if the game should launch as a detached process.
*
* @param {boolean} def Optional. If true, the default value will be returned.
* @returns {boolean} Whether or not the game will launch as a detached process.
*/
exports.isLaunchDetached = function(def = false){
return !def ? config.settings.game.launchDetached : DEFAULT_CONFIG.settings.game.launchDetached
}
/**
* Change the status of whether or not the game should launch as a detached process.
*
* @param {boolean} launchDetached Whether or not the game should launch as a detached process.
*/
exports.setLaunchDetached = function(launchDetached){
config.settings.game.launchDetached = launchDetached
}

View File

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

View File

@ -72,7 +72,7 @@ function showMainUI(){
$('#loadingContainer').fadeOut(500, () => { $('#loadingContainer').fadeOut(500, () => {
$('#loadSpinnerImage').removeClass('rotating') $('#loadSpinnerImage').removeClass('rotating')
}) })
}, 500) }, 250)
}, 750) }, 750)
initNews() initNews()
@ -160,6 +160,12 @@ async function validateSelectedAccount(){
} }
} }
/**
* Temporary function to update the selected account along
* with the relevent UI elements.
*
* @param {string} uuid The UUID of the account.
*/
function setSelectedAccount(uuid){ function setSelectedAccount(uuid){
const authAcc = ConfigManager.setSelectedAccount(uuid) const authAcc = ConfigManager.setSelectedAccount(uuid)
ConfigManager.save() ConfigManager.save()

View File

@ -15,7 +15,7 @@
"name": "WesterosCraft Production Server", "name": "WesterosCraft Production Server",
"description": "Main WesterosCraft server. Connect to enter the Realm.", "description": "Main WesterosCraft server. Connect to enter the Realm.",
"icon_url": "http://mc.westeroscraft.com/WesterosCraftLauncher/files/server-prod.png", "icon_url": "http://mc.westeroscraft.com/WesterosCraftLauncher/files/server-prod.png",
"revision": "3.7.1", "revision": "3.7.2",
"server_ip": "mc.westeroscraft.com", "server_ip": "mc.westeroscraft.com",
"mc_version": "1.11.2", "mc_version": "1.11.2",
"discord": { "discord": {
@ -238,12 +238,12 @@
] ]
}, },
{ {
"id": "net.optifine:optifine:1.11.2_HD_U_C3", "id": "net.optifine:optifine:1.11.2_HD_U_C7",
"name": "Optifine (1.11.2_HD_U_C3)", "name": "Optifine (1.11.2_HD_U_C7)",
"type": "forgemod", "type": "forgemod",
"artifact": { "artifact": {
"size": 2106193, "size": 2254712,
"MD5": "82f495594cd50e1fda7a8aa0246239fc", "MD5": "0dd7761e908f9b245bb0dc0fac5649f5",
"extension": ".jar", "extension": ".jar",
"url": "http://mc.westeroscraft.com/WesterosCraftLauncher/prod-1.11.2/mods/OptiFine.jar" "url": "http://mc.westeroscraft.com/WesterosCraftLauncher/prod-1.11.2/mods/OptiFine.jar"
} }

View File

@ -17,14 +17,6 @@
<span id="accountSelectHeader">Select an Account</span> <span id="accountSelectHeader">Select an Account</span>
<div id="accountSelectList"> <div id="accountSelectList">
<div id="accountSelectListScrollable"> <div id="accountSelectListScrollable">
<button class="accountListing" uuid="fead86af28284e4e90d4cc5b9eb3ae84">
<img src="https://crafatar.com/renders/head/fead86af28284e4e90d4cc5b9eb3ae84?scale=2&default=MHF_Steve&overlay">
<div class="accountListingName">TheKraken7</div>
</button>
<button class="accountListing" uuid="48f0a3d02ae14ca4aa0011bb8bc4f39e">
<img src="https://crafatar.com/renders/head/48f0a3d02ae14ca4aa0011bb8bc4f39e?scale=2&default=MHF_Steve&overlay">
<div class="accountListingName">iPepsiHD</div>
</button>
<!-- Accounts populated here. --> <!-- Accounts populated here. -->
</div> </div>
</div> </div>