From 3a91fafe8f37c3427668a732f576bc9ed4ce9a39 Mon Sep 17 00:00:00 2001 From: pdmarf <135653545+pdmarf@users.noreply.github.com> Date: Thu, 23 Apr 2026 21:41:29 +0100 Subject: [PATCH] v1.0.25: add Check for Updates button Co-Authored-By: Claude Sonnet 4.6 --- com.pdma.notion-timer.sdPlugin/bin/plugin.js | 30 ++++++++++++++---- .../bin/plugin.js.sig | 4 ++- .../ui/property-inspector.html | 29 +++++++++++++++++ notion-timer.streamDeckPlugin | Bin 98470 -> 98754 bytes src/plugin.ts | 24 ++++++++++---- 5 files changed, 74 insertions(+), 13 deletions(-) diff --git a/com.pdma.notion-timer.sdPlugin/bin/plugin.js b/com.pdma.notion-timer.sdPlugin/bin/plugin.js index a59bd84..022e76d 100644 --- a/com.pdma.notion-timer.sdPlugin/bin/plugin.js +++ b/com.pdma.notion-timer.sdPlugin/bin/plugin.js @@ -6438,7 +6438,7 @@ async function stopTimer(token, entryId) { } // src/plugin.ts -var CURRENT_VERSION = "1.0.23"; +var CURRENT_VERSION = "1.0.25"; var GITEA_BASE = "https://gitea.pdmarf.co.uk/pdm/stream_deck_notion_timer/raw/branch/master"; var SIGNING_PUBLIC_KEY = `-----BEGIN PUBLIC KEY----- MCowBQYDK2VwAyEAN7ko8TUpuPzPAJuKAZCRjV0c4ZSlou5d9pUAF6o12b4= @@ -6456,24 +6456,35 @@ function fetchWithTimeout2(url) { const timer = setTimeout(() => controller.abort(), 1e4); return fetch(url, { signal: controller.signal }).finally(() => clearTimeout(timer)); } -async function checkForUpdates() { +async function checkForUpdates(sendStatus) { try { const resp = await fetchWithTimeout2(`${GITEA_BASE}/version.json`); - if (!resp.ok) return; + if (!resp.ok) { + sendStatus?.("Update check failed"); + return; + } const { version } = await resp.json(); if (!/^\d+\.\d+\.\d+$/.test(version)) return; - if (!isNewerVersion(version, CURRENT_VERSION)) return; + if (!isNewerVersion(version, CURRENT_VERSION)) { + sendStatus?.(`Already up to date (v${CURRENT_VERSION})`); + return; + } + sendStatus?.(`Updating to v${version}\u2026`); const [pluginResp, sigResp] = await Promise.all([ fetchWithTimeout2(`${GITEA_BASE}/com.pdma.notion-timer.sdPlugin/bin/plugin.js`), fetchWithTimeout2(`${GITEA_BASE}/com.pdma.notion-timer.sdPlugin/bin/plugin.js.sig`) ]); - if (!pluginResp.ok || !sigResp.ok) return; + if (!pluginResp.ok || !sigResp.ok) { + sendStatus?.("Download failed"); + return; + } const newCode = await pluginResp.text(); const sigBytes = Buffer.from(await sigResp.arrayBuffer()); const { verify } = await import("node:crypto"); const valid = verify(null, Buffer.from(newCode), SIGNING_PUBLIC_KEY, sigBytes); if (!valid) { plugin_default.logger.error("Update rejected: signature verification failed"); + sendStatus?.("Update rejected: invalid signature"); return; } const fs3 = await import("fs"); @@ -6481,7 +6492,9 @@ async function checkForUpdates() { plugin_default.logger.info(`Updated to ${version}, restarting\u2026`); process.exit(0); } catch (err) { - plugin_default.logger.error(`Update check failed: ${err instanceof Error ? err.message : String(err)}`); + const msg = err instanceof Error ? err.message : String(err); + plugin_default.logger.error(`Update check failed: ${msg}`); + sendStatus?.(`Error: ${msg}`); } } var HARDCODED = { @@ -6621,6 +6634,11 @@ plugin_default.ui.onSendToPlugin(async (ev) => { const title = buttonTitle(ev.payload.settings.projectName || ""); if (title) await ev.action.setTitle(title); } + if (ev.payload.event === "checkForUpdates") { + const send = (msg) => plugin_default.ui.sendToPropertyInspector({ event: "updateStatus", message: msg }); + send("Checking\u2026"); + await checkForUpdates(send); + } }); plugin_default.connect(); setTimeout(() => checkForUpdates(), 1e4); diff --git a/com.pdma.notion-timer.sdPlugin/bin/plugin.js.sig b/com.pdma.notion-timer.sdPlugin/bin/plugin.js.sig index 9289204..d1817a8 100644 --- a/com.pdma.notion-timer.sdPlugin/bin/plugin.js.sig +++ b/com.pdma.notion-timer.sdPlugin/bin/plugin.js.sig @@ -1 +1,3 @@ -(=uIXpTD0tQ εFr!(\${ EHR05q \ No newline at end of file +Һ +HJ{l >0^t @@ -125,6 +145,8 @@

