feat: New Mojang Statuses
This commit is contained in:
parent
779a9a54ec
commit
b62910a7c4
@ -7,7 +7,7 @@
|
|||||||
*/
|
*/
|
||||||
// Requirements
|
// Requirements
|
||||||
const request = require('request')
|
const request = require('request')
|
||||||
const logger = require('./loggerutil')('%c[Mojang]', 'color: #a02d2a; font-weight: bold')
|
const logger = require('./loggerutil')('%c[Mojang]', 'color: #a02d2a; font-weight: bold')
|
||||||
|
|
||||||
// Constants
|
// Constants
|
||||||
const minecraftAgent = {
|
const minecraftAgent = {
|
||||||
@ -15,44 +15,46 @@ const minecraftAgent = {
|
|||||||
version: 1
|
version: 1
|
||||||
}
|
}
|
||||||
const authpath = 'https://authserver.mojang.com'
|
const authpath = 'https://authserver.mojang.com'
|
||||||
|
// Service name comes from https://github.com/GeekcornerGH/helios-status-page/tree/master/api
|
||||||
const statuses = [
|
const statuses = [
|
||||||
{
|
{
|
||||||
service: 'sessionserver.mojang.com',
|
service: 'mojang-multiplayer-session-service',
|
||||||
status: 'grey',
|
status: 'grey',
|
||||||
name: 'Multiplayer Session Service',
|
name: 'Multiplayer Session Service',
|
||||||
essential: true
|
essential: true
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
service: 'authserver.mojang.com',
|
service: 'mojang-authserver',
|
||||||
status: 'grey',
|
status: 'grey',
|
||||||
name: 'Authentication Service',
|
name: 'Authentication Service',
|
||||||
essential: true
|
essential: true
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
service: 'textures.minecraft.net',
|
service: 'minecraft-skins',
|
||||||
status: 'grey',
|
status: 'grey',
|
||||||
name: 'Minecraft Skins',
|
name: 'Minecraft Skins',
|
||||||
essential: false
|
essential: false
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
service: 'api.mojang.com',
|
service: 'mojang-s-public-api',
|
||||||
status: 'grey',
|
status: 'grey',
|
||||||
name: 'Public API',
|
name: 'Public API',
|
||||||
essential: false
|
essential: false
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
service: 'minecraft.net',
|
service: 'minecraft-net-website',
|
||||||
status: 'grey',
|
status: 'grey',
|
||||||
name: 'Minecraft.net',
|
name: 'Minecraft.net',
|
||||||
essential: false
|
essential: false
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
service: 'account.mojang.com',
|
service: 'mojang-accounts-website',
|
||||||
status: 'grey',
|
status: 'grey',
|
||||||
name: 'Mojang Accounts Website',
|
name: 'Mojang Accounts Website',
|
||||||
essential: false
|
essential: false
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
|
const requestURL = function (serviceURL) { return `https://raw.githubusercontent.com/GeekCornerGH/helios-status-page/master/api/${serviceURL.service}/uptime.json`}
|
||||||
|
|
||||||
// Functions
|
// Functions
|
||||||
|
|
||||||
@ -64,8 +66,8 @@ const statuses = [
|
|||||||
* @param {string} status A valid status code.
|
* @param {string} status A valid status code.
|
||||||
* @returns {string} The hex color of the status code.
|
* @returns {string} The hex color of the status code.
|
||||||
*/
|
*/
|
||||||
exports.statusToHex = function(status){
|
exports.statusToHex = function (status) {
|
||||||
switch(status.toLowerCase()){
|
switch (status.toLowerCase()) {
|
||||||
case 'green':
|
case 'green':
|
||||||
return '#a5c325'
|
return '#a5c325'
|
||||||
case 'yellow':
|
case 'yellow':
|
||||||
@ -86,37 +88,32 @@ exports.statusToHex = function(status){
|
|||||||
*
|
*
|
||||||
* @see http://wiki.vg/Mojang_API#API_Status
|
* @see http://wiki.vg/Mojang_API#API_Status
|
||||||
*/
|
*/
|
||||||
exports.status = function(){
|
exports.status = async function () {
|
||||||
return new Promise((resolve, reject) => {
|
return new Promise(async (resolve, reject) => {
|
||||||
request.get('https://status.mojang.com/check',
|
let data = []
|
||||||
{
|
for(let i=0; i<statuses.length; i++){
|
||||||
json: true,
|
request.get(requestURL(statuses[i]),
|
||||||
timeout: 2500
|
{
|
||||||
},
|
json: true,
|
||||||
function(error, response, body){
|
timeout: 10000
|
||||||
|
},
|
||||||
|
function (error, response, body) {
|
||||||
|
|
||||||
if(error || response.statusCode !== 200){
|
if (error || response.statusCode !== 200) {
|
||||||
logger.warn('Unable to retrieve Mojang status.')
|
logger.warn('Unable to retrieve Mojang status.')
|
||||||
logger.debug('Error while retrieving Mojang statuses:', error)
|
logger.debug('Error while retrieving Mojang statuses:', error)
|
||||||
//reject(error || response.statusCode)
|
data.push(statuses[i])
|
||||||
for(let i=0; i<statuses.length; i++){
|
//reject(error || response.statusCode)
|
||||||
statuses[i].status = 'grey'
|
resolve(statuses)
|
||||||
|
} else {
|
||||||
|
if (response.body.color == "brightgreen") statuses[i].status = "green"
|
||||||
|
else statuses[i].status = "red"
|
||||||
|
data.push(statuses[i])
|
||||||
|
resolve(statuses)
|
||||||
}
|
}
|
||||||
resolve(statuses)
|
})
|
||||||
} else {
|
}
|
||||||
for(let i=0; i<body.length; i++){
|
return data
|
||||||
const key = Object.keys(body[i])[0]
|
|
||||||
inner:
|
|
||||||
for(let j=0; j<statuses.length; j++){
|
|
||||||
if(statuses[j].service === key) {
|
|
||||||
statuses[j].status = body[i][key]
|
|
||||||
break inner
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
resolve(statuses)
|
|
||||||
}
|
|
||||||
})
|
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -131,16 +128,15 @@ exports.status = function(){
|
|||||||
*
|
*
|
||||||
* @see http://wiki.vg/Authentication#Authenticate
|
* @see http://wiki.vg/Authentication#Authenticate
|
||||||
*/
|
*/
|
||||||
exports.authenticate = function(username, password, clientToken, requestUser = true, agent = minecraftAgent){
|
exports.authenticate = function (username, password, clientToken, requestUser = true, agent = minecraftAgent) {
|
||||||
return new Promise((resolve, reject) => {
|
return new Promise((resolve, reject) => {
|
||||||
|
|
||||||
const body = {
|
const body = {
|
||||||
agent,
|
agent,
|
||||||
username,
|
username,
|
||||||
password,
|
password,
|
||||||
requestUser
|
requestUser
|
||||||
}
|
}
|
||||||
if(clientToken != null){
|
if (clientToken != null) {
|
||||||
body.clientToken = clientToken
|
body.clientToken = clientToken
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -149,18 +145,19 @@ exports.authenticate = function(username, password, clientToken, requestUser = t
|
|||||||
json: true,
|
json: true,
|
||||||
body
|
body
|
||||||
},
|
},
|
||||||
function(error, response, body){
|
function (error, response, body) {
|
||||||
if(error){
|
if (error) {
|
||||||
logger.error('Error during authentication.', error)
|
logger.error('Error during authentication.', error)
|
||||||
reject(error)
|
reject(error)
|
||||||
} else {
|
} else {
|
||||||
if(response.statusCode === 200){
|
if (response.statusCode === 200) {
|
||||||
resolve(body)
|
resolve(body)
|
||||||
} else {
|
} else {
|
||||||
reject(body || {code: 'ENOTFOUND'})
|
reject(body || { code: 'ENOTFOUND' })
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
|
setTimeout(resolve, 15000)
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -173,7 +170,7 @@ exports.authenticate = function(username, password, clientToken, requestUser = t
|
|||||||
*
|
*
|
||||||
* @see http://wiki.vg/Authentication#Validate
|
* @see http://wiki.vg/Authentication#Validate
|
||||||
*/
|
*/
|
||||||
exports.validate = function(accessToken, clientToken){
|
exports.validate = function (accessToken, clientToken) {
|
||||||
return new Promise((resolve, reject) => {
|
return new Promise((resolve, reject) => {
|
||||||
request.post(authpath + '/validate',
|
request.post(authpath + '/validate',
|
||||||
{
|
{
|
||||||
@ -183,15 +180,15 @@ exports.validate = function(accessToken, clientToken){
|
|||||||
clientToken
|
clientToken
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
function(error, response, body){
|
function (error, response, body) {
|
||||||
if(error){
|
if (error) {
|
||||||
logger.error('Error during validation.', error)
|
logger.error('Error during validation.', error)
|
||||||
reject(error)
|
reject(error)
|
||||||
} else {
|
} else {
|
||||||
if(response.statusCode === 403){
|
if (response.statusCode === 403) {
|
||||||
resolve(false)
|
resolve(false)
|
||||||
} else {
|
} else {
|
||||||
// 204 if valid
|
// 204 if valid
|
||||||
resolve(true)
|
resolve(true)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -208,7 +205,7 @@ exports.validate = function(accessToken, clientToken){
|
|||||||
*
|
*
|
||||||
* @see http://wiki.vg/Authentication#Invalidate
|
* @see http://wiki.vg/Authentication#Invalidate
|
||||||
*/
|
*/
|
||||||
exports.invalidate = function(accessToken, clientToken){
|
exports.invalidate = function (accessToken, clientToken) {
|
||||||
return new Promise((resolve, reject) => {
|
return new Promise((resolve, reject) => {
|
||||||
request.post(authpath + '/invalidate',
|
request.post(authpath + '/invalidate',
|
||||||
{
|
{
|
||||||
@ -218,12 +215,12 @@ exports.invalidate = function(accessToken, clientToken){
|
|||||||
clientToken
|
clientToken
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
function(error, response, body){
|
function (error, response, body) {
|
||||||
if(error){
|
if (error) {
|
||||||
logger.error('Error during invalidation.', error)
|
logger.error('Error during invalidation.', error)
|
||||||
reject(error)
|
reject(error)
|
||||||
} else {
|
} else {
|
||||||
if(response.statusCode === 204){
|
if (response.statusCode === 204) {
|
||||||
resolve()
|
resolve()
|
||||||
} else {
|
} else {
|
||||||
reject(body)
|
reject(body)
|
||||||
@ -244,7 +241,7 @@ exports.invalidate = function(accessToken, clientToken){
|
|||||||
*
|
*
|
||||||
* @see http://wiki.vg/Authentication#Refresh
|
* @see http://wiki.vg/Authentication#Refresh
|
||||||
*/
|
*/
|
||||||
exports.refresh = function(accessToken, clientToken, requestUser = true){
|
exports.refresh = function (accessToken, clientToken, requestUser = true) {
|
||||||
return new Promise((resolve, reject) => {
|
return new Promise((resolve, reject) => {
|
||||||
request.post(authpath + '/refresh',
|
request.post(authpath + '/refresh',
|
||||||
{
|
{
|
||||||
@ -255,12 +252,12 @@ exports.refresh = function(accessToken, clientToken, requestUser = true){
|
|||||||
requestUser
|
requestUser
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
function(error, response, body){
|
function (error, response, body) {
|
||||||
if(error){
|
if (error) {
|
||||||
logger.error('Error during refresh.', error)
|
logger.error('Error during refresh.', error)
|
||||||
reject(error)
|
reject(error)
|
||||||
} else {
|
} else {
|
||||||
if(response.statusCode === 200){
|
if (response.statusCode === 200) {
|
||||||
resolve(body)
|
resolve(body)
|
||||||
} else {
|
} else {
|
||||||
reject(body)
|
reject(body)
|
||||||
|
@ -173,11 +173,6 @@ const refreshMojangStatuses = async function(){
|
|||||||
for(let i=0; i<statuses.length; i++){
|
for(let i=0; i<statuses.length; i++){
|
||||||
const service = statuses[i]
|
const service = statuses[i]
|
||||||
|
|
||||||
// Mojang API is broken for sessionserver. https://bugs.mojang.com/browse/WEB-2303
|
|
||||||
if(service.service === 'sessionserver.mojang.com') {
|
|
||||||
service.status = 'green'
|
|
||||||
}
|
|
||||||
|
|
||||||
if(service.essential){
|
if(service.essential){
|
||||||
tooltipEssentialHTML += `<div class="mojangStatusContainer">
|
tooltipEssentialHTML += `<div class="mojangStatusContainer">
|
||||||
<span class="mojangStatusIcon" style="color: ${Mojang.statusToHex(service.status)};">•</span>
|
<span class="mojangStatusIcon" style="color: ${Mojang.statusToHex(service.status)};">•</span>
|
||||||
@ -221,6 +216,7 @@ const refreshMojangStatuses = async function(){
|
|||||||
document.getElementById('mojang_status_icon').style.color = Mojang.statusToHex(status)
|
document.getElementById('mojang_status_icon').style.color = Mojang.statusToHex(status)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
const refreshServerStatus = async function(fade = false){
|
const refreshServerStatus = async function(fade = false){
|
||||||
loggerLanding.log('Refreshing Server Status')
|
loggerLanding.log('Refreshing Server Status')
|
||||||
const serv = DistroManager.getDistribution().getServer(ConfigManager.getSelectedServer())
|
const serv = DistroManager.getDistribution().getServer(ConfigManager.getSelectedServer())
|
||||||
@ -260,6 +256,9 @@ refreshMojangStatuses()
|
|||||||
let mojangStatusListener = setInterval(() => refreshMojangStatuses(true), 300000)
|
let mojangStatusListener = setInterval(() => refreshMojangStatuses(true), 300000)
|
||||||
let serverStatusListener = setInterval(() => refreshServerStatus(true), 300000)
|
let serverStatusListener = setInterval(() => refreshServerStatus(true), 300000)
|
||||||
|
|
||||||
|
|
||||||
|
setTimeout(() => refreshMojangStatuses(true), 1000) //workaround to make sure statuses are correctly shown, else its a kinda broken
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Shows an error overlay, toggles off the launch area.
|
* Shows an error overlay, toggles off the launch area.
|
||||||
*
|
*
|
||||||
|
@ -55,45 +55,45 @@ function getCurrentView(){
|
|||||||
return currentView
|
return currentView
|
||||||
}
|
}
|
||||||
|
|
||||||
function showMainUI(data){
|
async function showMainUI(data){
|
||||||
|
await require("./assets/js/mojang").status
|
||||||
if(!isDev){
|
if(!isDev){
|
||||||
loggerAutoUpdater.log('Initializing..')
|
await loggerAutoUpdater.log('Initializing..')
|
||||||
ipcRenderer.send('autoUpdateAction', 'initAutoUpdater', ConfigManager.getAllowPrerelease())
|
await ipcRenderer.send('autoUpdateAction', 'initAutoUpdater', ConfigManager.getAllowPrerelease())
|
||||||
}
|
}
|
||||||
|
|
||||||
prepareSettings(true)
|
await prepareSettings(true)
|
||||||
updateSelectedServer(data.getServer(ConfigManager.getSelectedServer()))
|
await updateSelectedServer(data.getServer(ConfigManager.getSelectedServer()))
|
||||||
refreshServerStatus()
|
await refreshServerStatus()
|
||||||
setTimeout(() => {
|
setTimeout(async () => {
|
||||||
document.getElementById('frameBar').style.backgroundColor = 'rgba(0, 0, 0, 0.5)'
|
document.getElementById('frameBar').style.backgroundColor = 'rgba(0, 0, 0, 0.5)'
|
||||||
document.body.style.backgroundImage = `url('assets/images/backgrounds/${document.body.getAttribute('bkid')}.jpg')`
|
document.body.style.backgroundImage = `url('assets/images/backgrounds/${document.body.getAttribute('bkid')}.jpg')`
|
||||||
$('#main').show()
|
await $('#main').show()
|
||||||
|
|
||||||
const isLoggedIn = Object.keys(ConfigManager.getAuthAccounts()).length > 0
|
const isLoggedIn = Object.keys(ConfigManager.getAuthAccounts()).length > 0
|
||||||
|
|
||||||
// If this is enabled in a development environment we'll get ratelimited.
|
// If this is enabled in a development environment we'll get ratelimited.
|
||||||
// The relaunch frequency is usually far too high.
|
// The relaunch frequency is usually far too high.
|
||||||
if(!isDev && isLoggedIn){
|
if(!isDev && isLoggedIn){
|
||||||
validateSelectedAccount()
|
await validateSelectedAccount()
|
||||||
}
|
}
|
||||||
|
|
||||||
if(ConfigManager.isFirstLaunch()){
|
if(ConfigManager.isFirstLaunch()){
|
||||||
currentView = VIEWS.welcome
|
currentView = VIEWS.welcome
|
||||||
$(VIEWS.welcome).fadeIn(1000)
|
await $(VIEWS.welcome).fadeIn(1000)
|
||||||
} else {
|
} else {
|
||||||
if(isLoggedIn){
|
if(isLoggedIn){
|
||||||
currentView = VIEWS.landing
|
currentView = VIEWS.landing
|
||||||
$(VIEWS.landing).fadeIn(1000)
|
await $(VIEWS.landing).fadeIn(1000)
|
||||||
} else {
|
} else {
|
||||||
currentView = VIEWS.login
|
currentView = VIEWS.login
|
||||||
$(VIEWS.login).fadeIn(1000)
|
await $(VIEWS.login).fadeIn(1000)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
setTimeout(() => {
|
setTimeout(async () => {
|
||||||
$('#loadingContainer').fadeOut(500, () => {
|
await $('#loadingContainer').fadeOut(500, async () => {
|
||||||
$('#loadSpinnerImage').removeClass('rotating')
|
await $('#loadSpinnerImage').removeClass('rotating')
|
||||||
})
|
})
|
||||||
}, 250)
|
}, 250)
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user