From e7b84fee1fd5837542bd36aa8e72ff6f01fd799c Mon Sep 17 00:00:00 2001 From: Your Name Date: Thu, 27 Jun 2024 12:16:25 +0200 Subject: [PATCH] matomo tracking --- apps/remix-ide/src/app.js | 9 +++- .../app/plugins/permission-handler-plugin.tsx | 2 +- apps/remix-ide/src/app/plugins/remixGuide.tsx | 2 +- .../src/app/plugins/remixGuideData.json | 2 +- apps/remix-ide/src/assets/js/loader.js | 47 ++++++++++++++----- apps/remixdesktop/src/main.ts | 25 +++++++++- apps/remixdesktop/src/preload.ts | 7 ++- apps/remixdesktop/src/utils/matamo.ts | 25 ++++++++-- .../src/lib/components/homeTabFeatured.tsx | 4 +- .../src/lib/permission-dialog.tsx | 4 +- 10 files changed, 99 insertions(+), 28 deletions(-) diff --git a/apps/remix-ide/src/app.js b/apps/remix-ide/src/app.js index 18ec31d8c2..41c8507803 100644 --- a/apps/remix-ide/src/app.js +++ b/apps/remix-ide/src/app.js @@ -165,7 +165,14 @@ class AppComponent { this.matomoConfAlreadySet = Registry.getInstance().get('config').api.exists('settings/matomo-analytics') this.matomoCurrentSetting = Registry.getInstance().get('config').api.get('settings/matomo-analytics') - this.showMatamo = matomoDomains[window.location.hostname] && !this.matomoConfAlreadySet + + let electronTracking = false + + if (window.electronAPI) { + electronTracking = await window.electronAPI.canTrackMatomo() + } + + this.showMatamo = (matomoDomains[window.location.hostname] || electronTracking) && !this.matomoConfAlreadySet this.walkthroughService = new WalkthroughService(appManager) diff --git a/apps/remix-ide/src/app/plugins/permission-handler-plugin.tsx b/apps/remix-ide/src/app/plugins/permission-handler-plugin.tsx index a01425088a..6f242c1c9d 100644 --- a/apps/remix-ide/src/app/plugins/permission-handler-plugin.tsx +++ b/apps/remix-ide/src/app/plugins/permission-handler-plugin.tsx @@ -98,7 +98,7 @@ export class PermissionHandlerPlugin extends Plugin {
{}}>To change the permission go to Plugin Manager - + / Permissions
diff --git a/apps/remix-ide/src/app/plugins/remixGuide.tsx b/apps/remix-ide/src/app/plugins/remixGuide.tsx index 4ef3e8bbb5..2fa94f2466 100644 --- a/apps/remix-ide/src/app/plugins/remixGuide.tsx +++ b/apps/remix-ide/src/app/plugins/remixGuide.tsx @@ -93,7 +93,7 @@ export class RemixGuidePlugin extends ViewPlugin { { + if (!canTrack) { + console.log('Matomo tracking is disabled on Dev mode') + return + } + window._paq = { + push: function (...data) { + if (!window.localStorage.getItem('config-v0.8:.remix.config') || + (window.localStorage.getItem('config-v0.8:.remix.config') && !window.localStorage.getItem('config-v0.8:.remix.config').includes('settings/matomo-analytics'))) { + // require user tracking consent before processing data + } else { + if (JSON.parse(window.localStorage.getItem('config-v0.8:.remix.config'))['settings/matomo-analytics']) { + window.electronAPI.trackEvent(...data) + } + } + } + } + }) +} else { + if (domainToTrack) { + trackDomain(domainToTrack) + } +} function isElectron() { // Renderer process if (typeof window !== 'undefined' && typeof window.process === 'object' && window.process.type === 'renderer') { diff --git a/apps/remixdesktop/src/main.ts b/apps/remixdesktop/src/main.ts index 57a673ef0e..65cd68d61e 100644 --- a/apps/remixdesktop/src/main.ts +++ b/apps/remixdesktop/src/main.ts @@ -1,4 +1,4 @@ -import { app, BrowserWindow, dialog, Menu, MenuItem, shell, utilityProcess, screen } from 'electron'; +import { app, BrowserWindow, dialog, Menu, MenuItem, shell, utilityProcess, screen, ipcMain } from 'electron'; import path from 'path'; @@ -41,6 +41,7 @@ export const createWindow = async (dir?: string): Promise => { frame: true, webPreferences: { preload: path.join(__dirname, 'preload.js') + }, }); mainWindow.webContents.setWindowOpenHandler((details) => { @@ -76,7 +77,7 @@ export const createWindow = async (dir?: string): Promise => { // initialization and is ready to create browser windows. // Some APIs can only be used after this event occurs. app.on('ready', async () => { - trackEvent('App', 'Launch', app.getVersion(), 1); + trackEvent('App', 'Launch', app.getVersion(), 1, 1); trackEvent('App', 'OS', process.platform, 1); require('./engine') }); @@ -145,4 +146,24 @@ if (!isE2E || isE2ELocal) Menu.setApplicationMenu(Menu.buildFromTemplate(menu)) +ipcMain.handle('config:isPackaged', async () => { + return isPackaged +}) + +ipcMain.handle('config:isE2E', async () => { + return isE2E +}) + +ipcMain.handle('config:canTrackMatomo', async (event, name: string) => { + console.log('config:canTrackMatomo', ((process.env.NODE_ENV === 'production' || isPackaged) && !isE2E)) + return ((process.env.NODE_ENV === 'production' || isPackaged) && !isE2E) +}) + +ipcMain.handle('matomo:trackEvent', async (event, data) => { + if (data && data[0] && data[0] === 'trackEvent') { + trackEvent(data[1], data[2], data[3], data[4]) + } +}) + + diff --git a/apps/remixdesktop/src/preload.ts b/apps/remixdesktop/src/preload.ts index c5c8e5a65d..e265dd9c8e 100644 --- a/apps/remixdesktop/src/preload.ts +++ b/apps/remixdesktop/src/preload.ts @@ -15,12 +15,15 @@ ipcRenderer.invoke('getWebContentsID').then((id: number) => { }) contextBridge.exposeInMainWorld('electronAPI', { + isPackaged: () => ipcRenderer.invoke('config:isPackaged'), + isE2E: () => ipcRenderer.invoke('config:isE2E'), + canTrackMatomo: () => ipcRenderer.invoke('config:canTrackMatomo'), + trackEvent: (args: any[]) => ipcRenderer.invoke('matomo:trackEvent', args), + activatePlugin: (name: string) => { return ipcRenderer.invoke('manager:activatePlugin', name) }, - getWindowId: () => ipcRenderer.invoke('getWindowID'), - plugins: exposedPLugins.map(name => { return { name, diff --git a/apps/remixdesktop/src/utils/matamo.ts b/apps/remixdesktop/src/utils/matamo.ts index 3688bab72e..a537e40afb 100644 --- a/apps/remixdesktop/src/utils/matamo.ts +++ b/apps/remixdesktop/src/utils/matamo.ts @@ -1,21 +1,38 @@ -import { isE2E } from "../main"; -import { isPackaged } from "../main"; +import { screen } from 'electron'; +import { isPackaged, isE2E } from "../main"; + var MatomoTracker = require('matomo-tracker'); // Function to send events to Matomo -export function trackEvent(category: string, action: string, name: string, value: string | number): void { +export function trackEvent(category: string, action: string, name: string, value: string | number, new_visit: number = 0): void { var matomo = new MatomoTracker(35, 'http://ethereumfoundation.matomo.cloud/matomo.php'); matomo.on('error', function (err: any) { console.log('error tracking request: ', err); }); + + // Customize the user agent + const electronVersion = process.versions.electron; + const chromiumVersion = process.versions.chrome; + const os = process.platform; // 'darwin', 'win32', 'linux', etc. + const osVersion = process.getSystemVersion(); + + const ua = `Electron/${electronVersion} (Chromium/${chromiumVersion}) ${os} ${osVersion}`; + + + const res = `${screen.getPrimaryDisplay().size.width}x${screen.getPrimaryDisplay().size.height}`; + if ((process.env.NODE_ENV === 'production' || isPackaged) && !isE2E) { + console.log('trackEvent', category, action, name, value, ua, new_visit); matomo.track({ e_c: category, e_a: action, e_n: name, e_v: value, + ua, + new_visit, + res, url: 'https://github.com/remix-project-org/remix-desktop' // You can add other parameters if needed }, (error: any) => { @@ -25,6 +42,8 @@ export function trackEvent(category: string, action: string, name: string, value console.log('Event tracked successfully'); } }); + } else { + console.log('Matomo tracking is disabled'); } } diff --git a/libs/remix-ui/home-tab/src/lib/components/homeTabFeatured.tsx b/libs/remix-ui/home-tab/src/lib/components/homeTabFeatured.tsx index bc5fb49f62..649acb31a9 100644 --- a/libs/remix-ui/home-tab/src/lib/components/homeTabFeatured.tsx +++ b/libs/remix-ui/home-tab/src/lib/components/homeTabFeatured.tsx @@ -85,7 +85,7 @@ function HomeTabFeatured() {
- +
@@ -109,7 +109,7 @@ function HomeTabFeatured() {
- +
diff --git a/libs/remix-ui/permission-handler/src/lib/permission-dialog.tsx b/libs/remix-ui/permission-handler/src/lib/permission-dialog.tsx index 65d75e3f46..794355d744 100644 --- a/libs/remix-ui/permission-handler/src/lib/permission-dialog.tsx +++ b/libs/remix-ui/permission-handler/src/lib/permission-dialog.tsx @@ -19,11 +19,11 @@ const PermissionHandlerDialog = (props: PermissionHandlerProps) => { } const imgFrom = () => { - if (!from.icon || from.icon === '') from.icon = "/assets/img/pluginManager.webp" + if (!from.icon || from.icon === '') from.icon = "assets/img/pluginManager.webp" return } const imgTo = () => { - if (!to.icon || to.icon === '') to.icon = "/assets/img/pluginManager.webp" + if (!to.icon || to.icon === '') to.icon = "assets/img/pluginManager.webp" return } const pluginsImages = () => {