Make Windows Ctrl+Q feature optional; add opt-in auto update (#451)
This commit is contained in:
		
							parent
							
								
									25d32ce292
								
							
						
					
					
						commit
						b2ecb02335
					
				
					 6 changed files with 84 additions and 33 deletions
				
			
		|  | @ -30,7 +30,7 @@ import "./webpack/patchWebpack"; | |||
| import { popNotice, showNotice } from "./api/Notices"; | ||||
| import { PlainSettings, Settings } from "./api/settings"; | ||||
| import { patches, PMLogger, startAllPlugins } from "./plugins"; | ||||
| import { checkForUpdates, UpdateLogger } from "./utils/updater"; | ||||
| import { checkForUpdates, rebuild, update, UpdateLogger } from "./utils/updater"; | ||||
| import { onceReady } from "./webpack"; | ||||
| import { Router } from "./webpack/common"; | ||||
| 
 | ||||
|  | @ -44,7 +44,27 @@ async function init() { | |||
|     if (!IS_WEB) { | ||||
|         try { | ||||
|             const isOutdated = await checkForUpdates(); | ||||
|             if (isOutdated && Settings.notifyAboutUpdates) | ||||
|             if (!isOutdated) return; | ||||
| 
 | ||||
|             if (Settings.autoUpdate) { | ||||
|                 await update(); | ||||
|                 const needsFullRestart = await rebuild(); | ||||
|                 setTimeout(() => { | ||||
|                     showNotice( | ||||
|                         "Vencord has been updated!", | ||||
|                         "Restart", | ||||
|                         () => { | ||||
|                             if (needsFullRestart) | ||||
|                                 window.DiscordNative.app.relaunch(); | ||||
|                             else | ||||
|                                 location.reload(); | ||||
|                         } | ||||
|                     ); | ||||
|                 }, 10_000); | ||||
|                 return; | ||||
|             } | ||||
| 
 | ||||
|             if (Settings.notifyAboutUpdates) | ||||
|                 setTimeout(() => { | ||||
|                     showNotice( | ||||
|                         "A Vencord update is available!", | ||||
|  | @ -54,7 +74,7 @@ async function init() { | |||
|                             Router.open("VencordUpdater"); | ||||
|                         } | ||||
|                     ); | ||||
|                 }, 10000); | ||||
|                 }, 10_000); | ||||
|         } catch (err) { | ||||
|             UpdateLogger.error("Failed to check for updates", err); | ||||
|         } | ||||
|  |  | |||
|  | @ -27,10 +27,12 @@ import plugins from "~plugins"; | |||
| const logger = new Logger("Settings"); | ||||
| export interface Settings { | ||||
|     notifyAboutUpdates: boolean; | ||||
|     autoUpdate: boolean; | ||||
|     useQuickCss: boolean; | ||||
|     enableReactDevtools: boolean; | ||||
|     themeLinks: string[]; | ||||
|     frameless: boolean; | ||||
|     winCtrlQ: boolean; | ||||
|     plugins: { | ||||
|         [plugin: string]: { | ||||
|             enabled: boolean; | ||||
|  | @ -41,10 +43,12 @@ export interface Settings { | |||
| 
 | ||||
| const DefaultSettings: Settings = { | ||||
|     notifyAboutUpdates: true, | ||||
|     autoUpdate: false, | ||||
|     useQuickCss: true, | ||||
|     themeLinks: [], | ||||
|     enableReactDevtools: false, | ||||
|     frameless: false, | ||||
|     winCtrlQ: false, | ||||
|     plugins: {} | ||||
| }; | ||||
| 
 | ||||
|  |  | |||
|  | @ -16,6 +16,7 @@ | |||
|  * along with this program.  If not, see <https://www.gnu.org/licenses/>.
 | ||||
| */ | ||||
| 
 | ||||
| import { useSettings } from "@api/settings"; | ||||
| import ErrorBoundary from "@components/ErrorBoundary"; | ||||
| import { ErrorCard } from "@components/ErrorCard"; | ||||
| import { Flex } from "@components/Flex"; | ||||
|  | @ -23,7 +24,7 @@ import { handleComponentFailed } from "@components/handleComponentFailed"; | |||
| import { Link } from "@components/Link"; | ||||
| import { classes, useAwaiter } from "@utils/misc"; | ||||
| import { changes, checkForUpdates, getRepo, isNewer, rebuild, update, updateError, UpdateLogger } from "@utils/updater"; | ||||
| import { Alerts, Button, Card, Forms, Margins, Parser, React, Toasts } from "@webpack/common"; | ||||
| import { Alerts, Button, Card, Forms, Margins, Parser, React, Switch, Toasts } from "@webpack/common"; | ||||
| 
 | ||||
| import gitHash from "~git-hash"; | ||||
| 
 | ||||
|  | @ -183,6 +184,8 @@ function Newer(props: CommonProps) { | |||
| } | ||||
| 
 | ||||
| function Updater() { | ||||
|     const settings = useSettings(["notifyAboutUpdates", "autoUpdate"]); | ||||
| 
 | ||||
|     const [repo, err, repoPending] = useAwaiter(getRepo, { fallbackValue: "Loading..." }); | ||||
| 
 | ||||
|     React.useEffect(() => { | ||||
|  | @ -197,6 +200,23 @@ function Updater() { | |||
| 
 | ||||
|     return ( | ||||
|         <Forms.FormSection> | ||||
|             <Forms.FormTitle tag="h5">Updater Settings</Forms.FormTitle> | ||||
|             <Switch | ||||
|                 value={settings.notifyAboutUpdates} | ||||
|                 onChange={(v: boolean) => settings.notifyAboutUpdates = v} | ||||
|                 note="Shows a toast on startup" | ||||
|                 disabled={settings.autoUpdate} | ||||
|             > | ||||
|                 Get notified about new updates | ||||
|             </Switch> | ||||
|             <Switch | ||||
|                 value={settings.autoUpdate} | ||||
|                 onChange={(v: boolean) => settings.autoUpdate = v} | ||||
|                 note="Automatically update Vencord without confirmation prompt" | ||||
|             > | ||||
|                 Automatically update | ||||
|             </Switch> | ||||
| 
 | ||||
|             <Forms.FormTitle tag="h5">Repo</Forms.FormTitle> | ||||
| 
 | ||||
|             <Forms.FormText>{repoPending ? repo : err ? "Failed to retrieve - check console" : ( | ||||
|  |  | |||
|  | @ -97,21 +97,26 @@ function VencordSettings() { | |||
|                         <Switch | ||||
|                             value={settings.enableReactDevtools} | ||||
|                             onChange={(v: boolean) => settings.enableReactDevtools = v} | ||||
|                             note="Requires a full restart"> | ||||
|                             note="Requires a full restart" | ||||
|                         > | ||||
|                             Enable React Developer Tools | ||||
|                         </Switch> | ||||
|                         <Switch | ||||
|                             value={settings.notifyAboutUpdates} | ||||
|                             onChange={(v: boolean) => settings.notifyAboutUpdates = v} | ||||
|                             note="Shows a toast on startup"> | ||||
|                             Get notified about new updates | ||||
|                         </Switch> | ||||
|                         <Switch | ||||
|                             value={settings.frameless} | ||||
|                             onChange={(v: boolean) => settings.frameless = v} | ||||
|                             note="Requires a full restart"> | ||||
|                             note="Requires a full restart" | ||||
|                         > | ||||
|                             Disable the window frame | ||||
|                         </Switch> | ||||
|                         {navigator.platform.toLowerCase().startsWith("win") && ( | ||||
|                             <Switch | ||||
|                                 value={settings.winCtrlQ} | ||||
|                                 onChange={(v: boolean) => settings.winCtrlQ = v} | ||||
|                                 note="Requires a full restart" | ||||
|                             > | ||||
|                                 Register Ctrl+Q as shortcut to close Discord (Alternative to Alt+F4) | ||||
|                             </Switch> | ||||
|                         )} | ||||
|                     </React.Fragment> | ||||
|                 )} | ||||
| 
 | ||||
|  |  | |||
|  | @ -43,33 +43,35 @@ require.main!.filename = join(asarPath, discordPkg.main); | |||
| app.setAppPath(asarPath); | ||||
| 
 | ||||
| if (!process.argv.includes("--vanilla")) { | ||||
|     let settings: typeof import("@api/settings").Settings = {} as any; | ||||
|     try { | ||||
|         settings = JSON.parse(readSettings()); | ||||
|     } catch { } | ||||
| 
 | ||||
|     // Repatch after host updates on Windows
 | ||||
|     if (process.platform === "win32") { | ||||
|         require("./patchWin32Updater"); | ||||
| 
 | ||||
|         const originalBuild = Menu.buildFromTemplate; | ||||
|         Menu.buildFromTemplate = function (template) { | ||||
|             if (template[0]?.label === "&File") { | ||||
|                 const { submenu } = template[0]; | ||||
|                 if (Array.isArray(submenu)) { | ||||
|                     submenu.push({ | ||||
|                         label: "Quit (Hidden)", | ||||
|                         visible: false, | ||||
|                         acceleratorWorksWhenHidden: true, | ||||
|                         accelerator: "Control+Q", | ||||
|                         click: () => app.quit() | ||||
|                     }); | ||||
|         if (settings.winCtrlQ) { | ||||
|             const originalBuild = Menu.buildFromTemplate; | ||||
|             Menu.buildFromTemplate = function (template) { | ||||
|                 if (template[0]?.label === "&File") { | ||||
|                     const { submenu } = template[0]; | ||||
|                     if (Array.isArray(submenu)) { | ||||
|                         submenu.push({ | ||||
|                             label: "Quit (Hidden)", | ||||
|                             visible: false, | ||||
|                             acceleratorWorksWhenHidden: true, | ||||
|                             accelerator: "Control+Q", | ||||
|                             click: () => app.quit() | ||||
|                         }); | ||||
|                     } | ||||
|                 } | ||||
|             } | ||||
|             return originalBuild.call(this, template); | ||||
|         }; | ||||
|                 return originalBuild.call(this, template); | ||||
|             }; | ||||
|         } | ||||
|     } | ||||
| 
 | ||||
|     let settings = {} as any; | ||||
|     try { | ||||
|         settings = JSON.parse(readSettings()); | ||||
|     } catch { } | ||||
| 
 | ||||
|     class BrowserWindow extends electron.BrowserWindow { | ||||
|         constructor(options: BrowserWindowConstructorOptions) { | ||||
|             if (options?.webPreferences?.preload && options.title) { | ||||
|  |  | |||
|  | @ -22,7 +22,7 @@ import IpcEvents from "./IpcEvents"; | |||
| import Logger from "./Logger"; | ||||
| import { IpcRes } from "./types"; | ||||
| 
 | ||||
| export const UpdateLogger = new Logger("Updater", "white"); | ||||
| export const UpdateLogger = /* #__PURE__*/ new Logger("Updater", "white"); | ||||
| export let isOutdated = false; | ||||
| export let isNewer = false; | ||||
| export let updateError: any; | ||||
|  |  | |||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue