Attempting to make references to the distribution index more streamlined. WIP

This commit is contained in:
Daniel Scalzi 2018-05-08 20:10:46 -04:00
parent f161e196be
commit 15a83a7736
No known key found for this signature in database
GPG Key ID: 5CA2F145B63535F9
7 changed files with 207 additions and 159 deletions

View File

@ -42,7 +42,7 @@ process.on('message', (msg) => {
res.then((v) => { res.then((v) => {
process.send({result: v, content: msg.content}) process.send({result: v, content: msg.content})
}).catch((err) => { }).catch((err) => {
process.send({result: v, content: msg.content}) process.send({result: err, content: msg.content})
}) })
} else { } else {
process.send({result: res, content: msg.content}) process.send({result: res, content: msg.content})

View File

@ -162,6 +162,7 @@ class DLTracker {
} }
let distributionData = null let distributionData = null
let launchWithLocal = false
/** /**
* Central object class used for control flow. This object stores data about * Central object class used for control flow. This object stores data about
@ -378,7 +379,7 @@ class AssetGuard extends EventEmitter {
* @param {string} launcherPath The root launcher directory. * @param {string} launcherPath The root launcher directory.
* @returns {Promise.<Object>} A promise which resolves to the distribution data object. * @returns {Promise.<Object>} A promise which resolves to the distribution data object.
*/ */
static retrieveDistributionDataFresh(launcherPath){ static refreshDistributionDataRemote(launcherPath){
return new Promise((resolve, reject) => { return new Promise((resolve, reject) => {
const distroURL = 'http://mc.westeroscraft.com/WesterosCraftLauncher/westeroscraft.json' const distroURL = 'http://mc.westeroscraft.com/WesterosCraftLauncher/westeroscraft.json'
const distroDest = path.join(launcherPath, 'westeroscraft.json') const distroDest = path.join(launcherPath, 'westeroscraft.json')
@ -404,24 +405,18 @@ class AssetGuard extends EventEmitter {
* Retrieve a local copy of the distribution index asynchronously. * Retrieve a local copy of the distribution index asynchronously.
* *
* @param {string} launcherPath The root launcher directory. * @param {string} launcherPath The root launcher directory.
* @param {boolean} cached Optional. False if the distro file should be read from the
* disk and re-cached, otherwise a cached copy will be returned.
* @returns {Promise.<Object>} A promise which resolves to the distribution data object. * @returns {Promise.<Object>} A promise which resolves to the distribution data object.
*/ */
static retrieveDistributionData(launcherPath, cached = true){ static refreshDistributionDataLocal(launcherPath){
return new Promise((resolve, reject) => { return new Promise((resolve, reject) => {
if(!cached || distributionData == null){ fs.readFile(path.join(launcherPath, 'westeroscraft.json'), 'utf-8', (err, data) => {
fs.readFile(path.join(launcherPath, 'westeroscraft.json'), 'utf-8', (err, data) => { if(!err){
if(!err){ distributionData = JSON.parse(data)
distributionData = JSON.parse(data) resolve(distributionData)
resolve(distributionData) } else {
} else { reject(err)
reject(err) }
} })
})
} else {
resolve(distributionData)
}
}) })
} }
@ -429,25 +424,27 @@ class AssetGuard extends EventEmitter {
* Retrieve a local copy of the distribution index synchronously. * Retrieve a local copy of the distribution index synchronously.
* *
* @param {string} launcherPath The root launcher directory. * @param {string} launcherPath The root launcher directory.
* @param {boolean} cached Optional. False if the distro file should be read from the
* disk and re-cached, otherwise a cached copy will be returned.
* @returns {Object} The distribution data object. * @returns {Object} The distribution data object.
*/ */
static retrieveDistributionDataSync(launcherPath, cached = true){ static refreshDistributionDataLocalSync(launcherPath){
if(!cached || distributionData == null){ distributionData = JSON.parse(fs.readFileSync(path.join(launcherPath, 'westeroscraft.json'), 'utf-8'))
distributionData = JSON.parse(fs.readFileSync(path.join(launcherPath, 'westeroscraft.json'), 'utf-8')) return distributionData
} }
/**
* Get a cached copy of the distribution index.
*/
static getDistributionData(){
return distributionData return distributionData
} }
/** /**
* Resolve the default selected server from the distribution index. * Resolve the default selected server from the distribution index.
* *
* @param {string} launcherPath The root launcher directory.
* @returns {Object} An object resolving to the default selected server. * @returns {Object} An object resolving to the default selected server.
*/ */
static resolveSelectedServer(launcherPath){ static resolveSelectedServer(){
const distro = AssetGuard.retrieveDistributionDataSync(launcherPath) const distro = AssetGuard.getDistributionData()
const servers = distro.servers const servers = distro.servers
for(let i=0; i<servers.length; i++){ for(let i=0; i<servers.length; i++){
if(servers[i].default_selected){ if(servers[i].default_selected){
@ -463,15 +460,12 @@ class AssetGuard extends EventEmitter {
* Returns null if the ID could not be found or the distro index has * Returns null if the ID could not be found or the distro index has
* not yet been loaded. * not yet been loaded.
* *
* @param {string} launcherPath The root launcher directory.
* @param {string} serverID The id of the server to retrieve. * @param {string} serverID The id of the server to retrieve.
* @returns {Object} The server object whose id matches the parameter. * @returns {Object} The server object whose id matches the parameter.
*/ */
static getServerById(launcherPath, serverID){ static getServerById(serverID){
if(distributionData == null){ const distro = AssetGuard.getDistributionData()
AssetGuard.retrieveDistributionDataSync(launcherPath, true) const servers = distro.servers
}
const servers = distributionData.servers
let serv = null let serv = null
for(let i=0; i<servers.length; i++){ for(let i=0; i<servers.length; i++){
if(servers[i].id === serverID){ if(servers[i].id === serverID){
@ -481,6 +475,34 @@ class AssetGuard extends EventEmitter {
return serv return serv
} }
/**
* Set whether or not we should launch with a local copy of the distribution
* index. This is useful for testing experimental changes to the distribution index.
*
* @param {boolean} value True if we should launch with a local copy. Otherwise false.
*/
static launchWithLocal(value, silent = false){
if(!silent){
if(value){
console.log('%c[AssetGuard]', 'color: #a02d2a; font-weight: bold', 'Will now launch using a local copy of the distribution index.')
console.log('%c[AssetGuard]', 'color: #a02d2a; font-weight: bold', 'Unless you are a developer, revert this change immediately.')
} else {
console.log('%c[AssetGuard]', 'color: #a02d2a; font-weight: bold', 'Will now retrieve a fresh copy of the distribution index on launch.')
}
}
launchWithLocal = value
}
/**
* Check if AssetGuard is configured to launch with a local copy
* of the distribution index.
*
* @returns {boolean} True if launching with local, otherwise false.
*/
static isLocalLaunch(){
return launchWithLocal
}
// #endregion // #endregion
// Miscellaneous Static Functions // Miscellaneous Static Functions
@ -1301,9 +1323,8 @@ class AssetGuard extends EventEmitter {
validateDistribution(serverpackid){ validateDistribution(serverpackid){
const self = this const self = this
return new Promise((resolve, reject) => { return new Promise((resolve, reject) => {
AssetGuard.refreshDistributionDataLocal(self.launcherPath).then((v) => {
const cbFunc = function(){ const serv = AssetGuard.getServerById(serverpackid)
const serv = AssetGuard.getServerById(self.launcherPath, serverpackid)
if(serv == null) { if(serv == null) {
console.error('Invalid server pack id:', serverpackid) console.error('Invalid server pack id:', serverpackid)
@ -1319,32 +1340,6 @@ class AssetGuard extends EventEmitter {
} }
} }
resolve(serv) resolve(serv)
}
AssetGuard.retrieveDistributionDataFresh(self.launcherPath).then((value) => {
console.log('Loaded fresh copy of the distribution index.')
cbFunc()
}).catch((err) => {
console.log('Failed to load fresh copy of the distribution index.')
console.log('Attempting to load an older copy of the distribution index.')
AssetGuard.retrieveDistributionData(self.launcherPath, false).then((value) => {
console.log('Successfully loaded an older copy of the distribution index.')
cbFunc()
}).catch((err) => {
console.log('Failed to load an older copy of the distribution index. Cannot launch.')
reject(err)
})
}) })
}) })
} }
@ -1405,7 +1400,7 @@ class AssetGuard extends EventEmitter {
loadForgeData(serverpack){ loadForgeData(serverpack){
const self = this const self = this
return new Promise(async (resolve, reject) => { return new Promise(async (resolve, reject) => {
let distro = AssetGuard.retrieveDistributionDataSync(self.launcherPath, true) let distro = AssetGuard.getDistributionData()
const servers = distro.servers const servers = distro.servers
let serv = null let serv = null

View File

@ -14,9 +14,9 @@ function onDistroLoad(data){
if(data != null){ if(data != null){
// Resolve the selected server if its value has yet to be set. // Resolve the selected server if its value has yet to be set.
if(ConfigManager.getSelectedServer() == null || AssetGuard.getServerById(ConfigManager.getLauncherDirectory(), ConfigManager.getSelectedServer()) == null){ if(ConfigManager.getSelectedServer() == null || AssetGuard.getServerById(ConfigManager.getSelectedServer()) == null){
console.log('Determining default selected server..') console.log('%c[Preloader]', 'color: #a02d2a; font-weight: bold', 'Determining default selected server..')
ConfigManager.setSelectedServer(AssetGuard.resolveSelectedServer(ConfigManager.getLauncherDirectory()).id) ConfigManager.setSelectedServer(AssetGuard.resolveSelectedServer().id)
ConfigManager.save() ConfigManager.save()
} }
} }
@ -24,7 +24,7 @@ function onDistroLoad(data){
} }
// Ensure Distribution is downloaded and cached. // Ensure Distribution is downloaded and cached.
AssetGuard.retrieveDistributionDataFresh(ConfigManager.getLauncherDirectory()).then((data) => { AssetGuard.refreshDistributionDataRemote(ConfigManager.getLauncherDirectory()).then((data) => {
console.log('%c[Preloader]', 'color: #a02d2a; font-weight: bold', 'Loaded distribution index.') console.log('%c[Preloader]', 'color: #a02d2a; font-weight: bold', 'Loaded distribution index.')
onDistroLoad(data) onDistroLoad(data)
@ -35,7 +35,7 @@ AssetGuard.retrieveDistributionDataFresh(ConfigManager.getLauncherDirectory()).t
console.log('%c[Preloader]', 'color: #a02d2a; font-weight: bold', 'Attempting to load an older version of the distribution index.') console.log('%c[Preloader]', 'color: #a02d2a; font-weight: bold', 'Attempting to load an older version of the distribution index.')
// Try getting a local copy, better than nothing. // Try getting a local copy, better than nothing.
AssetGuard.retrieveDistributionData(ConfigManager.getLauncherDirectory(), false).then((data) => { AssetGuard.refreshDistributionDateLocal(ConfigManager.getLauncherDirectory()).then((data) => {
console.log('%c[Preloader]', 'color: #a02d2a; font-weight: bold', 'Successfully loaded an older version of the distribution index.') console.log('%c[Preloader]', 'color: #a02d2a; font-weight: bold', 'Successfully loaded an older version of the distribution index.')
onDistroLoad(data) onDistroLoad(data)

View File

@ -6,7 +6,6 @@ const cp = require('child_process')
const {URL} = require('url') const {URL} = require('url')
// Internal Requirements // Internal Requirements
const {AssetGuard} = require('./assets/js/assetguard.js')
const AuthManager = require('./assets/js/authmanager.js') const AuthManager = require('./assets/js/authmanager.js')
const DiscordWrapper = require('./assets/js/discordwrapper.js') const DiscordWrapper = require('./assets/js/discordwrapper.js')
const Mojang = require('./assets/js/mojang.js') const Mojang = require('./assets/js/mojang.js')
@ -168,7 +167,7 @@ const refreshMojangStatuses = async function(){
const refreshServerStatus = async function(fade = false){ const refreshServerStatus = async function(fade = false){
console.log('Refreshing Server Status') console.log('Refreshing Server Status')
const serv = AssetGuard.getServerById(ConfigManager.getGameDirectory(), ConfigManager.getSelectedServer()) const serv = AssetGuard.getServerById(ConfigManager.getSelectedServer())
let pLabel = 'SERVER' let pLabel = 'SERVER'
let pVal = 'OFFLINE' let pVal = 'OFFLINE'
@ -418,30 +417,13 @@ function dlAsync(login = true){
aEx.on('message', (m) => { aEx.on('message', (m) => {
if(m.content === 'validateDistribution'){ if(m.content === 'validateDistribution'){
if(m.result instanceof Error){ setLaunchPercentage(20, 100)
serv = m.result
console.log('Validated distibution index.')
setOverlayContent( // Begin version load.
'Fatal Error', setLaunchDetails('Loading version information..')
'Could not load a copy of the distribution index. See the console for more details.', aEx.send({task: 0, content: 'loadVersionData', argsArr: [serv.mc_version]})
'Okay'
)
setOverlayHandler(null)
toggleOverlay(true)
toggleLaunchArea(false)
// Disconnect from AssetExec
aEx.disconnect()
} else {
setLaunchPercentage(20, 100)
serv = m.result
console.log('Forge Validation Complete.')
// Begin version load.
setLaunchDetails('Loading version information..')
aEx.send({task: 0, content: 'loadVersionData', argsArr: [serv.mc_version]})
}
} else if(m.content === 'loadVersionData'){ } else if(m.content === 'loadVersionData'){
@ -596,7 +578,7 @@ function dlAsync(login = true){
proc.stdout.on('data', gameStateChange) proc.stdout.on('data', gameStateChange)
// Init Discord Hook // Init Discord Hook
const distro = AssetGuard.retrieveDistributionDataSync(ConfigManager.getLauncherDirectory(), true) const distro = AssetGuard.getDistributionData()
if(distro.discord != null && serv.discord != null){ if(distro.discord != null && serv.discord != null){
DiscordWrapper.initRPC(distro.discord, serv.discord) DiscordWrapper.initRPC(distro.discord, serv.discord)
hasRPC = true hasRPC = true
@ -633,7 +615,62 @@ function dlAsync(login = true){
// Validate Forge files. // Validate Forge files.
setLaunchDetails('Loading server information..') setLaunchDetails('Loading server information..')
aEx.send({task: 0, content: 'validateDistribution', argsArr: [ConfigManager.getSelectedServer()]})
if(AssetGuard.isLocalLaunch()){
refreshDistributionIndex(false, (data) => {
onDistroRefresh(data)
aEx.send({task: 0, content: 'validateDistribution', argsArr: [ConfigManager.getSelectedServer()]})
}, (err) => {
console.error('Unable to refresh distribution index.', err)
if(AssetGuard.getDistributionData() == null){
setOverlayContent(
'Fatal Error',
'Could not load a copy of the distribution index. See the console for more details.',
'Okay'
)
setOverlayHandler(null)
toggleOverlay(true)
toggleLaunchArea(false)
// Disconnect from AssetExec
aEx.disconnect()
} else {
aEx.send({task: 0, content: 'validateDistribution', argsArr: [ConfigManager.getSelectedServer()]})
}
})
} else {
refreshDistributionIndex(true, (data) => {
onDistroRefresh(data)
aEx.send({task: 0, content: 'validateDistribution', argsArr: [ConfigManager.getSelectedServer()]})
}, (err) => {
refreshDistributionIndex(false, (data) => {
onDistroRefresh(data)
}, (err) => {
console.error('Unable to refresh distribution index.', err)
if(AssetGuard.getDistributionData() == null){
setOverlayContent(
'Fatal Error',
'Could not load a copy of the distribution index. See the console for more details.',
'Okay'
)
setOverlayHandler(null)
toggleOverlay(true)
toggleLaunchArea(false)
// Disconnect from AssetExec
aEx.disconnect()
} else {
aEx.send({task: 0, content: 'validateDistribution', argsArr: [ConfigManager.getSelectedServer()]})
}
})
})
}
} }
/** /**
@ -825,57 +862,54 @@ function displayArticle(articleObject, index){
*/ */
function loadNews(){ function loadNews(){
return new Promise((resolve, reject) => { return new Promise((resolve, reject) => {
AssetGuard.retrieveDistributionData(ConfigManager.getLauncherDirectory(), true).then((v) => { const distroData = AssetGuard.getDistributionData()
const newsFeed = v['news_feed'] const newsFeed = distroData['news_feed']
const newsHost = new URL(newsFeed).origin + '/' const newsHost = new URL(newsFeed).origin + '/'
$.get(newsFeed, (data) => { $.get(newsFeed, (data) => {
const items = $(data).find('item') const items = $(data).find('item')
const articles = [] const articles = []
for(let i=0; i<items.length; i++){ for(let i=0; i<items.length; i++){
// JQuery Element // JQuery Element
const el = $(items[i]) const el = $(items[i])
// Resolve date. // Resolve date.
const date = new Date(el.find('pubDate').text()).toLocaleDateString('en-US', {month: 'short', day: 'numeric', year: 'numeric', hour: 'numeric', minute: 'numeric'}) const date = new Date(el.find('pubDate').text()).toLocaleDateString('en-US', {month: 'short', day: 'numeric', year: 'numeric', hour: 'numeric', minute: 'numeric'})
// Resolve comments. // Resolve comments.
let comments = el.find('slash\\:comments').text() || '0' let comments = el.find('slash\\:comments').text() || '0'
comments = comments + ' Comment' + (comments === '1' ? '' : 's') comments = comments + ' Comment' + (comments === '1' ? '' : 's')
// Fix relative links in content. // Fix relative links in content.
let content = el.find('content\\:encoded').text() let content = el.find('content\\:encoded').text()
let regex = /src="(?!http:\/\/|https:\/\/)(.+)"/g let regex = /src="(?!http:\/\/|https:\/\/)(.+)"/g
let matches let matches
while(matches = regex.exec(content)){ while(matches = regex.exec(content)){
content = content.replace(matches[1], newsHost + matches[1]) content = content.replace(matches[1], newsHost + matches[1])
}
let link = el.find('link').text()
let title = el.find('title').text()
let author = el.find('dc\\:creator').text()
// Generate article.
articles.push(
{
link,
title,
date,
author,
content,
comments,
commentsLink: link + '#comments'
}
)
} }
resolve({
articles let link = el.find('link').text()
}) let title = el.find('title').text()
}).catch(err => { let author = el.find('dc\\:creator').text()
reject(err)
// Generate article.
articles.push(
{
link,
title,
date,
author,
content,
comments,
commentsLink: link + '#comments'
}
)
}
resolve({
articles
}) })
}).catch((err) => { }).catch(err => {
console.log('Error Loading News', err) reject(err)
}) })
}) })
} }

View File

@ -118,7 +118,7 @@ document.getElementById('serverSelectConfirm').addEventListener('click', () => {
const listings = document.getElementsByClassName('serverListing') const listings = document.getElementsByClassName('serverListing')
for(let i=0; i<listings.length; i++){ for(let i=0; i<listings.length; i++){
if(listings[i].hasAttribute('selected')){ if(listings[i].hasAttribute('selected')){
const serv = AssetGuard.getServerById(ConfigManager.getGameDirectory(), listings[i].getAttribute('servid')) const serv = AssetGuard.getServerById(listings[i].getAttribute('servid'))
ConfigManager.setSelectedServer(serv != null ? serv.id : null) ConfigManager.setSelectedServer(serv != null ? serv.id : null)
ConfigManager.save() ConfigManager.save()
updateSelectedServer(serv != null ? serv.name : null) updateSelectedServer(serv != null ? serv.name : null)
@ -161,7 +161,7 @@ function setServerListingHandlers(){
} }
function populateServerListings(){ function populateServerListings(){
const distro = AssetGuard.retrieveDistributionDataSync(ConfigManager.getLauncherDirectory()) const distro = AssetGuard.getDistributionData()
const giaSel = ConfigManager.getSelectedServer() const giaSel = ConfigManager.getSelectedServer()
const servers = distro.servers const servers = distro.servers
let htmlString = `` let htmlString = ``

View File

@ -4,13 +4,14 @@
*/ */
// Requirements // Requirements
const path = require('path') const path = require('path')
const {AssetGuard} = require('./assets/js/assetguard.js')
const ConfigManager = require('./assets/js/configmanager.js') const ConfigManager = require('./assets/js/configmanager.js')
let rscShouldLoad = false let rscShouldLoad = false
let fatalStartupError = false let fatalStartupError = false
function showMainUI(){ function showMainUI(){
updateSelectedServer(AssetGuard.getServerById(ConfigManager.getLauncherDirectory(), ConfigManager.getSelectedServer()).name) updateSelectedServer(AssetGuard.getServerById(ConfigManager.getSelectedServer()).name)
refreshServerStatus() refreshServerStatus()
setTimeout(() => { setTimeout(() => {
document.getElementById('frameBar').style.backgroundColor = 'rgba(1, 2, 1, 0.5)' document.getElementById('frameBar').style.backgroundColor = 'rgba(1, 2, 1, 0.5)'
@ -51,6 +52,24 @@ function showFatalStartupError(){
}, 750) }, 750)
} }
function onDistroRefresh(data){
updateSelectedServer(AssetGuard.getServerById(ConfigManager.getSelectedServer()).name)
refreshServerStatus()
initNews()
}
function refreshDistributionIndex(remote, onSuccess, onError){
if(remote){
AssetGuard.refreshDistributionDataRemote(ConfigManager.getLauncherDirectory())
.then(onSuccess)
.catch(onError)
} else {
AssetGuard.refreshDistributionDataLocal(ConfigManager.getLauncherDirectory())
.then(onSuccess)
.catch(onError)
}
}
// Synchronous Listener // Synchronous Listener
document.addEventListener('readystatechange', function(){ document.addEventListener('readystatechange', function(){

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.4.17", "revision": "3.7.1",
"server_ip": "mc.westeroscraft.com", "server_ip": "mc.westeroscraft.com",
"mc_version": "1.11.2", "mc_version": "1.11.2",
"discord": { "discord": {
@ -347,8 +347,8 @@
"name": "DynamicSurroundings General Configuration File", "name": "DynamicSurroundings General Configuration File",
"type": "file", "type": "file",
"artifact": { "artifact": {
"size": 19736, "size": 20258,
"MD5": "4c64fc6cbbb83b18012ed4820b0b496e", "MD5": "3df81248db151750b7d0a0193b327b47",
"path": "/config/dsurround/dsurround.cfg", "path": "/config/dsurround/dsurround.cfg",
"url": "http://mc.westeroscraft.com/WesterosCraftLauncher/prod-1.11.2/config/dsurround/dsurround.cfg" "url": "http://mc.westeroscraft.com/WesterosCraftLauncher/prod-1.11.2/config/dsurround/dsurround.cfg"
} }
@ -367,23 +367,23 @@
] ]
}, },
{ {
"id": "com.westeroscraft:westerosblocks:3.0.0-beta-6-133", "id": "com.westeroscraft:westerosblocks:3.1.0-alpha-2-135",
"name": "WesterosBlocks (3.0.0-beta-6-133)", "name": "WesterosBlocks (3.1.0-alpha-2-135)",
"type": "forgemod", "type": "forgemod",
"artifact": { "artifact": {
"size": 16321712, "size": 16854431,
"MD5": "5a89e2ab18916c18965fc93a0766cc6e", "MD5": "ed5b2349d1ce2496895a5e8839b77f74",
"extension": ".jar", "extension": ".jar",
"url": "http://mc.westeroscraft.com/WesterosCraftLauncher/prod-1.11.2/mods/WesterosBlocks.jar" "url": "http://mc.westeroscraft.com/WesterosCraftLauncher/prod-1.11.2/mods/WesterosBlocks.jar"
} }
}, },
{ {
"id": "com.westeroscraft:westeroscraftrp:2017-08-16", "id": "com.westeroscraft:westeroscraftrp:2018-05-05",
"name": "WesterosCraft Resource Pack (2017-08-16)", "name": "WesterosCraft Resource Pack (2018-05-05)",
"type": "file", "type": "file",
"artifact": { "artifact": {
"size": 45241339, "size": 46067606,
"MD5": "ec2d9fdb14d5c2eafe5975a240202f1a", "MD5": "0e08b0bcf44c9d266bfe067d865ffc1e",
"path": "resourcepacks/WesterosCraft.zip", "path": "resourcepacks/WesterosCraft.zip",
"url": "http://mc.westeroscraft.com/WesterosCraftLauncher/prod-1.11.2/resourcepacks/WesterosCraft.zip" "url": "http://mc.westeroscraft.com/WesterosCraftLauncher/prod-1.11.2/resourcepacks/WesterosCraft.zip"
} }
@ -416,7 +416,7 @@
"name": "WesterosCraft Test Server", "name": "WesterosCraft Test Server",
"description": "Main testing server. Experimental changes are live here.", "description": "Main testing server. Experimental changes are live here.",
"icon_url": "http://mc.westeroscraft.com/WesterosCraftLauncher/files/server-test.png", "icon_url": "http://mc.westeroscraft.com/WesterosCraftLauncher/files/server-test.png",
"revision": "3.7.0", "revision": "3.7.1",
"server_ip": "mc.westeroscraft.com:4444", "server_ip": "mc.westeroscraft.com:4444",
"mc_version": "1.11.2", "mc_version": "1.11.2",
"discord": { "discord": {
@ -748,8 +748,8 @@
"name": "DynamicSurroundings General Configuration File", "name": "DynamicSurroundings General Configuration File",
"type": "file", "type": "file",
"artifact": { "artifact": {
"size": 19736, "size": 20849,
"MD5": "4c64fc6cbbb83b18012ed4820b0b496e", "MD5": "8d6c08c158aa846162e2a179d6228181",
"path": "/config/dsurround/dsurround.cfg", "path": "/config/dsurround/dsurround.cfg",
"url": "http://mc.westeroscraft.com/WesterosCraftLauncher/test-1.11.2/config/dsurround/dsurround.cfg" "url": "http://mc.westeroscraft.com/WesterosCraftLauncher/test-1.11.2/config/dsurround/dsurround.cfg"
} }
@ -817,7 +817,7 @@
"name": "WesterosCraft 1.12.2 Test Server", "name": "WesterosCraft 1.12.2 Test Server",
"description": "Tests for our version change to 1.12.2 are live here.", "description": "Tests for our version change to 1.12.2 are live here.",
"icon_url": "http://mc.westeroscraft.com/WesterosCraftLauncher/files/server-test.png", "icon_url": "http://mc.westeroscraft.com/WesterosCraftLauncher/files/server-test.png",
"revision": "4.1.0", "revision": "4.1.1",
"server_ip": "mc.westeroscraft.com:4445", "server_ip": "mc.westeroscraft.com:4445",
"mc_version": "1.12.2", "mc_version": "1.12.2",
"discord": { "discord": {
@ -1146,8 +1146,8 @@
"name": "DynamicSurroundings General Configuration File", "name": "DynamicSurroundings General Configuration File",
"type": "file", "type": "file",
"artifact": { "artifact": {
"size": 19736, "size": 21195,
"MD5": "4c64fc6cbbb83b18012ed4820b0b496e", "MD5": "850f1103765f45698954b4e3b0b0369d",
"path": "/config/dsurround/dsurround.cfg", "path": "/config/dsurround/dsurround.cfg",
"url": "http://mc.westeroscraft.com/WesterosCraftLauncher/test-1.12.2/config/dsurround/dsurround.cfg" "url": "http://mc.westeroscraft.com/WesterosCraftLauncher/test-1.12.2/config/dsurround/dsurround.cfg"
} }