From 44bcb464e3f513b7bc5c9b092a7381ebda795bf6 Mon Sep 17 00:00:00 2001 From: Russell Standish Date: Fri, 19 Apr 2024 17:44:08 +1000 Subject: [PATCH 01/12] Upgrade menu logs in and retrieves a code for later Patreon use. --- .../app/managers/ApplicationMenuManager.ts | 19 ++++++++++++++++++- 1 file changed, 18 insertions(+), 1 deletion(-) diff --git a/gui-js/apps/minsky-electron/src/app/managers/ApplicationMenuManager.ts b/gui-js/apps/minsky-electron/src/app/managers/ApplicationMenuManager.ts index f5a2a1f34..6a3e9999c 100644 --- a/gui-js/apps/minsky-electron/src/app/managers/ApplicationMenuManager.ts +++ b/gui-js/apps/minsky-electron/src/app/managers/ApplicationMenuManager.ts @@ -91,6 +91,7 @@ export class ApplicationMenuManager { height: 500, title: '', url: `#/headless/menu/file/about`, + //url: `http://localhost:4200/#/headless/menu/file/about`, modal: false, }); shell.beep(); @@ -99,7 +100,23 @@ export class ApplicationMenuManager { { label: 'Upgrade', click() { - shell.openExternal('https://www.patreon.com/hpcoder'); + let window=WindowManager.createWindow({ + width: 420, + height: 500, + title: '', + modal: false, + }); + window.loadURL('https://www.patreon.com/oauth2/authorize?response_type=code&client_id=abf9j0FWQTj-etln2BbRlUhJnjv11kaL9lH1nprj23NLSq3l6ELxUGkLJKIfWsKt&redirect_uri=https://ravelation.hpcoders.com.au/patreon-redirect.html'); + window.webContents.on('did-navigate',()=>{ + console.log(window.webContents.getURL()); + let url=new URL(window.webContents.getURL()); + let params=new URLSearchParams(url.search); + let code=params.get('code'); + if (code) + { + console.log(code) + window.close(); + } }, }, { From c8a21a473611290ea38edcfbe3c358b295ae4e3d Mon Sep 17 00:00:00 2001 From: Russell Standish Date: Fri, 19 Apr 2024 17:53:21 +1000 Subject: [PATCH 02/12] Fixes in updater login to Patreon protocol. --- .../src/app/managers/ApplicationMenuManager.ts | 4 ++-- gui-js/apps/minsky-electron/src/app/managers/WindowManager.ts | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/gui-js/apps/minsky-electron/src/app/managers/ApplicationMenuManager.ts b/gui-js/apps/minsky-electron/src/app/managers/ApplicationMenuManager.ts index 6a3e9999c..276e5ec0e 100644 --- a/gui-js/apps/minsky-electron/src/app/managers/ApplicationMenuManager.ts +++ b/gui-js/apps/minsky-electron/src/app/managers/ApplicationMenuManager.ts @@ -112,11 +112,11 @@ export class ApplicationMenuManager { let url=new URL(window.webContents.getURL()); let params=new URLSearchParams(url.search); let code=params.get('code'); - if (code) - { + if (code) { console.log(code) window.close(); } + }); }, }, { diff --git a/gui-js/apps/minsky-electron/src/app/managers/WindowManager.ts b/gui-js/apps/minsky-electron/src/app/managers/WindowManager.ts index 57dff2971..7c5769c8a 100644 --- a/gui-js/apps/minsky-electron/src/app/managers/WindowManager.ts +++ b/gui-js/apps/minsky-electron/src/app/managers/WindowManager.ts @@ -168,7 +168,7 @@ export class WindowManager { return window; } - private static createWindow( + static createWindow( payload: CreateWindowPayload, onCloseCallback?: (ev : Electron.Event) => void ) { From 362751db71c765789741cbc3a8f14483548945c4 Mon Sep 17 00:00:00 2001 From: Russell Standish Date: Mon, 22 Apr 2024 18:26:44 +1000 Subject: [PATCH 03/12] Upgrade menu now authenticates and returns a URL for downloading the desired asset. --- .../app/managers/ApplicationMenuManager.ts | 25 +++++++++++-------- 1 file changed, 15 insertions(+), 10 deletions(-) diff --git a/gui-js/apps/minsky-electron/src/app/managers/ApplicationMenuManager.ts b/gui-js/apps/minsky-electron/src/app/managers/ApplicationMenuManager.ts index 276e5ec0e..641ef66b9 100644 --- a/gui-js/apps/minsky-electron/src/app/managers/ApplicationMenuManager.ts +++ b/gui-js/apps/minsky-electron/src/app/managers/ApplicationMenuManager.ts @@ -106,17 +106,22 @@ export class ApplicationMenuManager { title: '', modal: false, }); - window.loadURL('https://www.patreon.com/oauth2/authorize?response_type=code&client_id=abf9j0FWQTj-etln2BbRlUhJnjv11kaL9lH1nprj23NLSq3l6ELxUGkLJKIfWsKt&redirect_uri=https://ravelation.hpcoders.com.au/patreon-redirect.html'); - window.webContents.on('did-navigate',()=>{ - console.log(window.webContents.getURL()); - let url=new URL(window.webContents.getURL()); - let params=new URLSearchParams(url.search); - let code=params.get('code'); - if (code) { - console.log(code) - window.close(); - } + window.webContents.on('did-navigate',async ()=>{ + if (window.webContents.getURL()=='https://www.patreon.com/') + window.close() + else + { + let url=new URL(window.webContents.getURL()); + console.log(window.getURL()); + let params=new URLSearchParams(url.search); + let file=params.get('asset'); + if (file) + { + console.log(file); + window.close(); + } }); + window.loadURL('https://www.patreon.com/oauth2/authorize?response_type=code&client_id=abf9j0FWQTj-etln2BbRlUhJnjv11kaL9lH1nprj23NLSq3l6ELxUGkLJKIfWsKt&redirect_uri=https://ravelation.net/ravel-downloader.cgi'); }, }, { From 520dd4637ea9c330f56ee9c44337daff0363528c Mon Sep 17 00:00:00 2001 From: Russell Standish Date: Tue, 23 Apr 2024 15:36:29 +1000 Subject: [PATCH 04/12] More or less full upgrade download cycle working --- .../app/managers/ApplicationMenuManager.ts | 28 +----- .../src/app/managers/CommandsManager.ts | 94 ++++++++++++++++++- 2 files changed, 94 insertions(+), 28 deletions(-) diff --git a/gui-js/apps/minsky-electron/src/app/managers/ApplicationMenuManager.ts b/gui-js/apps/minsky-electron/src/app/managers/ApplicationMenuManager.ts index 641ef66b9..01cdc9506 100644 --- a/gui-js/apps/minsky-electron/src/app/managers/ApplicationMenuManager.ts +++ b/gui-js/apps/minsky-electron/src/app/managers/ApplicationMenuManager.ts @@ -81,7 +81,7 @@ export class ApplicationMenuManager { label: 'File', submenu: [ { - label: 'About Minsky', + label: 'About', click() { setInterval(()=> { console.log(process.memoryUsage()) @@ -91,7 +91,6 @@ export class ApplicationMenuManager { height: 500, title: '', url: `#/headless/menu/file/about`, - //url: `http://localhost:4200/#/headless/menu/file/about`, modal: false, }); shell.beep(); @@ -99,30 +98,7 @@ export class ApplicationMenuManager { }, { label: 'Upgrade', - click() { - let window=WindowManager.createWindow({ - width: 420, - height: 500, - title: '', - modal: false, - }); - window.webContents.on('did-navigate',async ()=>{ - if (window.webContents.getURL()=='https://www.patreon.com/') - window.close() - else - { - let url=new URL(window.webContents.getURL()); - console.log(window.getURL()); - let params=new URLSearchParams(url.search); - let file=params.get('asset'); - if (file) - { - console.log(file); - window.close(); - } - }); - window.loadURL('https://www.patreon.com/oauth2/authorize?response_type=code&client_id=abf9j0FWQTj-etln2BbRlUhJnjv11kaL9lH1nprj23NLSq3l6ELxUGkLJKIfWsKt&redirect_uri=https://ravelation.net/ravel-downloader.cgi'); - }, + click() {CommandsManager.upgrade();}, }, { label: 'New System', diff --git a/gui-js/apps/minsky-electron/src/app/managers/CommandsManager.ts b/gui-js/apps/minsky-electron/src/app/managers/CommandsManager.ts index a73b647d3..84133d86f 100644 --- a/gui-js/apps/minsky-electron/src/app/managers/CommandsManager.ts +++ b/gui-js/apps/minsky-electron/src/app/managers/CommandsManager.ts @@ -10,10 +10,10 @@ import { importCSVvariableName, minsky, GodleyIcon, Group, IntOp, Item, Lock, Ravel, VariableBase, Wire, Utility } from '@minsky/shared'; -import { dialog, ipcMain, Menu, MenuItem, SaveDialogOptions } from 'electron'; +import { dialog, ipcMain, Menu, MenuItem, SaveDialogOptions, shell } from 'electron'; import { existsSync, unlinkSync } from 'fs'; import JSON5 from 'json5'; -import { join } from 'path'; +import { join, dirname } from 'path'; import { HelpFilesManager } from './HelpFilesManager'; import { WindowManager } from './WindowManager'; import { StoreManager } from './StoreManager'; @@ -1121,5 +1121,95 @@ export class CommandsManager { minsky.numBackups(numBackups); RecentFilesManager.updateNumberOfRecentFilesToDisplay(); } + + static upgrade() { + let window=WindowManager.createWindow({ + width: 500, + height: 700, + title: '', + modal: false, + }); + + // handler for when user has logged in to initiate upgrades. + window.webContents.on('did-navigate',async ()=>{ + const urlString=window.webContents.getURL(); + if (urlString=='https://www.patreon.com/') + // user has logged out + window.close() + }); + window.webContents.on('did-redirect-navigation' async (event)=>{ + const installables=await window.webContents.executeJavaScript('document.getElementById("installables")?.innerText'); + console.log("installables:",installables?installables:null); + if (installables) { + let params=new URLSearchParams(installables); + let minskyFile=params.get('minsky-asset'); + let ravelFile=params.get('ravel-asset'); + console.log(minskyFile,ravelFile); + if (minskyFile) { + let minskyVersionRE=/(\d+)\.(\d+)\.(\d+)/; + let [all,major,minor,patch]=minskyVersionRE.exec(minskyFile); + let [currAll,currMajor,currMinor,currPatch]=minskyVersionRE.exec(await minsky.minskyVersion()); + if (major>currMajor || major===currMajor && + (minor>currMinor || minor===currMinor && patch>currPatch)) { + if (ravelFile) { + // stash in StoreManager to install on startup + } + shell.openExternal(minskyFile); // at this point, the OS will probably close Minsky. + } + // currently on latest, so reinstall ravel + if (ravelFile) + window.webContents.downloadURL(ravelFile); + else + window.close(); + } + } + }); + + // handler for downloading Ravel plugin + window.webContents.session.on('will-download',(event,item,webContents)=>{ + switch (process.platform) { + case 'win32': + item.setSavePath(dirname(process.execPath)); + break; + default: + // nothing to do - TODO implement handlers for MacOS and Linux + } + // handler for when download completed + item.once('done', (event,state)=>{ + if (state==='completed') { + dialog.showMessageBoxSync(WindowManager.getMainWindow(),{ + message: 'Ravel updated successfully - restart Ravel to use', + type: 'info', + }); + WindowManager.getMainWindow().close(); + } else { + dialog.showMessageBoxSync(WindowManager.getMainWindow(),{ + message: `Ravel update failed: ${state}`, + type: 'error', + }); + webContents.close(); + } + }); + }); + + let clientId='abf9j0FWQTj-etln2BbRlUhJnjv11kaL9lH1nprj23NLSq3l6ELxUGkLJKIfWsKt'; + // need to pass what platform we are + switch (process.platform) { + case 'win32': var system='windows'; break; + //case 'darwin': var system='macos'; break; + case 'linux': var system='windows'; break; // for testing only, comment out later + // TODO consult /etc.os-release to figure out which distro + default: + dialog.showMessageBoxSync(WindowManager.getMainWindow(),{ + message: `In app update is not available for your operating system yet, please check back later`, + type: 'error', + }); + window.close(); + return; + break; + } + // load patreon's login page + window.loadURL(`https://www.patreon.com/oauth2/authorize?response_type=code&client_id=${clientId}&redirect_uri=https://ravelation.hpcoders.com.au/ravel-downloader.cgi&state=${system}`); + } } From dfd7355f12e383844c823cf426429e125ef47c68 Mon Sep 17 00:00:00 2001 From: Russell Standish Date: Tue, 23 Apr 2024 15:56:10 +1000 Subject: [PATCH 05/12] Minor syntax errors that snuck in. --- .../apps/minsky-electron/src/app/managers/CommandsManager.ts | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/gui-js/apps/minsky-electron/src/app/managers/CommandsManager.ts b/gui-js/apps/minsky-electron/src/app/managers/CommandsManager.ts index 84133d86f..098c259ad 100644 --- a/gui-js/apps/minsky-electron/src/app/managers/CommandsManager.ts +++ b/gui-js/apps/minsky-electron/src/app/managers/CommandsManager.ts @@ -1137,14 +1137,13 @@ export class CommandsManager { // user has logged out window.close() }); - window.webContents.on('did-redirect-navigation' async (event)=>{ + window.webContents.on('did-redirect-navigation', async (event)=>{ const installables=await window.webContents.executeJavaScript('document.getElementById("installables")?.innerText'); console.log("installables:",installables?installables:null); if (installables) { let params=new URLSearchParams(installables); let minskyFile=params.get('minsky-asset'); let ravelFile=params.get('ravel-asset'); - console.log(minskyFile,ravelFile); if (minskyFile) { let minskyVersionRE=/(\d+)\.(\d+)\.(\d+)/; let [all,major,minor,patch]=minskyVersionRE.exec(minskyFile); From 20c1a7c326d5abf839adab730ed8f06962619456 Mon Sep 17 00:00:00 2001 From: Russell Standish Date: Tue, 23 Apr 2024 16:50:14 +1000 Subject: [PATCH 06/12] .dll cannot be downloaded, for some inexplicable reason known only to cpoanel creators, so add a dummy extension to it on the website, and rename it to dll when downloaded. Stupid, stupid, stupid!!! --- gui-js/apps/minsky-electron/src/app/managers/CommandsManager.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gui-js/apps/minsky-electron/src/app/managers/CommandsManager.ts b/gui-js/apps/minsky-electron/src/app/managers/CommandsManager.ts index 098c259ad..806188790 100644 --- a/gui-js/apps/minsky-electron/src/app/managers/CommandsManager.ts +++ b/gui-js/apps/minsky-electron/src/app/managers/CommandsManager.ts @@ -1168,7 +1168,7 @@ export class CommandsManager { window.webContents.session.on('will-download',(event,item,webContents)=>{ switch (process.platform) { case 'win32': - item.setSavePath(dirname(process.execPath)); + item.setSavePath(dirname(process.execPath)+'/libravel.dll'); break; default: // nothing to do - TODO implement handlers for MacOS and Linux From 66913e9a68cfb9489cdc08ced43483a03c54e5ee Mon Sep 17 00:00:00 2001 From: Russell Standish Date: Tue, 23 Apr 2024 17:55:19 +1000 Subject: [PATCH 07/12] Release 3.4.0-alpha.15 --- gui-js/libs/shared/src/lib/constants/version.ts | 2 +- gui-js/package-lock.json | 4 ++-- gui-js/package.json | 2 +- minskyVersion.h | 2 +- 4 files changed, 5 insertions(+), 5 deletions(-) diff --git a/gui-js/libs/shared/src/lib/constants/version.ts b/gui-js/libs/shared/src/lib/constants/version.ts index d81a3b484..0e4e9d095 100644 --- a/gui-js/libs/shared/src/lib/constants/version.ts +++ b/gui-js/libs/shared/src/lib/constants/version.ts @@ -1 +1 @@ -export const version="3.4.0-alpha.14"; +export const version="3.4.0-alpha.15"; diff --git a/gui-js/package-lock.json b/gui-js/package-lock.json index 596e10b00..4d2dac417 100644 --- a/gui-js/package-lock.json +++ b/gui-js/package-lock.json @@ -1,12 +1,12 @@ { "name": "minsky", - "version": "3.4.0-alpha.14", + "version": "3.4.0-alpha.15", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "minsky", - "version": "3.4.0-alpha.14", + "version": "3.4.0-alpha.15", "hasInstallScript": true, "license": "GPL-3.0-or-later", "dependencies": { diff --git a/gui-js/package.json b/gui-js/package.json index 350ceb951..50897e3f5 100644 --- a/gui-js/package.json +++ b/gui-js/package.json @@ -1,6 +1,6 @@ { "name": "minsky", - "version":"3.4.0-alpha.14", + "version":"3.4.0-alpha.15", "author": "High Performance Coders", "description": "Graphical dynamical systems simulator oriented towards economics", "build": { diff --git a/minskyVersion.h b/minskyVersion.h index 2147c68d9..dbe65c872 100644 --- a/minskyVersion.h +++ b/minskyVersion.h @@ -1 +1 @@ -#define MINSKY_VERSION "3.4.0-alpha.14" +#define MINSKY_VERSION "3.4.0-alpha.15" From c23bcd871a9a87f815ec2338a3281c58cca37f1f Mon Sep 17 00:00:00 2001 From: Russell Standish Date: Thu, 25 Apr 2024 09:45:57 +1000 Subject: [PATCH 08/12] Upgrade the minsky app through the "Upgrade" menu item now working end-to-end on Windows. --- RavelCAPI | 2 +- gui-js/apps/minsky-electron/src/app/app.ts | 6 + .../src/app/managers/CommandsManager.ts | 136 ++++++++++++------ .../src/app/managers/StoreManager.ts | 2 + 4 files changed, 105 insertions(+), 41 deletions(-) diff --git a/RavelCAPI b/RavelCAPI index d4fabc9e2..46e96ac5e 160000 --- a/RavelCAPI +++ b/RavelCAPI @@ -1 +1 @@ -Subproject commit d4fabc9e2ff0fcb63e15ecdfd77207e2ac76cfbd +Subproject commit 46e96ac5ecbd080ef80109356e44f7f1b0feaa38 diff --git a/gui-js/apps/minsky-electron/src/app/app.ts b/gui-js/apps/minsky-electron/src/app/app.ts index 828a44d50..cf1dcb1f4 100644 --- a/gui-js/apps/minsky-electron/src/app/app.ts +++ b/gui-js/apps/minsky-electron/src/app/app.ts @@ -46,6 +46,12 @@ export default class App { backend('minsky.pushFlags'); await HelpFilesManager.initialize(helpFilesFolder); App.initMainWindow(); + let ravelPlugin=StoreManager.store.get('ravelPlugin'); + if (ravelPlugin) { + App.mainWindow.webContents.downloadURL(ravelPlugin); + App.mainWindow.webContents.session.on('will-download',CommandsManager.downloadRavel); + StoreManager.store.set('ravelPlugin',''); + } await App.initMenu(); App.loadMainWindow(); backend('minsky.popFlags'); diff --git a/gui-js/apps/minsky-electron/src/app/managers/CommandsManager.ts b/gui-js/apps/minsky-electron/src/app/managers/CommandsManager.ts index 806188790..8b21ce002 100644 --- a/gui-js/apps/minsky-electron/src/app/managers/CommandsManager.ts +++ b/gui-js/apps/minsky-electron/src/app/managers/CommandsManager.ts @@ -10,14 +10,17 @@ import { importCSVvariableName, minsky, GodleyIcon, Group, IntOp, Item, Lock, Ravel, VariableBase, Wire, Utility } from '@minsky/shared'; -import { dialog, ipcMain, Menu, MenuItem, SaveDialogOptions, shell } from 'electron'; +import { app, dialog, ipcMain, Menu, MenuItem, SaveDialogOptions, shell } from 'electron'; import { existsSync, unlinkSync } from 'fs'; import JSON5 from 'json5'; import { join, dirname } from 'path'; +import { tmpdir } from 'os'; import { HelpFilesManager } from './HelpFilesManager'; import { WindowManager } from './WindowManager'; import { StoreManager } from './StoreManager'; import { RecentFilesManager } from './RecentFilesManager'; +import ProgressBar from 'electron-progressbar'; +import {spawn} from 'child_process'; export class CommandsManager { static activeGodleyWindowItems = new Map(); @@ -1122,6 +1125,75 @@ export class CommandsManager { RecentFilesManager.updateNumberOfRecentFilesToDisplay(); } + // handler for downloading Ravel and installing it + static downloadRavel(event,item,webContents) { + switch (process.platform) { + case 'win32': + item.setSavePath(dirname(process.execPath)+'/libravel.dll'); + break; + default: + // nothing to do - TODO implement handlers for MacOS and Linux + } + // handler for when download completed + item.once('done', (event,state)=>{ + if (state==='completed') { + dialog.showMessageBoxSync(WindowManager.getMainWindow(),{ + message: 'Ravel plugin updated successfully - restart Ravel to use', + type: 'info', + }); + app.relaunch(); + app.quit(); + } else { + dialog.showMessageBoxSync(WindowManager.getMainWindow(),{ + message: `Ravel plugin update failed: ${state}`, + type: 'error', + }); + webContents.close(); + } + }); + } + + // handler for downloading Minsky + static downloadMinsky(event,item,webContents) { + item.setSavePath(join(tmpdir(),item.getFilename())); + + let progress=new ProgressBar({text:"Downloading Ravel application",value: 0, indeterminate:false, closeOnComplete: true,}); + + // handler for when download completed + item.once('done', (event,state)=>{ + if (state==='completed') { + switch (process.platform) { + case 'win32': + spawn(item.getSavePath(),{detached: true, stdio: 'ignore'}); + app.quit(); + break; + default: + webContents.close(); + break; + } + } else { + dialog.showMessageBoxSync(WindowManager.getMainWindow(),{ + message: `Ravel update failed: ${state}`, + type: 'error', + }); + webContents.close(); + } + }); + + // handler for updating progress bar + item.on('updated',(event,state)=>{ + switch (state) { + case 'progressing': + if (!progress?.isCompleted()) + progress.value=100*item.getReceivedBytes()/item.getTotalBytes(); + break; + case 'interrupted': + //item.resume(); + break; + } + }); + } + static upgrade() { let window=WindowManager.createWindow({ width: 500, @@ -1139,58 +1211,42 @@ export class CommandsManager { }); window.webContents.on('did-redirect-navigation', async (event)=>{ const installables=await window.webContents.executeJavaScript('document.getElementById("installables")?.innerText'); - console.log("installables:",installables?installables:null); if (installables) { let params=new URLSearchParams(installables); let minskyFile=params.get('minsky-asset'); let ravelFile=params.get('ravel-asset'); if (minskyFile) { - let minskyVersionRE=/(\d+)\.(\d+)\.(\d+)/; + let minskyVersionRE=/(\d+)\.(\d+)\.(\d+)([.-])/; let [all,major,minor,patch]=minskyVersionRE.exec(minskyFile); - let [currAll,currMajor,currMinor,currPatch]=minskyVersionRE.exec(await minsky.minskyVersion()); + let [currAll,currMajor,currMinor,currPatch,terminator]=minskyVersionRE.exec(await minsky.minskyVersion()); if (major>currMajor || major===currMajor && - (minor>currMinor || minor===currMinor && patch>currPatch)) { - if (ravelFile) { - // stash in StoreManager to install on startup + (minor>currMinor || minor===currMinor && patch>currPatch) || + terminator==='-' && // currently a beta release, so install if release nos match (since betas precede releases) + major===currMajor && minor===currMinor && patch==currPatch + ) { + if (ravelFile) { // stash ravel upgrade to be installed on next startup + StoreManager.store.set('ravelPlugin',ravelFile); } - shell.openExternal(minskyFile); // at this point, the OS will probably close Minsky. - } - // currently on latest, so reinstall ravel - if (ravelFile) - window.webContents.downloadURL(ravelFile); - else + // openExternal opens in Edge, but doesn't start the installation + //shell.openExternal(minskyFile); // at this point, the OS will probably close Minsky. + window.webContents.session.on('will-download',this.downloadMinsky); + window.webContents.downloadURL(minskyFile); + } else if (ravelFile) { + // currently on latest, so reinstall ravel + window.webContents.session.on('will-download',this.downloadRavel); + window.webContents.downloadURL(ravelFile); + } + else { + dialog.showMessageBoxSync(WindowManager.getMainWindow(),{ + message: "Everything's up to date, nothing to do", + type: 'info', + }); window.close(); + } } } }); - // handler for downloading Ravel plugin - window.webContents.session.on('will-download',(event,item,webContents)=>{ - switch (process.platform) { - case 'win32': - item.setSavePath(dirname(process.execPath)+'/libravel.dll'); - break; - default: - // nothing to do - TODO implement handlers for MacOS and Linux - } - // handler for when download completed - item.once('done', (event,state)=>{ - if (state==='completed') { - dialog.showMessageBoxSync(WindowManager.getMainWindow(),{ - message: 'Ravel updated successfully - restart Ravel to use', - type: 'info', - }); - WindowManager.getMainWindow().close(); - } else { - dialog.showMessageBoxSync(WindowManager.getMainWindow(),{ - message: `Ravel update failed: ${state}`, - type: 'error', - }); - webContents.close(); - } - }); - }); - let clientId='abf9j0FWQTj-etln2BbRlUhJnjv11kaL9lH1nprj23NLSq3l6ELxUGkLJKIfWsKt'; // need to pass what platform we are switch (process.platform) { diff --git a/gui-js/apps/minsky-electron/src/app/managers/StoreManager.ts b/gui-js/apps/minsky-electron/src/app/managers/StoreManager.ts index 124e1f26f..652d1cfac 100644 --- a/gui-js/apps/minsky-electron/src/app/managers/StoreManager.ts +++ b/gui-js/apps/minsky-electron/src/app/managers/StoreManager.ts @@ -16,6 +16,7 @@ interface MinskyStore { recentFiles: Array; backgroundColor: string; preferences: MinskyPreferences; + ravelPlugin: string; // used for post installation installation of Ravel } class StoreManager { @@ -34,6 +35,7 @@ class StoreManager { // focusFollowsMouse: false, numBackups: 1, }, + ravelPlugin: '', }, }); } From 1ec15bc777d337ce622516f6d7bad9ee6d4f5584 Mon Sep 17 00:00:00 2001 From: Russell Standish Date: Thu, 25 Apr 2024 10:38:31 +1000 Subject: [PATCH 09/12] Post a message to the user on startup fi ravel is installed, and less than 30 days to go until expired. --- RavelCAPI | 2 +- gui-js/apps/minsky-electron/src/app/app.ts | 8 ++++++++ gui-js/libs/shared/src/lib/backend/minsky.ts | 1 + model/minsky.h | 3 ++- 4 files changed, 12 insertions(+), 2 deletions(-) diff --git a/RavelCAPI b/RavelCAPI index 46e96ac5e..d4fabc9e2 160000 --- a/RavelCAPI +++ b/RavelCAPI @@ -1 +1 @@ -Subproject commit 46e96ac5ecbd080ef80109356e44f7f1b0feaa38 +Subproject commit d4fabc9e2ff0fcb63e15ecdfd77207e2ac76cfbd diff --git a/gui-js/apps/minsky-electron/src/app/app.ts b/gui-js/apps/minsky-electron/src/app/app.ts index cf1dcb1f4..1eef4f7e0 100644 --- a/gui-js/apps/minsky-electron/src/app/app.ts +++ b/gui-js/apps/minsky-electron/src/app/app.ts @@ -52,6 +52,14 @@ export default class App { App.mainWindow.webContents.session.on('will-download',CommandsManager.downloadRavel); StoreManager.store.set('ravelPlugin',''); } + // check if ravel is approaching its expiry date, and nag user to upgrade if so + let daysLeft=await minsky.daysUntilRavelExpires(); + if (await minsky.ravelVersion()!=="unavailable" && daysLeft<30) { + dialog.showMessageBoxSync(WindowManager.getMainWindow(),{ + message: `The Ravel plugin is expiring in ${daysLeft} days,\nplease update the plugin using the File>Upgrade menu`, + type: 'info', + }); + } await App.initMenu(); App.loadMainWindow(); backend('minsky.popFlags'); diff --git a/gui-js/libs/shared/src/lib/backend/minsky.ts b/gui-js/libs/shared/src/lib/backend/minsky.ts index 4f292d6d2..b04a612e9 100644 --- a/gui-js/libs/shared/src/lib/backend/minsky.ts +++ b/gui-js/libs/shared/src/lib/backend/minsky.ts @@ -1351,6 +1351,7 @@ export class Minsky extends CppClass { async copy(): Promise {return this.$callMethod('copy');} async cut(): Promise {return this.$callMethod('cut');} async cycleCheck(): Promise {return this.$callMethod('cycleCheck');} + async daysUntilRavelExpires(): Promise {return this.$callMethod('daysUntilRavelExpires');} async defaultFont(...args: any[]): Promise {return this.$callMethod('defaultFont',...args);} async definingVar(a1: string): Promise {return this.$callMethod('definingVar',a1);} async deleteAllUnits(): Promise {return this.$callMethod('deleteAllUnits');} diff --git a/model/minsky.h b/model/minsky.h index 680813fa0..16e68a998 100644 --- a/model/minsky.h +++ b/model/minsky.h @@ -335,7 +335,8 @@ namespace minsky else return "unavailable"; } static bool ravelExpired() {return ravel::Ravel::available() && ravel::Ravel::daysUntilExpired()<0;} - + static int daysUntilRavelExpires() {return ravel::Ravel::daysUntilExpired();} + std::string fileVersion; ///< Minsky version file was saved under unsigned maxHistory{100}; ///< maximum no. of history states to save From 11d31762eb1ffce902c740ffdc0968f4c7ea61d5 Mon Sep 17 00:00:00 2001 From: Russell Standish Date: Thu, 25 Apr 2024 10:57:11 +1000 Subject: [PATCH 10/12] Add comment --- gui-js/apps/minsky-electron/src/app/app.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/gui-js/apps/minsky-electron/src/app/app.ts b/gui-js/apps/minsky-electron/src/app/app.ts index 1eef4f7e0..e8c11e6f7 100644 --- a/gui-js/apps/minsky-electron/src/app/app.ts +++ b/gui-js/apps/minsky-electron/src/app/app.ts @@ -48,6 +48,7 @@ export default class App { App.initMainWindow(); let ravelPlugin=StoreManager.store.get('ravelPlugin'); if (ravelPlugin) { + // if this is set (after a full reinstall of Minsky, kick off updating the Ravel plugin) App.mainWindow.webContents.downloadURL(ravelPlugin); App.mainWindow.webContents.session.on('will-download',CommandsManager.downloadRavel); StoreManager.store.set('ravelPlugin',''); From c621342c45ff0d298268a82ff70a3bfdbd81e458 Mon Sep 17 00:00:00 2001 From: Russell Standish Date: Thu, 25 Apr 2024 11:01:28 +1000 Subject: [PATCH 11/12] Minor things - dead code removal, testing code commented out. --- .../minsky-electron/src/app/managers/CommandsManager.ts | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/gui-js/apps/minsky-electron/src/app/managers/CommandsManager.ts b/gui-js/apps/minsky-electron/src/app/managers/CommandsManager.ts index 8b21ce002..cd64b12fb 100644 --- a/gui-js/apps/minsky-electron/src/app/managers/CommandsManager.ts +++ b/gui-js/apps/minsky-electron/src/app/managers/CommandsManager.ts @@ -10,7 +10,7 @@ import { importCSVvariableName, minsky, GodleyIcon, Group, IntOp, Item, Lock, Ravel, VariableBase, Wire, Utility } from '@minsky/shared'; -import { app, dialog, ipcMain, Menu, MenuItem, SaveDialogOptions, shell } from 'electron'; +import { app, dialog, ipcMain, Menu, MenuItem, SaveDialogOptions,} from 'electron'; import { existsSync, unlinkSync } from 'fs'; import JSON5 from 'json5'; import { join, dirname } from 'path'; @@ -1227,8 +1227,6 @@ export class CommandsManager { if (ravelFile) { // stash ravel upgrade to be installed on next startup StoreManager.store.set('ravelPlugin',ravelFile); } - // openExternal opens in Edge, but doesn't start the installation - //shell.openExternal(minskyFile); // at this point, the OS will probably close Minsky. window.webContents.session.on('will-download',this.downloadMinsky); window.webContents.downloadURL(minskyFile); } else if (ravelFile) { @@ -1252,7 +1250,7 @@ export class CommandsManager { switch (process.platform) { case 'win32': var system='windows'; break; //case 'darwin': var system='macos'; break; - case 'linux': var system='windows'; break; // for testing only, comment out later + //case 'linux': var system='linux'; break; // TODO consult /etc.os-release to figure out which distro default: dialog.showMessageBoxSync(WindowManager.getMainWindow(),{ From 079fc624b6fede836d49e0414ecbeef300496653 Mon Sep 17 00:00:00 2001 From: Russell Standish Date: Thu, 25 Apr 2024 11:02:59 +1000 Subject: [PATCH 12/12] .->/ in comment --- gui-js/apps/minsky-electron/src/app/managers/CommandsManager.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gui-js/apps/minsky-electron/src/app/managers/CommandsManager.ts b/gui-js/apps/minsky-electron/src/app/managers/CommandsManager.ts index cd64b12fb..b2bf20afc 100644 --- a/gui-js/apps/minsky-electron/src/app/managers/CommandsManager.ts +++ b/gui-js/apps/minsky-electron/src/app/managers/CommandsManager.ts @@ -1251,7 +1251,7 @@ export class CommandsManager { case 'win32': var system='windows'; break; //case 'darwin': var system='macos'; break; //case 'linux': var system='linux'; break; - // TODO consult /etc.os-release to figure out which distro + // TODO consult /etc/os-release to figure out which distro default: dialog.showMessageBoxSync(WindowManager.getMainWindow(),{ message: `In app update is not available for your operating system yet, please check back later`,