From 5a91e58104ce83981458607e44dd04c5504aa2da Mon Sep 17 00:00:00 2001 From: dragonwocky Date: Sun, 19 Mar 2023 15:02:47 +1100 Subject: [PATCH] feat(telemetry): send weekly pings if enabled --- bin.mjs | 6 +++--- package.json | 2 +- src/api/electron.cjs | 3 ++- src/core/menu/islands/Telemetry.mjs | 4 ++-- src/core/telemetry.mjs | 30 +++++++++++++++++++++++------ 5 files changed, 32 insertions(+), 13 deletions(-) diff --git a/bin.mjs b/bin.mjs index d2d3981..67c5305 100755 --- a/bin.mjs +++ b/bin.mjs @@ -363,11 +363,11 @@ try { default: printHelp(commands, options); } -} catch (error) { +} catch (err) { stopSpinner(); - const message = error.message.split("\n")[0]; + const message = err.message.split("\n")[0]; if (__debug) { - print`{bold.red ${error.name}:} ${message}\n{grey ${error.stack + print`{bold.red ${err.name}:} ${message}\n{grey ${err.stack .split("\n") .splice(1) .map((at) => at.replace(/\s{4}/g, " ")) diff --git a/package.json b/package.json index 4d9eb85..39473e2 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "notion-enhancer", - "version": "0.11.1-dev", + "version": "0.11.1", "author": "dragonwocky (https://dragonwocky.me/)", "description": "an enhancer/customiser for the all-in-one productivity workspace notion.so", "homepage": "https://notion-enhancer.github.io", diff --git a/src/api/electron.cjs b/src/api/electron.cjs index 722ab34..17d828a 100644 --- a/src/api/electron.cjs +++ b/src/api/electron.cjs @@ -71,7 +71,8 @@ const initDatabase = (namespace, fallbacks = {}) => { init.run(); // schema: - // - ("agreedToTerms") -> boolean + // - ("agreedToTerms") -> string: semver + // - ("lastTelemetryPing") -> string: iso // - ("telemetryEnabled") -> boolean // - ("profileIds") -> $profileId[] // - ("activeProfile") -> $profileId diff --git a/src/core/menu/islands/Telemetry.mjs b/src/core/menu/islands/Telemetry.mjs index 765bf8d..df4b61f 100644 --- a/src/core/menu/islands/Telemetry.mjs +++ b/src/core/menu/islands/Telemetry.mjs @@ -24,7 +24,7 @@ function Telemetry() { platform: html``, version: html``, timezone: html``, - enabledMods: html``, + enabled_mods: html``, }; useState(["rerender"], async () => { const telemetryData = await collectTelemetryData(); @@ -41,7 +41,7 @@ function Telemetry() { where the notion-enhancer is used. This data is anonymous and includes only your platform (${$.platform}), notion-enhancer version (${$.version}), timezone (${$.timezone}), and enabled mods - (${$.enabledMods}). You can opt in or out of telemetry at any time. This + (${$.enabled_mods}). You can opt in or out of telemetry at any time. This setting syncs across configuration profiles. For more information, read the notion-enhancer's privacy policy.`} diff --git a/src/core/telemetry.mjs b/src/core/telemetry.mjs index 3125148..1f533ae 100644 --- a/src/core/telemetry.mjs +++ b/src/core/telemetry.mjs @@ -4,24 +4,42 @@ * (https://notion-enhancer.github.io/) under the MIT license */ -const collectTelemetryData = async () => { +const pingEndpoint = "https://notion-enhancer.deno.dev/api/ping", + collectTelemetryData = async () => { const { platform, version } = globalThis.__enhancerApi, { getMods, isEnabled } = globalThis.__enhancerApi, timezone = Intl.DateTimeFormat().resolvedOptions().timeZone, // prettier-ignore - enabledMods = (await getMods(async (mod) => { + enabled_mods = (await getMods(async (mod) => { if (mod._src === "core") return false; return await isEnabled(mod.id); })).map(mod => mod.id); - return { platform, version, timezone, enabledMods }; + return { platform, version, timezone, enabled_mods }; }, sendTelemetryPing = async () => { - const db = globalThis.__enhancerApi.initDatabase(), + const db = __enhancerApi.initDatabase(), + { version } = globalThis.__enhancerApi, agreedToTerms = await db.get("agreedToTerms"), telemetryEnabled = (await db.get("telemetryEnabled")) ?? true; if (!telemetryEnabled || agreedToTerms !== version) return; - // telemetry - const telemetryData = await collectTelemetryData(); + + const lastTelemetryPing = await db.get("lastTelemetryPing"); + if (lastTelemetryPing) { + const msSincePing = Date.now() - new Date(lastTelemetryPing); + // send ping only once a week + if (msSincePing / 8.64e7 < 7) return; + } + + try { + const telemetryData = await collectTelemetryData(), + pingTimestamp = await fetch(pingEndpoint, { + method: "POST", + body: JSON.stringify(telemetryData), + }).then((res) => res.text()); + await db.set("lastTelemetryPing", pingTimestamp); + } catch (err) { + console.error(err); + } }; export { collectTelemetryData, sendTelemetryPing };