diff --git a/lib/services/analytics_service.dart b/lib/services/analytics_service.dart index 5903454..a17d3c8 100644 --- a/lib/services/analytics_service.dart +++ b/lib/services/analytics_service.dart @@ -61,4 +61,16 @@ class AnalyticsService { void tutorialFinished({required bool skipped}) { _backend.logEvent('tutorial_finished', {'skipped': skipped ? 1 : 0}); } + + void boosterUsed({required String type}) => + _backend.logEvent('booster_used', {'type': type}); + + void boosterGranted( + {required String type, required int count, required String source}) => + _backend.logEvent( + 'booster_granted', {'type': type, 'count': count, 'source': source}); + + void dailyRewardClaimed({required int day, required bool doubled}) => + _backend.logEvent( + 'daily_reward_claimed', {'day': day, 'doubled': doubled ? 1 : 0}); } diff --git a/lib/state/daily_reward_notifier.dart b/lib/state/daily_reward_notifier.dart index 9e36afa..3c3fb57 100644 --- a/lib/state/daily_reward_notifier.dart +++ b/lib/state/daily_reward_notifier.dart @@ -30,6 +30,14 @@ class DailyRewardNotifier extends Notifier { await inv.grant(entry.key, entry.value * (doubled ? 2 : 1)); } await _save.recordDailyClaim(_cal.ymd(_now()), r.day); + ref.read(analyticsProvider).dailyRewardClaimed(day: r.day, doubled: doubled); + for (final e in reward.entries) { + ref.read(analyticsProvider).boosterGranted( + type: e.key.name, + count: e.value * (doubled ? 2 : 1), + source: 'daily', + ); + } state = _resolve(); } } diff --git a/lib/state/game_session_notifier.dart b/lib/state/game_session_notifier.dart index cfdbdbe..6fa6745 100644 --- a/lib/state/game_session_notifier.dart +++ b/lib/state/game_session_notifier.dart @@ -151,6 +151,7 @@ class GameSessionNotifier extends Notifier { } if (!apply()) return BoosterUseResult.invalidTarget; await inv.consume(type); + ref.read(analyticsProvider).boosterUsed(type: type.name); _publish(lastPlacement: null); return BoosterUseResult.success; } diff --git a/test/services/analytics_service_test.dart b/test/services/analytics_service_test.dart index 58035bc..84978cf 100644 --- a/test/services/analytics_service_test.dart +++ b/test/services/analytics_service_test.dart @@ -47,4 +47,23 @@ void main() { }); expect(backend.events[3].$2, {'score': 500, 'new_best': 1}); }); + + test('booster + daily events carry their fields', () { + final backend = _RecordingBackend(); + final a = AnalyticsService(backend); + + a.boosterUsed(type: 'hammer'); + a.boosterGranted(type: 'hammer', count: 2, source: 'daily'); + a.dailyRewardClaimed(day: 7, doubled: true); + + expect(backend.events.map((e) => e.$1).toList(), [ + 'booster_used', + 'booster_granted', + 'daily_reward_claimed', + ]); + expect(backend.events[0].$2, {'type': 'hammer'}); + expect(backend.events[1].$2, + {'type': 'hammer', 'count': 2, 'source': 'daily'}); + expect(backend.events[2].$2, {'day': 7, 'doubled': 1}); + }); }