From 76eabacc7caccc357e667dffc84b6c86871c8a85 Mon Sep 17 00:00:00 2001 From: Salastil Date: Sat, 3 Oct 2026 23:03:26 -0400 Subject: [PATCH] Windows installer: ask before leaving sign-ins behind; stop the daemon; artwork (#258, #262) build/installer.nsh, picked up by electron-builder: - Uninstalling asks whether to remove the accounts, their saved sign-ins and the history kept here (Roaming\moho, Roaming\nobilis, Local\nobilis). No by default and in a silent uninstall; never on an upgrade, which runs the old uninstaller too. The 133 MB moho-updater download cache always goes. Before, all of it stayed, unasked. - The daemon is stopped before files are replaced or removed: it outlives the window by design and holds nobilis.exe open. On install, once Install is pressed (customCheckAppRunning, then electron-builder's own check) - not when the installer opens, or opening it and cancelling cut a running moho off from its daemon. On uninstall, once confirmed. - installerSidebar/uninstallerSidebar.bmp: moho's icon and name in place of NSIS's stock artwork. Checked on the Windows VM: upgrade over a running moho, daemon alive until Install, then stopped; uninstall asks, Yes removes every folder. Not done: "Space required" still shows the archive's 134 MB. SectionSetSize from .onInit does not reach electron-builder's install section (it is not found by index or by name at that point). Co-Authored-By: Claude Opus 5.5 --- build/installer.nsh | 49 +++++++++++++++++++++++++++++ build/installerSidebar.bmp | Bin 0 -> 154542 bytes build/uninstallerSidebar.bmp | Bin 0 -> 154542 bytes src/renderer/src/assets/matrix.svg | 18 ----------- 4 files changed, 49 insertions(+), 18 deletions(-) create mode 100644 build/installer.nsh create mode 100644 build/installerSidebar.bmp create mode 100644 build/uninstallerSidebar.bmp delete mode 100644 src/renderer/src/assets/matrix.svg diff --git a/build/installer.nsh b/build/installer.nsh new file mode 100644 index 0000000..3f88c22 --- /dev/null +++ b/build/installer.nsh @@ -0,0 +1,49 @@ +; moho's additions to electron-builder's NSIS installer. Picked up by +; electron-builder because of where it lives (build/installer.nsh). + +; electron-builder's own app check needs these, and leaves them out when +; a project brings its own check - as this one does, below. +!include "getProcessInfo.nsh" +Var pid + +; moho's daemon keeps running after the window closes, by design - and so +; keeps nobilis.exe open. An upgrade or an uninstall that cannot replace or +; remove that file leaves the old daemon behind, which is how a new window +; ends up talking to an old daemon. Stopped first, every time. +!macro mohoStopDaemon + nsExec::Exec '"$SYSDIR\taskkill.exe" /F /IM nobilis.exe' + Pop $0 + Sleep 500 +!macroend + +; Once installing has actually begun - after Install is pressed, not when the +; installer opens, or opening it and cancelling would have cut a running moho +; off from its daemon. Then electron-builder's own check for the window. +!macro customCheckAppRunning + !insertmacro mohoStopDaemon + !insertmacro IS_POWERSHELL_AVAILABLE + !insertmacro _CHECK_APP_RUNNING +!macroend + +; What the program leaves outside its own folder. Not touched by an upgrade, +; which runs the old uninstaller too (isUpdated): a new version keeps +; everything the old one had. +!macro customUnInstall + ; Confirmed by now, so stopping it costs nothing that was not agreed to. + !insertmacro mohoStopDaemon + ${ifNot} ${isUpdated} + ; A download cache, nobody's data. Always. + RMDir /r "$LOCALAPPDATA\moho-updater" + ; Accounts with their saved sign-ins, history, caches. Asked, because + ; someone reinstalling wants them back - but asked, because someone + ; uninstalling may well expect a saved sign-in to go with the program. + ; No in a silent uninstall. + MessageBox MB_YESNO|MB_ICONQUESTION|MB_DEFBUTTON2 \ + "Also remove your moho accounts, their saved sign-ins and the message history kept on this computer?$\r$\n$\r$\nChoose No to keep them for when moho is installed again." \ + /SD IDNO IDNO mohoKeepData + RMDir /r "$APPDATA\moho" + RMDir /r "$APPDATA\nobilis" + RMDir /r "$LOCALAPPDATA\nobilis" + mohoKeepData: + ${endIf} +!macroend diff --git a/build/installerSidebar.bmp b/build/installerSidebar.bmp new file mode 100644 index 0000000000000000000000000000000000000000..7b6f85035db338e2453aed60d40dbe6ebfab9141 GIT binary patch literal 154542 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 - - - matrix logo white - Created with Sketch. - - - - - - - - - - - - -