diff --git a/src/extensions/analytics/analytics/AnalyticsGA4.ts b/src/extensions/analytics/analytics/AnalyticsGA4.ts index aed5aa224..41f6edf01 100644 --- a/src/extensions/analytics/analytics/AnalyticsGA4.ts +++ b/src/extensions/analytics/analytics/AnalyticsGA4.ts @@ -3,6 +3,7 @@ import ua from 'universal-analytics'; import { GA4_BETA_MEASUREMENT_ID, GA4_NEXT_MEASUREMENT_ID, GA4_STABLE_MEASUREMENT_ID } from '../constants'; import ga4mp from '../ga4mp/ga4mp.esm'; +import { activeGameId } from '../../../util/selectors'; class AnalyticsGA4 { public user: string; @@ -132,13 +133,15 @@ class AnalyticsGA4 { * @param value * @returns */ - public trackEvent(action: string, category?: string, label?: string, value?: string | number | boolean) { + public trackEvent(action: string, category?: string, label?: any, value?: any) { if (!this.isUserSet()) return; // if we are activating a game, take the game and update user properties? if(action === "activate") { - this.ga4track.setUserProperty("Game", label); + this.ga4track.setUserProperty("Game", value.gameId); + this.ga4track.setUserProperty("GameVersion", value.gameVersion); + this.ga4track.setUserProperty("GameExtensionVersion", value.extensionId); } // send empty page_view as we don't need it for these events and if we dont, it'll always send a default 'Vortex' @@ -151,7 +154,7 @@ class AnalyticsGA4 { }); } - public setUserProperty(key:string, value: string | number | boolean) { + public setUserProperty(key:string, value: any) { // this is updated remotely the next time an event is sent this.ga4track.setUserProperty(key, value); } diff --git a/src/extensions/analytics/index.ts b/src/extensions/analytics/index.ts index 31508145c..070c72cda 100644 --- a/src/extensions/analytics/index.ts +++ b/src/extensions/analytics/index.ts @@ -146,9 +146,11 @@ function init(context: IExtensionContext): boolean { const gameId = activeGameId(state); let gameVersion = ''; + let extensionVersion = ''; if (gameId) { - gameVersion = await getGame(gameId) - .getInstalledVersion(discoveryByGame(state, gameId)); + const game = getGame(gameId); + extensionVersion = game.version; + gameVersion = await game.getInstalledVersion(discoveryByGame(state, gameId)); } const theme = state.settings.interface['currentTheme']; @@ -185,6 +187,8 @@ function init(context: IExtensionContext): boolean { ["VortexVersion"]: getApplication().version, ["Membership"]: membership, ["Game"]: gameId, + ["GameVersion"]: gameVersion, + ["GameExtensionVersion"]: extensionVersion, ["Theme"]: theme, ["Sandbox"]: state.settings.mods['installerSandbox'] ?? true, ["ModCount"]: modCount, diff --git a/src/extensions/profile_management/index.ts b/src/extensions/profile_management/index.ts index cad4595e1..361ff92f4 100644 --- a/src/extensions/profile_management/index.ts +++ b/src/extensions/profile_management/index.ts @@ -738,9 +738,17 @@ function init(context: IExtensionContext): boolean { }, 'Activate', (instanceIds: string[]) => { const gameId = instanceIds[0]; - context.api.events.emit( - 'analytics-track-event', 'Games', 'Activate' , gameId, - ); + let gameVersion = ''; + let extensionVersion = ''; + if (gameId) { + const game = getGame(gameId); + extensionVersion = game.version; + game.getInstalledVersion(discoveryByGame(context.api.getState(), gameId)).then((value) => { + gameVersion = value; + }); + } + + context.api.events.emit( 'analytics-track-event', 'Games', 'Activate' , gameId, {gameId: gameId, gameVersion: gameVersion, extensionVersion: extensionVersion}); checkOverridden(context.api, gameId) .then(() => {