feat(analytics): booster + daily-reward events

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
2026-06-18 12:24:02 +09:00
parent fa4247cd9b
commit d0a2be15ba
4 changed files with 40 additions and 0 deletions
+12
View File
@@ -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});
}
+8
View File
@@ -30,6 +30,14 @@ class DailyRewardNotifier extends Notifier<DailyResolution> {
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();
}
}
+1
View File
@@ -151,6 +151,7 @@ class GameSessionNotifier extends Notifier<GameViewState?> {
}
if (!apply()) return BoosterUseResult.invalidTarget;
await inv.consume(type);
ref.read(analyticsProvider).boosterUsed(type: type.name);
_publish(lastPlacement: null);
return BoosterUseResult.success;
}
+19
View File
@@ -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});
});
}