mikaelbr / node-notifier

A Node.js module for sending notifications on native Mac, Windows and Linux (or Growl as fallback)
MIT License
5.72k stars 323 forks source link

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

Open Araxeus opened 1 year ago

Araxeus commented 1 year ago

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 commented 1 year ago

@mikaelbr

mikaelbr commented 1 year ago

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!