import { gameanalytics } from 'gameanalytics'; import { AnalyticsTransport } from './AnalyticsTransport'; // gameanalytics' type declarations don't expose these enums even though they exist at runtime, // so they're mirrored here from the SDK's public values (see GameAnalytics.d.ts EGA* enums). const EGAErrorSeverity = { Error: 4 } as const; const EGAProgressionStatus = { Start: 1, Complete: 2, Fail: 3 } as const; const EGAResourceFlowType = { Source: 1, Sink: 2 } as const; export class GameAnalyticsTransport extends AnalyticsTransport { private readonly gameKey: string; private readonly gameSecret: string; constructor(gameKey: string, gameSecret: string) { super(); this.gameKey = gameKey; this.gameSecret = gameSecret; } init(data: { version: string, resourceTypes: string[], resourceCurrencies: string[], }) { if (import.meta.env.DEV) { gameanalytics.GameAnalytics.setEnabledInfoLog(true); gameanalytics.GameAnalytics.setEnabledEventSubmission(true); } gameanalytics.GameAnalytics.configureBuild(data.version); gameanalytics.GameAnalytics.configureAvailableResourceCurrencies(data.resourceCurrencies); gameanalytics.GameAnalytics.configureAvailableResourceItemTypes(data.resourceTypes); // gameanalytics.GameAnalytics.configureAvailableCustomDimensions01(["easy", "normal", "hard"]); gameanalytics.GameAnalytics.initialize(this.gameKey, this.gameSecret); } ui(data: { event: string, value?: number, [x: string]: unknown }): void { this.event({ ...data, event: 'UI:' + data.event }); } progress(data: { world: string | number, level: string | number, sublevel?: string | number, kind: 'start' | 'complete' | 'fail', score?: number, [x: string]: unknown }): void { const { kind, world, level, sublevel, score, ...params } = data; gameanalytics.GameAnalytics.addProgressionEvent( kind === 'start' ? EGAProgressionStatus.Start : (kind === 'complete' ? EGAProgressionStatus.Complete : EGAProgressionStatus.Fail), '' + world, '' + level, '' + sublevel, score, params, ) } transaction(data: { resourceType: string, resourceId: string, amount: number, action: 'gain' | 'spend', withCurrency: string, [x: string]: unknown }): void { const { resourceType, resourceId, amount, action, withCurrency, ...params } = data; gameanalytics.GameAnalytics.addResourceEvent( action === 'gain' ? EGAResourceFlowType.Source : EGAResourceFlowType.Sink, withCurrency, amount, resourceType, resourceId, params, ) } event(data: { event: string, value?: number, [x: string]: unknown }): void { const { event, value, ...params } = data; gameanalytics.GameAnalytics.addDesignEvent('UI:' + event, value, params); } error(data: { severity: 'error', message: string, [x: string]: unknown }): void { const { severity, message, ...params } = data; gameanalytics.GameAnalytics.addErrorEvent(EGAErrorSeverity.Error, message.slice(0, 8192), params); } }