diff --git a/resources/index.html b/resources/index.html
index 79b6e2b..59a995a 100644
--- a/resources/index.html
+++ b/resources/index.html
@@ -9,6 +9,7 @@
+
diff --git a/resources/js/alerts.js b/resources/js/alerts.js
index 546ba57..96dc184 100644
--- a/resources/js/alerts.js
+++ b/resources/js/alerts.js
@@ -6,6 +6,8 @@ function displayAlert(message, clear = 4000) {
alertText.innerText = message
+ debug.log('Displaying message: ' + message)
+
setTimeout(() => {
hideAlert()
}, clear)
@@ -15,5 +17,7 @@ function hideAlert() {
const alert = document.getElementById('alert')
const alertText = document.getElementById('alertText')
+ debug.log('Hiding alert')
+
alert.classList.remove('show')
}
diff --git a/resources/js/authAlert.js b/resources/js/authAlert.js
index 6f2dbf3..f5e2c14 100644
--- a/resources/js/authAlert.js
+++ b/resources/js/authAlert.js
@@ -2,10 +2,12 @@ let alertTimeout, alertCooldown = 3000
async function displayLoginAlert(message, type, cooldown = null) {
displayAuthAlert(message, type, cooldown, 'login')
+ debug.log('Login alert: ' + message)
}
async function displayRegisterAlert(message, type, cooldown = null) {
displayAuthAlert(message, type, cooldown, 'register')
+ debug.log('Register alert: ' + message)
}
function displayAuthAlert(message, type, cooldown, name) {
@@ -41,5 +43,7 @@ function displayAuthAlert(message, type, cooldown, name) {
// Disappear after cooldown
alertTimeout = setTimeout(() => {
elm.style.display = 'none'
+
+ debug.log('Hiding auth alert')
}, cooldown || alertCooldown)
}
\ No newline at end of file
diff --git a/resources/js/debug.js b/resources/js/debug.js
new file mode 100644
index 0000000..f47fc2e
--- /dev/null
+++ b/resources/js/debug.js
@@ -0,0 +1,17 @@
+const debug = {
+ log: async (...args) => {
+ const cfg = await getCfg()
+
+ if (cfg.debug) console.log('[DEBUG] ', ...args)
+ },
+ warn: async (...args) => {
+ const cfg = await getCfg()
+
+ if (cfg.debug) console.log('[WARNING] ', ...args)
+ },
+ error: async (...args) => {
+ const cfg = await getCfg()
+
+ if (cfg.debug) console.log('[ERROR] ', ...args)
+ }
+}
\ No newline at end of file
diff --git a/resources/js/gcdownloader.js b/resources/js/gcdownloader.js
index 13231f6..999f07f 100644
--- a/resources/js/gcdownloader.js
+++ b/resources/js/gcdownloader.js
@@ -11,6 +11,8 @@ async function setDownloadButtonsToLoading() {
devBtn.disabled = true
devBtn.classList.add('disabled')
+
+ debug.log('Set download buttons to loading')
}
async function resetDownloadButtons() {
@@ -26,13 +28,20 @@ async function resetDownloadButtons() {
devBtn.disabled = false
devBtn.classList.remove('disabled')
+
+ debug.log('Reset download buttons')
}
async function downloadDataFiles(branch) {
const config = await getCfg()
- if (!branch) branch = config.grasscutterBranch || 'development'
-
+ if (!branch) {
+ debug.warn('Branch not specified')
+ branch = config.grasscutterBranch || 'development'
+ }
+
+ debug.log('Using branch: ' + branch)
+
setDownloadButtonsToLoading()
// For data files
@@ -41,33 +50,37 @@ async function downloadDataFiles(branch) {
.map(file => ({ path: file.path, filename: file.name }))
.map(o => ({ url: `https://raw.githubusercontent.com/Grasscutters/Grasscutter/${branch}/${o.path}`, filename: o.filename }))
+ debug.log('Downloaded data files')
+
// For key files
const keyFiles = await axios.get(`https://api.github.com/repos/Grasscutters/Grasscutter/contents/keys?ref=${branch}`)
const keyList = keyFiles.data
.map(file => ({ path: file.path, filename: file.name }))
.map(o => ({ url: `https://raw.githubusercontent.com/Grasscutters/Grasscutter/${branch}/${o.path}`, filename: o.filename }))
+ debug.log('Downloaded key files')
+
const serverFolderFixed = config.serverFolder.match(/.*\\|.*\//g, '')[0].replace(/\//g, '\\')
- // Ensure data and key folders exist
- console.log(config.serverFolder)
- console.log(serverFolderFixed)
+ debug.log('Server folder fixed: ' + serverFolderFixed)
await Neutralino.os.execCommand(`mkdir ${serverFolderFixed}\\data`)
await Neutralino.os.execCommand(`mkdir ${serverFolderFixed}\\keys`)
+
+ debug.log('Created data and keys folders')
// Download data files
for (const o of dataList) {
const folder = 'data'
const e = await Neutralino.os.execCommand(`powershell Invoke-WebRequest -Uri ${o.url} -OutFile "${serverFolderFixed}\\${folder}\\${o.filename}"`)
- console.log(e)
+ debug.log(e.stdIn)
}
// Download key files
for (const o of keyList) {
const folder = 'keys'
const e = await Neutralino.os.execCommand(`powershell Invoke-WebRequest -Uri ${o.url} -OutFile "${serverFolderFixed}\\${folder}\\${o.filename}"`)
- console.log(e)
+ debug.log(e.stdIn)
}
// Fix buttons
@@ -80,9 +93,13 @@ async function downloadGC(branch) {
// Set current installation in config
config.grasscutterBranch = branch
+ debug.log('Branch set to: ' + branch)
+
// Set gc path for people with launcher enabled
config.serverFolder = `${NL_CWD}\\gc-${branch}\\grasscutter.jar`
+ debug.log('Server folder automatically set to: ' + config.serverFolder)
+
// Enable server launcher
config.serverLaunchPanel = true
@@ -96,14 +113,20 @@ async function downloadGC(branch) {
await axios.get(artiUrl).catch(e => {
// Fallback link if artifacts are not being uploaded
+ debug.warn('Artifacts not available for latest, falling back...')
artiUrl = 'https://nightly.link/Grasscutters/Grasscutter/actions/runs/2284467925/Grasscutter.zip'
})
+
+ debug.log('Artifact URL: ' + artiUrl)
+
// Keystore for branch (since they can differ)
const keystoreUrl = `https://github.com/Grasscutters/Grasscutter/raw/${branch}/keystore.p12`
// Run installer
createCmdWindow(`.\\scripts\\gc_download.cmd ${artiUrl} ${keystoreUrl} ${branch}`)
+ debug.log('Created installer window')
+
// Display folder after saving config
displayServerFolder()
enableServerButton()
@@ -114,6 +137,10 @@ async function downloadResources() {
const config = await getCfg()
const serverFolderFixed = config.serverFolder.match(/.*\\|.*\//g, '')[0].replace(/\//g, '\\')
+ debug.log('Server folder fixed: ' + serverFolderFixed)
+
// Dont bother with data or keys, just want straight resources
createCmdWindow(`.\\scripts\\resources_download.cmd "${serverFolderFixed}"`)
+
+ debug.log('Created resources window')
}
\ No newline at end of file
diff --git a/resources/js/helpers.js b/resources/js/helpers.js
index c54072e..03f59de 100644
--- a/resources/js/helpers.js
+++ b/resources/js/helpers.js
@@ -12,6 +12,7 @@ async function getCfg() {
serverLaunchPanel: false,
language: 'en',
useHttps: true,
+ debug: true,
grasscutterBranch: '',
}
const cfgStr = await Neutralino.storage.getData('config').catch(e => {
@@ -20,6 +21,8 @@ async function getCfg() {
// Show the first time notice if there is no config
document.querySelector('#firstTimeNotice').style.display = 'block'
+
+ debug.warn('First time opening')
})
const config = cfgStr ? JSON.parse(cfgStr) : defaultConf
@@ -36,8 +39,12 @@ async function getFavIps() {
const ipStr = await Neutralino.storage.getData('favorites').catch(e => {
// The data isn't set, so this is our first time opening
Neutralino.storage.setData('favorites', JSON.stringify([]))
+
+ debug.warn('No favorites set')
})
+ debug.log('Favorites:', ipStr)
+
const ipArr = ipStr ? JSON.parse(ipStr) : []
return ipArr
@@ -50,20 +57,27 @@ async function proxyIsInstalled() {
if (curDirList.find(f => f.entry === 'ext')) {
const extFiles = await filesystem.readDirectory(NL_CWD + '/ext')
+ debug.log('ext/ folder exists')
+
if (extFiles.find(f => f.entry === 'mitmdump.exe')) {
+ debug.log('mitmdump exists')
return true
}
}
+ debug.log('No proxy installed')
+
return false
}
async function checkForUpdates() {
const url = 'https://api.github.com/repos/Grasscutters/GrassClipper/releases/latest'
- const { data } = await axios.get(url)
+ const { data } = await axios.get(url).catch(e => debug.error('Error getting latest release'))
const latest = data.tag_name
+ debug.log('Latest release:', latest)
+
return latest
}
@@ -72,8 +86,12 @@ async function displayUpdate() {
const versionDisplay = document.querySelector('#newestVersion')
const notif = document.querySelector('#downloadNotif')
+ debug.log('Comparing versions: ' + latest + ' vs v' + NL_APPVERSION)
+
if (latest === `v${NL_APPVERSION}`) return
+ debug.log('New version available')
+
versionDisplay.innerText = latest
notif.classList.add('displayed')
@@ -86,12 +104,16 @@ async function displayUpdate() {
async function openLatestDownload() {
const downloadLink = 'https://github.com/Grasscutters/GrassClipper/releases/latest/'
+ debug.log('Opening download link: ', downloadLink)
+
Neutralino.os.open(downloadLink)
}
async function openGameFolder() {
const config = await getCfg()
const folder = config.gameexe.match(/.*\\|.*\//g, '')
+
+ debug.log('Opening game folder: ', folder)
if (folder.length > 0) openInExplorer(folder[0].replace(/\//g, '\\'))
}
@@ -100,6 +122,8 @@ async function openGrasscutterFolder() {
const config = await getCfg()
const folder = config.serverFolder.match(/.*\\|.*\//g, '')
+ debug.log('Opening grasscutter folder: ', folder)
+
if (folder.length > 0) openInExplorer(folder[0].replace(/\//g, '\\'))
}
@@ -108,6 +132,9 @@ function hasForeignChars(str) {
let re1 = /^[\x00-\x7F]+$/g
str = str.replace(/\s/g, '')
+ debug.log('Checking for foreign chars in path: ', str)
+ debug.log('Path includes foreign chars? ', re1.test(str))
+
return !re1.test(str)
}
@@ -118,8 +145,11 @@ function openDialog(title, message, negBtn = false, affirmBtn = closeDialog) {
const noBtn = document.getElementById('dialogButtonNeg')
const yesBtn = document.getElementById('dialogButtonAffirm')
+ debug.log('Opening dialog: ', title, message)
+
if (!negBtn) {
noBtn.style.display = 'none'
+ debug.log('No "no" button')
} else {
noBtn.style.removeProperty('display')
noBtn.onclick = () => closeDialog()
@@ -129,6 +159,7 @@ function openDialog(title, message, negBtn = false, affirmBtn = closeDialog) {
noBtn.innerText = localeObj.dialogNo || 'NO'
yesBtn.onclick = () => {
+ debug.log('Affirmative button clicked')
affirmBtn()
closeDialog()
}
@@ -144,6 +175,8 @@ function openDialog(title, message, negBtn = false, affirmBtn = closeDialog) {
function closeDialog() {
const dialog = document.getElementById('miscDialog')
+ debug.log('Closing dialog')
+
dialog.style.display = 'none'
}
@@ -151,6 +184,7 @@ function closeDialog() {
* Minimize the window
*/
function minimizeWin() {
+ debug.log('Minimizing window')
Neutralino.window.minimize()
}
@@ -158,6 +192,7 @@ function minimizeWin() {
* Close the window
*/
function closeWin() {
+ debug.log('Closing window')
Neutralino.app.exit()
window.close()
diff --git a/resources/js/index.js b/resources/js/index.js
index fee2c9d..1d02706 100644
--- a/resources/js/index.js
+++ b/resources/js/index.js
@@ -3,10 +3,12 @@ NL_CWD = NL_CWD.replace(/\//g, '\\')
let localeObj
const filesystem = Neutralino.filesystem
const createCmdWindow = async (command) => {
+ debug.log('Running command in new window: ' + command)
Neutralino.os.execCommand(`cmd.exe /c start "" ${command}`, { background: true })
}
const openInExplorer = async (path) => {
+ debug.log('Opening path in explorer: ' + path)
createCmdWindow(`explorer.exe "${path}"`)
}
@@ -17,6 +19,8 @@ async function enableButtons() {
const offBtn = document.querySelector('#playOfficial')
const privBtn = document.querySelector('#playPrivate')
+ debug.log('Enabling buttons')
+
offBtn.classList.remove('disabled')
offBtn.disabled = false
@@ -33,6 +37,8 @@ async function enableButtons() {
async function enableServerButton() {
const serverBtn = document.querySelector('#serverLaunch')
+ debug.log('Enabling server button')
+
serverBtn.classList.remove('disabled')
serverBtn.disabled = false
}
@@ -44,6 +50,8 @@ async function handleGameNotSet() {
// Set buttons to greyed out and disable
document.querySelector('#gamePath').innerHTML = localeObj.folderNotSet || 'Not set'
+ debug.log('Handling game not set')
+
// Set official server background to default
document.querySelector('#firstPanel').style.backgroundImage = 'url("../bg/private/default.png")'
@@ -63,6 +71,8 @@ async function handleServerNotSet() {
// Set buttons to greyed out and disable
document.querySelector('#serverPath').innerHTML = localeObj.folderNotSet || 'Not set'
+ debug.log('Handling server not set')
+
// Set official server background to default
// document.querySelector('#firstPanel').style.backgroundImage = `url("../bg/private/default.png")`
@@ -79,6 +89,8 @@ async function displayGameFolder() {
const elm = document.querySelector('#gamePath')
const config = await getCfg()
+ debug.log('Displaying game exe')
+
elm.innerHTML = config.gameexe
}
@@ -89,6 +101,8 @@ async function displayServerFolder() {
const elm = document.querySelector('#serverPath')
const config = await getCfg()
+ debug.log('Displaying server folder')
+
elm.innerHTML = config.serverFolder
}
@@ -107,9 +121,13 @@ async function setBackgroundImage() {
// Set default image, it will change if the bg folder exists
document.querySelector('#firstPanel').style.backgroundImage = 'url("https://webstatic.hoyoverse.com/upload/event/2020/11/04/7fd661b5184e1734f91f628b6f89a31f_7367318474207189623.png")'
+ debug.log('Setting second panel to: ' + privImage)
+
// Set the private background image
document.querySelector('#secondPanel').style.backgroundImage = `url("../bg/private/${privImage}")`
+ debug.log('Setting third panel to: ' + servImage)
+
// Set the server background image
document.querySelector('#thirdPanel').style.backgroundImage = `url("../bg/server/${servImage}")`
@@ -176,6 +194,8 @@ async function handleFavoriteInput() {
const addr = `${ip}:${port}`
+ debug.log('Checking if IP is a favorite: ' + addr)
+
if (!ip || !ipArr.includes(addr)) {
document.querySelector('#star').src = 'icons/star_empty.svg'
} else {
@@ -195,6 +215,8 @@ async function setIp(ip) {
const parseIp = ip.split(':')[0]
const parsePort = ip.split(':')[1]
+ debug.log('Setting IP input elm to: ' + parseIp + ' and port to: ' + parsePort)
+
// Set star
if (ip) {
document.querySelector('#star').src = 'icons/star_filled.svg'
@@ -212,6 +234,8 @@ async function handleFavoriteList() {
const ipList = document.querySelector('#ipList')
if (ipList.style.display === 'none') {
+ debug.log('IP list was closed, opening it')
+
ipList.innerHTML = ''
const list = ipList.appendChild(
@@ -219,6 +243,7 @@ async function handleFavoriteList() {
)
if (ipArr.length < 1) {
+ console.log('No favorites found')
const listItem = list.appendChild(
document.createElement('li')
)
@@ -239,6 +264,8 @@ async function handleFavoriteList() {
const xy = [ transform.split(',')[4], transform.split(',')[5] ]
let newY = (27 * ipArr.length) * window.devicePixelRatio
+ debug.log('IP list height: 56vh - ' + newY)
+
if (ipArr.length === 0 || ipArr.length === 1) newY = 0
ipList.style.transform = `translate(${xy[0]}px, calc(56vh - ${newY}px)`
@@ -249,15 +276,19 @@ async function openDownloads() {
const downloads = document.querySelector('#downloadPanel')
const config = await getCfg()
+ debug.log('Opening downloads panel')
+
if (downloads.style.display === 'none') {
downloads.style.removeProperty('display')
}
// Disable the resource download button if a serverFolder path is not set
if (!config.serverFolder) {
+ debug.log('Server folder not set, disabling resource download button')
document.querySelector('#resourceInstall').disabled = true
document.querySelector('#resourceInstall').classList.add('disabled')
} else {
+ debug.log('Server folder is set, enabling resource download button')
document.querySelector('#resourceInstall').disabled = false
document.querySelector('#resourceInstall').classList.remove('disabled')
}
@@ -266,6 +297,8 @@ async function openDownloads() {
async function closeDownloads() {
const downloads = document.querySelector('#downloadPanel')
+ debug.log('Closing downloads panel')
+
downloads.style.display = 'none'
}
@@ -273,6 +306,8 @@ async function openSettings() {
const settings = document.querySelector('#settingsPanel')
const config = await getCfg()
+ debug.log('Opening settings panel')
+
if (settings.style.display === 'none') {
settings.style.removeProperty('display')
}
@@ -286,6 +321,10 @@ async function openSettings() {
serverLaunch.checked = config.serverLaunchPanel
httpsCheckbox.checked = config.useHttps
+ debug.log('Set killswitch to: ' + config.enableKillswitch)
+ debug.log('Set server launch to: ' + config.serverLaunchPanel)
+ debug.log('Set https to: ' + config.useHttps)
+
// Load languages
getLanguages()
@@ -297,10 +336,14 @@ async function closeSettings() {
const settings = document.querySelector('#settingsPanel')
const config = await getCfg()
+ debug.log('Closing settings panel')
+
settings.style.display = 'none'
// In case we installed the proxy server
if (await proxyIsInstalled() && config.gameexe) {
+ debug.log('Proxy has been installed and EXE is set, enabling playPrivate')
+
const playPriv = document.querySelector('#playPrivate')
playPriv.classList.remove('disabled')
@@ -319,19 +362,28 @@ async function openLogin() {
const useHttps = config.useHttps
const url = `${useHttps ? 'https' : 'http'}://${ip}:${port}`
+ debug.log('Opening login panel')
+ debug.log('Url: ' + url)
+
// Check if we even need to authenticate
try {
const { data } = await axios.get(url + '/authentication/type')
+ debug.log('Request successful')
+
if (!data.includes('GCAuthAuthenticationHandler')) {
+ debug.log('No authentication required')
launchPrivate()
return
}
} catch(e) {
+ debug.warn('Request failed')
launchPrivate()
return
}
+ debug.log('Login panel opening')
+
loginIpDisplay.innerText = ip
registerIpDisplay.innerText = ip
@@ -343,6 +395,8 @@ async function openLogin() {
async function closeLogin() {
const login = document.querySelector('#loginPanel')
+ debug.log('Closing login panel')
+
login.style.display = 'none'
setLoginSection()
@@ -350,16 +404,22 @@ async function closeLogin() {
async function closeFirstTimePopup() {
const firstTimePopup = document.querySelector('#firstTimeNotice')
+
+ debug.log('Closing first time popup')
+
firstTimePopup.style.display = 'none'
}
async function runInstallScript() {
+ debug.log('Running install script')
createCmdWindow(`.\\scripts\\install.cmd "${NL_CWD}" true`)
// Create an interval that will check for the proxy server installation finish
const interval = setInterval(async () => {
+ debug.log('Checking if proxy server is installed')
if (await proxyIsInstalled()) {
clearInterval(interval)
+ debug.log('Proxy server installed')
enableButtons()
}
}, 1000)
@@ -379,9 +439,11 @@ async function checkForUpdatesAndShow() {
// Version mismatch? Update!
if (manifest?.version !== NL_APPVERSION) {
+ debug.log('New update available')
subtitle.innerHTML = 'New update available!'
updateBtn.classList.remove('disabled')
} else {
+ debug.log('New update not available')
subtitle.innerHTML = 'You are on the latest version! :)'
updateBtn.classList.add('disabled')
}
@@ -391,10 +453,14 @@ async function displayServerLaunchSection() {
const serverPanel = document.querySelector('#thirdPanel')
const bottomBtnSection = document.querySelector('#serverPath').parentElement
+ debug.log('Displaying server launch section')
+
if (serverPanel.style.display === 'none') {
+ debug.log('Showing server launch section')
serverPanel.style.removeProperty('display')
bottomBtnSection.style.removeProperty('display')
} else {
+ debug.log('Hiding server launch section')
serverPanel.style.display = 'none'
bottomBtnSection.style.display = 'none'
}
@@ -410,8 +476,10 @@ async function setGameExe() {
]
})
+ debug.log('Game exe selected: ' + gameExe[0])
+
if (!gameExe[0]) return
- if (hasForeignChars(gameExe[0])) displayAlert(localeObj.foreignCharacterAlert || 'The file path set contains Chinese characters, this may cause problems!')
+ if (hasForeignChars(gameExe[0])) displayAlert(localeObj.foreignCharacterAlert || 'The file path set contains foreign characters, this may cause problems!')
// Set the folder in our configuration
const config = await getCfg()
@@ -419,6 +487,8 @@ async function setGameExe() {
// It's an array of selections, so only get the first one
config.gameexe = gameExe[0].replace(/\//g, '\\')
+ debug.log('Setting game exe to: ' + config.gameexe)
+
Neutralino.storage.setData('config', JSON.stringify(config))
// Refresh background and path
@@ -434,15 +504,18 @@ async function setGrasscutterFolder() {
]
})
- if (!folder[0]) return
+ debug.log('Grasscutter folder selected: ' + folder[0])
- console.log(hasForeignChars(folder[0]))
+ if (!folder[0]) return
if (hasForeignChars(folder[0])) displayAlert(localeObj.foreignCharacterAlert || 'The file path set contains foreign characters, this may cause problems!')
// Set the folder in our configuration
const config = await getCfg()
config.serverFolder = folder[0]
+
+ debug.log('Setting grasscutter folder to: ' + config.serverFolder)
+
Neutralino.storage.setData('config', JSON.stringify(config))
displayServerFolder()
@@ -455,6 +528,8 @@ async function setGrasscutterFolder() {
async function launchOfficial() {
const config = await getCfg()
+ debug.log('Launching game')
+
Neutralino.os.execCommand(`"${config.gameexe}"`)
}
@@ -467,7 +542,7 @@ async function launchPrivate() {
const config = await getCfg()
- console.log('connecting to ' + ip + ':' + port)
+ debug.log('Connecting to ' + ip + ':' + port)
// Set the last connect
config.lastConnect = ip
@@ -478,11 +553,13 @@ async function launchPrivate() {
`.\\scripts\\private_server_launch.cmd ${ip} ${port} ${config.useHttps} "${config.gameexe}" "${NL_CWD}" ${config.enableKillswitch} true`, {
background: true
}
- ).catch(e => console.log(e))
+ ).catch(e => debug.error(e))
}
async function launchLocalServer() {
const config = await getCfg()
+ debug.log('Launching local server')
+
createCmdWindow(`.\\scripts\\local_server_launch.cmd "${config.serverFolder}"`).catch(e => console.log(e))
}
diff --git a/resources/js/login.js b/resources/js/login.js
index 0982456..59c234c 100644
--- a/resources/js/login.js
+++ b/resources/js/login.js
@@ -7,6 +7,8 @@ async function setLoginSection() {
const loginSection = document.getElementById('loginPopupContentBody')
const registerSection = document.getElementById('registerPopupContentBody')
+ debug.log('Setting to login section')
+
title.classList.add('selectedTitle')
altTitle.classList.remove('selectedTitle')
@@ -23,6 +25,8 @@ async function setRegisterSection(fromLogin = false) {
const loginSection = document.getElementById('loginPopupContentBody')
const registerSection = document.getElementById('registerPopupContentBody')
+ debug.log('Setting to register section')
+
title.classList.add('selectedTitle')
altTitle.classList.remove('selectedTitle')
@@ -30,6 +34,8 @@ async function setRegisterSection(fromLogin = false) {
registerSection.style.removeProperty('display')
if (fromLogin) {
+ debug.log('Just registered, setting to login page')
+
// Take the values from the login section and put them in the register section
const loginUsername = document.getElementById('loginUsername').value
const loginPassword = document.getElementById('loginPassword').value
@@ -42,6 +48,9 @@ async function setRegisterSection(fromLogin = false) {
function parseJwt(token) {
const base64Url = token.split('.')[1]
const base64 = base64Url.replace('-', '+').replace('_', '/')
+
+ debug.log('Parsed JWT: ' + base64)
+
return JSON.parse(window.atob(base64))
}
@@ -57,12 +66,14 @@ async function login() {
const useHttps = config.useHttps
const url = `${useHttps ? 'https' : 'http'}://${ip}:${port}`
+ debug.log('Attempting login to ' + url)
+
const reqBody = {
username,
password,
}
- const { data } = await axios.post(url + '/authentication/login', reqBody)
+ const { data } = await axios.post(url + '/authentication/login', reqBody).catch(e => debug.error('Login request failed: ' + e))
switch(data.message) {
case 'INVALID_ACCOUNT':
@@ -92,6 +103,8 @@ async function login() {
const tkData = parseJwt(data.jwt)
await Neutralino.clipboard.writeText(tkData.token)
+ debug.log('Login success')
+
displayLoginAlert(localeObj.alertLoginSuccess || 'Login successful! Token copied to clipboard. Paste this token into the username field of the game to log in.', 'success', 8000)
launchPrivate()
break
@@ -111,13 +124,15 @@ async function register() {
const useHttps = config.useHttps
const url = `${useHttps ? 'https' : 'http'}://${ip}:${port}`
+ debug.log('Attempting registration to ' + url)
+
const reqBody = {
username,
password,
password_confirmation
}
- const { data } = await axios.post(url + '/authentication/register', reqBody)
+ const { data } = await axios.post(url + '/authentication/register', reqBody).catch(e => debug.error('Registration request failed: ' + e))
switch(data.message) {
case 'USERNAME_TAKEN':
@@ -147,6 +162,8 @@ async function register() {
const loginUsername = document.getElementById('loginUsername')
loginUsername.value = username
+ debug.log('Registered with username ' + username)
+
setLoginSection()
displayLoginAlert(localeObj.alertRegisterSuccess || 'Registration successful!', 'success', 5000)
break
diff --git a/resources/js/options.js b/resources/js/options.js
index f18d2cf..2eb253b 100644
--- a/resources/js/options.js
+++ b/resources/js/options.js
@@ -7,6 +7,8 @@ async function toggleKillSwitch() {
config.enableKillswitch = killSwitch.checked
+ debug.log('Killswitch is now ', config.enableKillswitch)
+
Neutralino.storage.setData('config', JSON.stringify(config))
}
@@ -18,6 +20,8 @@ async function toggleServerLaunchSection() {
displayServerLaunchSection()
+ debug.log('Toggling server panel')
+
// Save setting
config.serverLaunchPanel = !config.serverLaunchPanel
Neutralino.storage.setData('config', JSON.stringify(config))
@@ -26,6 +30,8 @@ async function toggleServerLaunchSection() {
if (config.serverLaunchPanel && !config.serverFolder) {
closeSettings()
+ debug.log('First time server launcher')
+
openDialog(
localeObj.serverEnableDialogTitle || 'You found the Grasscutter server launcher!',
localeObj.serverEnableDialogText || 'If you do not have an existing Grasscutter installation to set, would you like to download a build?',
@@ -42,6 +48,8 @@ async function getLanguages() {
const languageFiles = (await filesystem.readDirectory(`${NL_CWD}/languages`)).filter(file => file.entry.endsWith('.json'))
const config = await getCfg()
+ debug.log('Grabbing languages')
+
// Clear language options
const languageSelect = document.querySelector('#languageSelect')
languageSelect.innerHTML = ''
@@ -51,12 +59,15 @@ async function getLanguages() {
const fullLanguageName = JSON.parse(await filesystem.readFile(`${NL_CWD}/languages/${file.entry}`)).fullLangName
const lang = file.entry.split('.json')[0]
+ debug.log('Loading language: ', lang)
+
const option = document.createElement('option')
option.value = lang
option.innerHTML = fullLanguageName
// Set language selected to config language
if (lang === config.language) {
+ debug.log('Selected language: ', lang)
option.selected = true
}
@@ -77,6 +88,8 @@ async function handleLanguageChange(elm) {
config.language = list.value
Neutralino.storage.setData('config', JSON.stringify(config))
+ debug.log('Language changed to: ', list.value)
+
// Force refresh of application, no need for restart!
window.location.reload()
}
@@ -90,6 +103,22 @@ async function toggleHttps() {
config.useHttps = httpsCheckbox.checked
+ debug.log('HTTPS set to: ', config.useHttps)
+
+ Neutralino.storage.setData('config', JSON.stringify(config))
+}
+
+/**
+ * Toggle debugging
+ */
+async function toggleDebugging() {
+ const debugCheckbox = document.querySelector('#debugOption')
+ const config = await getCfg()
+
+ config.debug = debugCheckbox.checked
+
+ debug.log('Debugging set to: ', config.debug)
+
Neutralino.storage.setData('config', JSON.stringify(config))
}
@@ -105,12 +134,16 @@ async function setFavorite() {
const addr = `${ip}:${port}`
+ debug.log('Handling favorite: ', addr)
+
// Set star icon
const star = document.querySelector('#star')
if (star.src.includes('filled') && ip) {
star.src = 'icons/star_empty.svg'
+ debug.log('Removing from list: ', addr)
+
// remove from list
ipArr.splice(ipArr.indexOf(addr), 1)
} else {
@@ -118,6 +151,7 @@ async function setFavorite() {
// add to list
if (ip && !ipArr.includes(addr)) {
+ debug.log('Adding to list: ', addr)
ipArr.push(addr)
}
}