node-notifier icon indicating copy to clipboard operation
node-notifier copied to clipboard

[Guide] How to use SnoreToast with both appID and actions

Open Araxeus opened this issue 2 years ago • 2 comments

  • You need to create a shortcut to your app in the start menu, and it needs to include the following:

    • appUserModelId Application User Model ID

    • toastActivatorClsid Value depends on the SnoreToast version! https://github.com/KDE/snoretoast/blob/v0.9.0/CMakeLists.txt#L5 https://github.com/KDE/snoretoast/blob/v0.7.0/CMakeLists.txt#L5

  • You need to do app.setAppUserModelId(appID)

Here is an example from youtube-music :

if (is.windows()) {
		// Depends on SnoreToast version https://github.com/KDE/snoretoast/blob/master/CMakeLists.txt#L5
		const toastActivatorClsid = "eb1fdd5b-8f70-4b5a-b230-998a2dc19303"; // v0.7.0

		const appID = "com.github.th-ch.youtube-music";
		app.setAppUserModelId(appID);

		const appLocation = process.execPath;
		const appData = app.getPath("appData");

		// continue if not in dev mode / running portable app
		if (!is.dev() && !appLocation.startsWith(path.join(appData, "..", "Local", "Temp"))) {
			// shortcutPath can be anywhere inside AppData\Roaming\Microsoft\Windows\Start Menu\Programs\
			const shortcutPath = path.join(appData, "Microsoft", "Windows", "Start Menu", "Programs", "YouTube Music.lnk");
			// check if shortcut doesn't exist -> create it, if it exist and invalid -> update it
			try { 
				const shortcutDetails = electron.shell.readShortcutLink(shortcutPath); // throws error if it doesn't exist yet
				// validate shortcutDetails
				if (
					shortcutDetails.target !== appLocation ||
					shortcutDetails.appUserModelId !== appID ||
					shortcutDetails.toastActivatorClsid !== toastActivatorClsid
				) {
					throw "needUpdate";
				}
				// if the execution got to this line, the shortcut exists and is valid
			} catch (error) { // if not valid -> Register shortcut
				electron.shell.writeShortcutLink(
					shortcutPath,
					error === "needUpdate" ? "update" : "create",
					{
						target: appLocation,
						cwd: path.dirname(appLocation),
						description: "YouTube Music Desktop App - including custom plugins",
						appUserModelId: appID,
						toastActivatorClsid
					}
				);
			}
		}
	}

this method currently requires Electron but you could get packages from npm / make similar functions yourself

Araxeus avatar Jan 07 '23 03:01 Araxeus

@mikaelbr

  • There should be some official way to know the version of SnoreToast in /vendors,
  • Maybe this post or the gist of it should be mentioned in the Readme

Araxeus avatar Jan 07 '23 03:01 Araxeus

Thanks for the guide 🙌 ! Added link to this post here 027f0d6c837542459357d59bcc8aee1bf447a9fb. If you have any suggestion how to have an official way to know the version, I'm happy to hear it!

mikaelbr avatar Jan 09 '23 13:01 mikaelbr