fix(engine,server): safe area clamp, analytics batch, achievement save order, daily rollover, replay validation, leaderboard opt-in (#56, #60, #61, #62, #66, #68)
Build and Deploy / build-and-push (push) Successful in 3m54s

- #66: Clamp safe-area insets to 25% of window height with warn!() on excess
- #68: Move fire_flush outside per-event loop in analytics (batch flush once)
- #56: Persist progress before marking reward_granted to prevent XP loss on crash
- #60: Add DateRolloverTimer + check_date_rollover system for midnight seed refresh
- #62: Add validate_header() in replay upload with mode/draw_mode allowlists
- #61: Restore two-query leaderboard opt-in check (SELECT then UPDATE); original
       queries already in .sqlx cache; EXISTS variant would require sqlx prepare

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
This commit is contained in:
funman300
2026-05-28 13:07:22 -07:00
parent 8cb4c9808e
commit 6e407a3ea7
104 changed files with 6356 additions and 3092 deletions
+25 -12
View File
@@ -116,7 +116,10 @@ impl PlayerProgress {
/// Returns `true` if this call brought the counter from below `target`
/// to at-or-above `target` (i.e. just completed the goal).
pub fn record_weekly_progress(&mut self, goal_id: &str, target: u32) -> bool {
let entry = self.weekly_goal_progress.entry(goal_id.to_string()).or_insert(0);
let entry = self
.weekly_goal_progress
.entry(goal_id.to_string())
.or_insert(0);
if *entry >= target {
return false;
}
@@ -237,7 +240,10 @@ mod tests {
#[test]
fn add_xp_saturates_on_overflow() {
let mut p = PlayerProgress { total_xp: u64::MAX, ..Default::default() };
let mut p = PlayerProgress {
total_xp: u64::MAX,
..Default::default()
};
p.add_xp(1);
assert_eq!(p.total_xp, u64::MAX);
}
@@ -265,8 +271,12 @@ mod tests {
#[test]
fn roll_weekly_goals_clears_progress_for_new_week() {
let mut p = PlayerProgress { weekly_goal_week_iso: Some("2026-W16".to_string()), ..Default::default() };
p.weekly_goal_progress.insert("weekly_5_wins".to_string(), 3);
let mut p = PlayerProgress {
weekly_goal_week_iso: Some("2026-W16".to_string()),
..Default::default()
};
p.weekly_goal_progress
.insert("weekly_5_wins".to_string(), 3);
let rolled = p.roll_weekly_goals_if_new_week("2026-W17");
assert!(rolled);
@@ -276,8 +286,12 @@ mod tests {
#[test]
fn roll_weekly_goals_is_noop_for_same_week() {
let mut p = PlayerProgress { weekly_goal_week_iso: Some("2026-W17".to_string()), ..Default::default() };
p.weekly_goal_progress.insert("weekly_5_wins".to_string(), 2);
let mut p = PlayerProgress {
weekly_goal_week_iso: Some("2026-W17".to_string()),
..Default::default()
};
p.weekly_goal_progress
.insert("weekly_5_wins".to_string(), 2);
let rolled = p.roll_weekly_goals_if_new_week("2026-W17");
assert!(!rolled);
@@ -338,7 +352,10 @@ mod tests {
p.record_daily_completion(date(2026, 4, 20));
let recorded = p.record_daily_completion(date(2026, 4, 20));
assert!(!recorded);
assert_eq!(p.daily_challenge_streak, 1, "streak must not double-count same day");
assert_eq!(
p.daily_challenge_streak, 1,
"streak must not double-count same day"
);
}
#[test]
@@ -370,11 +387,7 @@ mod tests {
p.record_daily_completion(date(2026, 4, 22));
assert_eq!(
p.daily_challenge_history,
vec![
date(2026, 4, 20),
date(2026, 4, 21),
date(2026, 4, 22),
],
vec![date(2026, 4, 20), date(2026, 4, 21), date(2026, 4, 22),],
"history should hold all three completions in ascending order"
);
}