From cd4a5a14ef459c345b140acdb055b3c05d2b604a Mon Sep 17 00:00:00 2001 From: Freddie Date: Sat, 4 Jul 2026 20:29:12 -0700 Subject: [PATCH] Merge character achievements into account achievements instead of overwriting --- .../Jobs/Character/CharacterAchievementsJob.cs | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) diff --git a/apps/backend/Jobs/Character/CharacterAchievementsJob.cs b/apps/backend/Jobs/Character/CharacterAchievementsJob.cs index 414006e36..05fac4f7d 100644 --- a/apps/backend/Jobs/Character/CharacterAchievementsJob.cs +++ b/apps/backend/Jobs/Character/CharacterAchievementsJob.cs @@ -95,12 +95,24 @@ public override async Task Run(string[] data) // Parse API data var cheevs = new Dictionary(); var criteria = new Dictionary(); + + if (paAchievements.CompressedAchievementIds != null) + { + var currentAchievements = SerializationUtilities.DeserializeFromBitmap(paAchievements.CompressedAchievementIds); + for (int i = 0; i < currentAchievements.Count; i++) + { + cheevs[currentAchievements[i]] = paAchievements.AchievementTimestamps[i]; + } + } + foreach (var dataAchievement in resultData.Achievements.EmptyIfNull()) { if (dataAchievement.CompletedTimestamp.HasValue) { // Blizzard provides timestamps with 000 milliseconds for some reason - cheevs[dataAchievement.Id] = (int)(dataAchievement.CompletedTimestamp / 1000); + int newTimestamp = (int)(dataAchievement.CompletedTimestamp / 1000); + // Only use this value if it's new or earlier than the existing + cheevs[dataAchievement.Id] = Math.Min(cheevs.GetValueOrDefault(dataAchievement.Id, int.MaxValue), newTimestamp); } if (dataAchievement.Criteria != null)