feat(telemetry): send weekly pings if enabled

This commit is contained in:
dragonwocky 2023-03-19 15:02:47 +11:00
parent 3e379f44e8
commit 5a91e58104
Signed by: dragonwocky
GPG Key ID: 7998D08F7D7BD7A8
5 changed files with 32 additions and 13 deletions

View File

@ -363,11 +363,11 @@ try {
default: default:
printHelp(commands, options); printHelp(commands, options);
} }
} catch (error) { } catch (err) {
stopSpinner(); stopSpinner();
const message = error.message.split("\n")[0]; const message = err.message.split("\n")[0];
if (__debug) { if (__debug) {
print`{bold.red ${error.name}:} ${message}\n{grey ${error.stack print`{bold.red ${err.name}:} ${message}\n{grey ${err.stack
.split("\n") .split("\n")
.splice(1) .splice(1)
.map((at) => at.replace(/\s{4}/g, " ")) .map((at) => at.replace(/\s{4}/g, " "))

View File

@ -1,6 +1,6 @@
{ {
"name": "notion-enhancer", "name": "notion-enhancer",
"version": "0.11.1-dev", "version": "0.11.1",
"author": "dragonwocky <thedragonring.bod@gmail.com> (https://dragonwocky.me/)", "author": "dragonwocky <thedragonring.bod@gmail.com> (https://dragonwocky.me/)",
"description": "an enhancer/customiser for the all-in-one productivity workspace notion.so", "description": "an enhancer/customiser for the all-in-one productivity workspace notion.so",
"homepage": "https://notion-enhancer.github.io", "homepage": "https://notion-enhancer.github.io",

View File

@ -71,7 +71,8 @@ const initDatabase = (namespace, fallbacks = {}) => {
init.run(); init.run();
// schema: // schema:
// - ("agreedToTerms") -> boolean // - ("agreedToTerms") -> string: semver
// - ("lastTelemetryPing") -> string: iso
// - ("telemetryEnabled") -> boolean // - ("telemetryEnabled") -> boolean
// - ("profileIds") -> $profileId[] // - ("profileIds") -> $profileId[]
// - ("activeProfile") -> $profileId // - ("activeProfile") -> $profileId

View File

@ -24,7 +24,7 @@ function Telemetry() {
platform: html`<code></code>`, platform: html`<code></code>`,
version: html`<code></code>`, version: html`<code></code>`,
timezone: html`<code></code>`, timezone: html`<code></code>`,
enabledMods: html`<code></code>`, enabled_mods: html`<code></code>`,
}; };
useState(["rerender"], async () => { useState(["rerender"], async () => {
const telemetryData = await collectTelemetryData(); const telemetryData = await collectTelemetryData();
@ -41,7 +41,7 @@ function Telemetry() {
where the notion-enhancer is used. This data is anonymous and includes where the notion-enhancer is used. This data is anonymous and includes
only your platform (${$.platform}), notion-enhancer version only your platform (${$.platform}), notion-enhancer version
(${$.version}), timezone (${$.timezone}), and enabled mods (${$.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 setting syncs across configuration profiles. For more information, read
the notion-enhancer's the notion-enhancer's
<a href=${privacyPolicy} class="ml-[3px]">privacy policy</a>.`} <a href=${privacyPolicy} class="ml-[3px]">privacy policy</a>.`}

View File

@ -4,24 +4,42 @@
* (https://notion-enhancer.github.io/) under the MIT license * (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, const { platform, version } = globalThis.__enhancerApi,
{ getMods, isEnabled } = globalThis.__enhancerApi, { getMods, isEnabled } = globalThis.__enhancerApi,
timezone = Intl.DateTimeFormat().resolvedOptions().timeZone, timezone = Intl.DateTimeFormat().resolvedOptions().timeZone,
// prettier-ignore // prettier-ignore
enabledMods = (await getMods(async (mod) => { enabled_mods = (await getMods(async (mod) => {
if (mod._src === "core") return false; if (mod._src === "core") return false;
return await isEnabled(mod.id); return await isEnabled(mod.id);
})).map(mod => mod.id); })).map(mod => mod.id);
return { platform, version, timezone, enabledMods }; return { platform, version, timezone, enabled_mods };
}, },
sendTelemetryPing = async () => { sendTelemetryPing = async () => {
const db = globalThis.__enhancerApi.initDatabase(), const db = __enhancerApi.initDatabase(),
{ version } = globalThis.__enhancerApi,
agreedToTerms = await db.get("agreedToTerms"), agreedToTerms = await db.get("agreedToTerms"),
telemetryEnabled = (await db.get("telemetryEnabled")) ?? true; telemetryEnabled = (await db.get("telemetryEnabled")) ?? true;
if (!telemetryEnabled || agreedToTerms !== version) return; 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 }; export { collectTelemetryData, sendTelemetryPing };