feat(analytics): booster + daily-reward events
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
@@ -61,4 +61,16 @@ class AnalyticsService {
|
|||||||
void tutorialFinished({required bool skipped}) {
|
void tutorialFinished({required bool skipped}) {
|
||||||
_backend.logEvent('tutorial_finished', {'skipped': skipped ? 1 : 0});
|
_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});
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -30,6 +30,14 @@ class DailyRewardNotifier extends Notifier<DailyResolution> {
|
|||||||
await inv.grant(entry.key, entry.value * (doubled ? 2 : 1));
|
await inv.grant(entry.key, entry.value * (doubled ? 2 : 1));
|
||||||
}
|
}
|
||||||
await _save.recordDailyClaim(_cal.ymd(_now()), r.day);
|
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();
|
state = _resolve();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -151,6 +151,7 @@ class GameSessionNotifier extends Notifier<GameViewState?> {
|
|||||||
}
|
}
|
||||||
if (!apply()) return BoosterUseResult.invalidTarget;
|
if (!apply()) return BoosterUseResult.invalidTarget;
|
||||||
await inv.consume(type);
|
await inv.consume(type);
|
||||||
|
ref.read(analyticsProvider).boosterUsed(type: type.name);
|
||||||
_publish(lastPlacement: null);
|
_publish(lastPlacement: null);
|
||||||
return BoosterUseResult.success;
|
return BoosterUseResult.success;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -47,4 +47,23 @@ void main() {
|
|||||||
});
|
});
|
||||||
expect(backend.events[3].$2, {'score': 500, 'new_best': 1});
|
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});
|
||||||
|
});
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user