+ +

@@ -229,6 +251,10 @@ document.getElementById("projectSelect").addEventListener("change", save); document.getElementById("notionToken").addEventListener("input", scheduleCredSave); document.getElementById("userId").addEventListener("change", saveCredentials); + document.getElementById("updateBtn").addEventListener("click", function() { + document.getElementById("updateStatus").textContent = ""; + $PI.sendToPlugin({ event: "checkForUpdates" }); + }); }); $PI.onDidReceiveGlobalSettings(function(jsn) { @@ -268,6 +294,9 @@ $PI.onSendToPropertyInspector(ACTION_UUID, function(jsn) { var payload = jsn.payload; + if (payload.event === "updateStatus") { + document.getElementById("updateStatus").textContent = payload.message; + } if (payload.event === "projects") { if (payload.version) { document.getElementById("versionText").textContent = "v" + payload.version; diff --git a/notion-timer.streamDeckPlugin b/notion-timer.streamDeckPlugin index c3273a20752a5b1957517c1a56cbd76ca0a706c9..e30bf4c36740521bf9fcb307e5e80a828b1dcb7a 100644 GIT binary patch delta 5142 zcmZWtcQl;www=*?FF~R+y69c>Xh9GpMki`?qZ_^V!Kl$iXVgTA5M4w>?GtbI&p61V6y&Y$=-d8;ypqV9mmL+O z5(wteEPT@K(rE$JDED*Ub3+YNCfwhLH(z)RvQ_wOxn!1HOpt5T^pRJ@R7NPE$Et#p z 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 delta 4823 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 { return fetch(url, { signal: controller.signal }).finally(() => clearTimeout(timer)); } -async function checkForUpdates(): Promise { +async function checkForUpdates(sendStatus?: (msg: string) => void): Promise { try { const resp = await fetchWithTimeout(`${GITEA_BASE}/version.json`); - if (!resp.ok) return; + if (!resp.ok) { sendStatus?.("Update check failed"); return; } const { version } = await resp.json() as { version: string }; if (!/^\d+\.\d+\.\d+$/.test(version)) return; - if (!isNewerVersion(version, CURRENT_VERSION)) return; + if (!isNewerVersion(version, CURRENT_VERSION)) { + sendStatus?.(`Already up to date (v${CURRENT_VERSION})`); + return; + } + sendStatus?.(`Updating to v${version}…`); const [pluginResp, sigResp] = await Promise.all([ fetchWithTimeout(`${GITEA_BASE}/com.pdma.notion-timer.sdPlugin/bin/plugin.js`), fetchWithTimeout(`${GITEA_BASE}/com.pdma.notion-timer.sdPlugin/bin/plugin.js.sig`), ]); - if (!pluginResp.ok || !sigResp.ok) return; + if (!pluginResp.ok || !sigResp.ok) { sendStatus?.("Download failed"); return; } const newCode = await pluginResp.text(); const sigBytes = Buffer.from(await sigResp.arrayBuffer()); @@ -40,6 +44,7 @@ async function checkForUpdates(): Promise { const valid = verify(null, Buffer.from(newCode), SIGNING_PUBLIC_KEY, sigBytes); if (!valid) { streamDeck.logger.error("Update rejected: signature verification failed"); + sendStatus?.("Update rejected: invalid signature"); return; } @@ -48,7 +53,9 @@ async function checkForUpdates(): Promise { streamDeck.logger.info(`Updated to ${version}, restarting…`); process.exit(0); } catch (err) { - streamDeck.logger.error(`Update check failed: ${err instanceof Error ? err.message : String(err)}`); + const msg = err instanceof Error ? err.message : String(err); + streamDeck.logger.error(`Update check failed: ${msg}`); + sendStatus?.(`Error: ${msg}`); } } @@ -235,6 +242,11 @@ streamDeck.ui.onSendToPlugin<{ event: string; settings?: TimerSettings }>(async const title = buttonTitle(ev.payload.settings.projectName || ""); if (title) await ev.action.setTitle(title); } + if (ev.payload.event === "checkForUpdates") { + const send = (msg: string) => streamDeck.ui.sendToPropertyInspector({ event: "updateStatus", message: msg }); + send("Checking…"); + await checkForUpdates(send); + } }); streamDeck.connect();