diff --git a/README.md b/README.md index 6aee961..ad0599e 100644 --- a/README.md +++ b/README.md @@ -46,10 +46,9 @@ If you use VS Code, you can run this directly from the IDE. Copy the following c "windows": { "runtimeExecutable": "${workspaceRoot}/node_modules/.bin/electron.cmd" }, - "program": "${workspaceRoot}/index.js", + "args": ["."], "console": "integratedTerminal", - "protocol": "inspector", - "timeout": 100000000 + "protocol": "inspector" }, { "name": "Debug Renderer Process", @@ -60,7 +59,7 @@ If you use VS Code, you can run this directly from the IDE. Copy the following c "runtimeExecutable": "${workspaceRoot}/node_modules/.bin/electron.cmd" }, "runtimeArgs": [ - "${workspaceRoot}/index.js", + "${workspaceRoot}/.", "--remote-debugging-port=9222" ], "webRoot": "${workspaceRoot}" diff --git a/app/assets/css/launcher.css b/app/assets/css/launcher.css index 9d210aa..30350e0 100644 --- a/app/assets/css/launcher.css +++ b/app/assets/css/launcher.css @@ -1002,8 +1002,12 @@ p { border-radius: 50%; margin-top: 50px; } +#image_seal_container[update]{ + cursor: pointer +} #image_seal_container[update]:before, #image_seal_container[update]:after { + cursor: pointer; position: absolute; content: ''; height: 100%; @@ -1013,10 +1017,47 @@ p { border-radius: 50%; box-shadow: 0 0 15px #43c628; animation: glow-grow 4s ease-out infinite; + background: rgba(0, 0, 0, 0.15); } -#image_seal_container[update]:after { +#image_seal_container[update]:before { animation-delay: 2s; } + +#updateAvailableTooltip { + cursor: pointer; + visibility: hidden; + opacity: 0; + width: 100px; + height: 15px; + background-color: rgb(0, 0, 0); + color: #fff; + text-align: center; + border-radius: 4px; + padding: 2px; + position: absolute; + z-index: 1; + top: 115%; + left: -17.5px; + font-family: 'Avenir Medium'; + font-size: 12px; + transition: visibility 0s linear 0.25s, opacity 0.25s ease; +} +#updateAvailableTooltip::after { + content: " "; + position: absolute; + left: 50%; + bottom: 100%; + margin-left: -5px; + border-width: 5px; + border-style: solid; + border-color: transparent transparent rgb(0, 0, 0) transparent; +} +#image_seal_container[update]:hover #updateAvailableTooltip { + visibility: visible; + opacity: 1; + transition-delay: 0s; +} + @keyframes glow-grow { 0% { opacity: 0; diff --git a/app/assets/images/backgrounds/2.jpg b/app/assets/images/backgrounds/2.jpg index c75ca9c..7a13e77 100644 Binary files a/app/assets/images/backgrounds/2.jpg and b/app/assets/images/backgrounds/2.jpg differ diff --git a/app/assets/images/backgrounds/6.jpg b/app/assets/images/backgrounds/6.jpg new file mode 100644 index 0000000..acdaa73 Binary files /dev/null and b/app/assets/images/backgrounds/6.jpg differ diff --git a/app/assets/images/backgrounds/7.jpg b/app/assets/images/backgrounds/7.jpg new file mode 100644 index 0000000..35051cd Binary files /dev/null and b/app/assets/images/backgrounds/7.jpg differ diff --git a/app/assets/js/scripts/uicore.js b/app/assets/js/scripts/uicore.js index 758f575..1e41c5f 100644 --- a/app/assets/js/scripts/uicore.js +++ b/app/assets/js/scripts/uicore.js @@ -6,7 +6,8 @@ */ // Requirements const $ = require('jquery'); -const {remote, shell, webFrame} = require('electron') +const {ipcRenderer, remote, shell, webFrame} = require('electron') +const isDev = require('electron-is-dev') // Disable eval function. // eslint-disable-next-line @@ -26,6 +27,61 @@ webFrame.setZoomLevel(0) webFrame.setVisualZoomLevelLimits(1, 1) webFrame.setLayoutZoomLevelLimits(0, 0) +// Initialize auto updates in production environments. +// TODO Make this the case after implementation is done. +if(!isDev){ + ipcRenderer.on('autoUpdateNotification', (event, arg, info) => { + switch(arg){ + case 'checking-for-update': + console.log('Checking for update..') + break + case 'update-available': + console.log('New update available', info.version) + break + case 'update-downloaded': + console.log('Update ' + info.version + ' ready to be installed.') + showUpdateUI(info) + break + case 'update-not-available': + console.log('No new update found.') + break + case 'ready': + ipcRenderer.send('autoUpdateAction', 'checkForUpdate') + case 'error': + console.log('Error during update check..') + console.debug('Error Code:', info != null ? info.code : null) + if(err.code === 'ERR_UPDATER_INVALID_RELEASE_FEED'){ + console.log('No suitable releases found.') + } + break + default: + console.log('Unknown argument', arg) + break + } + }) + ipcRenderer.send('autoUpdateAction', 'initAutoUpdater') +} + +function showUpdateUI(info){ + //TODO Make this message a bit more informative `${info.version}` + document.getElementById('image_seal_container').setAttribute('update', true) + document.getElementById('image_seal_container').onclick = () => { + setOverlayContent('Update Available', 'A new update for the launcher is available. Would you like to install now?', 'Install', 'Later') + setOverlayHandler(() => { + if(!isDev){ + ipcRenderer.send('autoUpdateAction', 'installUpdateNow') + } else { + console.error('Cannot install updates in development environment.') + toggleOverlay(false) + } + }) + setDismissHandler(() => { + toggleOverlay(false) + }) + toggleOverlay(true, true) + } +} + /* jQuery Example $(function(){ console.log('UICore Initialized'); diff --git a/app/landing.ejs b/app/landing.ejs index ee4f6b3..735bb1f 100644 --- a/app/landing.ejs +++ b/app/landing.ejs @@ -3,6 +3,7 @@
+
Update Available
diff --git a/dev-app-update.yml b/dev-app-update.yml new file mode 100644 index 0000000..60dd682 --- /dev/null +++ b/dev-app-update.yml @@ -0,0 +1,3 @@ +owner: WesterosCraftCode +repo: ElectronLauncher +provider: github diff --git a/index.js b/index.js index e5688ff..ec53348 100644 --- a/index.js +++ b/index.js @@ -1,10 +1,54 @@ -const {app, BrowserWindow} = require('electron') -//const autoUpdater = require("electron-updater").autoUpdater +const {app, BrowserWindow, ipcMain} = require('electron') +const autoUpdater = require("electron-updater").autoUpdater +const isDev = require('electron-is-dev') const path = require('path') const url = require('url') const fs = require('fs') const ejse = require('ejs-electron') +function initAutoUpdater(event){ + // Defaults to true if application version contains prerelease components (e.g. 0.12.1-alpha.1) + // autoUpdater.allowPrerelease = true + if(isDev){ + autoUpdater.autoInstallOnAppQuit = false + autoUpdater.updateConfigPath = path.join(__dirname, 'dev-app-update.yml') + } + autoUpdater.on('update-available', (info) => { + event.sender.send('autoUpdateNotification', 'update-available', info) + }) + autoUpdater.on('update-downloaded', (info) => { + event.sender.send('autoUpdateNotification', 'update-downloaded', info) + }) + autoUpdater.on('update-not-available', (info) => { + event.sender.send('autoUpdateNotification', 'update-not-available', info) + }) + autoUpdater.on('checking-for-update', () => { + event.sender.send('autoUpdateNotification', 'checking-for-update') + }) +} + +ipcMain.on('autoUpdateAction', (event, arg) => { + switch(arg){ + case 'initAutoUpdater': + console.log('Initializing auto updater.') + initAutoUpdater(event) + event.sender.send('autoUpdateNotification', 'ready') + break + case 'checkForUpdate': + autoUpdater.checkForUpdates() + .catch(err => { + event.sender.send('autoUpdateNotification', 'error', err) + }) + break + case 'installUpdateNow': + autoUpdater.quitAndInstall() + break + default: + console.log('Unknown argument', arg) + break + } +}) + // Disable hardware acceleration. // https://electronjs.org/docs/tutorial/offscreen-rendering app.disableHardwareAcceleration() diff --git a/package.json b/package.json index 533568d..50f332f 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "westeroscraftlauncher", - "version": "0.0.1", + "version": "0.0.1-dev", "description": "Custom modded launcher for Westeroscraft", "productName": "WesterosCraft Launcher", "main": "index.js", @@ -33,6 +33,7 @@ "discord-rpc": "^3.0.0-beta.10", "ejs": "^2.5.9", "ejs-electron": "^2.0.1", + "electron-is-dev": "^0.3.0", "electron-updater": "^2.21.8", "jquery": "^3.3.1", "mkdirp": "^0.5.1", @@ -92,7 +93,7 @@ }, "compression": "maximum", "files": [ - "!{target,logs,.vscode,docs}" + "!{target,logs,.vscode,docs,dev-app-update.yml}" ], "asar": true }