feat: New Mojang Statuses

This commit is contained in:
GeekCornerGH 2021-10-24 08:38:09 +02:00
parent 779a9a54ec
commit b62910a7c4
3 changed files with 75 additions and 79 deletions

View File

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

View File

@ -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)};">&#8226;</span> <span class="mojangStatusIcon" style="color: ${Mojang.statusToHex(service.status)};">&#8226;</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.
* *

View File

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