This commit is contained in:
azykov@mail.ru
2026-09-09 11:49:24 +03:00
parent bd9b5d9aec
commit a3f2f4eeef
20 changed files with 490 additions and 70 deletions
+74
View File
@@ -0,0 +1,74 @@
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);
}
}