From b9a77ab8f1a08c562f07831d8b9bf217e367f059 Mon Sep 17 00:00:00 2001 From: SpikeHD Date: Sat, 7 May 2022 20:49:45 -0700 Subject: [PATCH] allow debugging --- resources/index.html | 1 + resources/js/alerts.js | 4 ++ resources/js/authAlert.js | 4 ++ resources/js/debug.js | 17 +++++++ resources/js/gcdownloader.js | 41 ++++++++++++++--- resources/js/helpers.js | 37 ++++++++++++++- resources/js/index.js | 87 +++++++++++++++++++++++++++++++++--- resources/js/login.js | 21 ++++++++- resources/js/options.js | 34 ++++++++++++++ 9 files changed, 231 insertions(+), 15 deletions(-) create mode 100644 resources/js/debug.js 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) } }