From 1593ffd4d283e123b1bd9906dada85fbcf116a32 Mon Sep 17 00:00:00 2001 From: Noah Stolk <31079637+NoahStolk@users.noreply.github.com> Date: Mon, 22 May 2023 19:58:58 +0200 Subject: [PATCH] Add rank times to history API --- .../Players/GetPlayerHistory.cs | 2 ++ .../Models/Players/PlayerHistory.cs | 2 ++ .../Repositories/PlayerHistoryRepository.cs | 18 ++++++++++++++++++ .../DomainToApi/Main/PlayerConverters.cs | 1 + 4 files changed, 23 insertions(+) diff --git a/src/DevilDaggersInfo.Web.ApiSpec.Main/Players/GetPlayerHistory.cs b/src/DevilDaggersInfo.Web.ApiSpec.Main/Players/GetPlayerHistory.cs index 11fbf7b43..840e05171 100644 --- a/src/DevilDaggersInfo.Web.ApiSpec.Main/Players/GetPlayerHistory.cs +++ b/src/DevilDaggersInfo.Web.ApiSpec.Main/Players/GetPlayerHistory.cs @@ -13,4 +13,6 @@ public record GetPlayerHistory public required List ActivityHistory { get; init; } public required List RankHistory { get; init; } + + public required Dictionary RankTimes { get; init; } } diff --git a/src/DevilDaggersInfo.Web.Server.Domain/Models/Players/PlayerHistory.cs b/src/DevilDaggersInfo.Web.Server.Domain/Models/Players/PlayerHistory.cs index 2bdb6cf92..b19d8e337 100644 --- a/src/DevilDaggersInfo.Web.Server.Domain/Models/Players/PlayerHistory.cs +++ b/src/DevilDaggersInfo.Web.Server.Domain/Models/Players/PlayerHistory.cs @@ -13,4 +13,6 @@ public record PlayerHistory public required List ActivityHistory { get; init; } public required List RankHistory { get; init; } + + public required Dictionary RankTimes { get; init; } } diff --git a/src/DevilDaggersInfo.Web.Server.Domain/Repositories/PlayerHistoryRepository.cs b/src/DevilDaggersInfo.Web.Server.Domain/Repositories/PlayerHistoryRepository.cs index b848563dd..0a782f4cb 100644 --- a/src/DevilDaggersInfo.Web.Server.Domain/Repositories/PlayerHistoryRepository.cs +++ b/src/DevilDaggersInfo.Web.Server.Domain/Repositories/PlayerHistoryRepository.cs @@ -51,12 +51,18 @@ public PlayerHistory GetPlayerHistoryById(int id) DateTime? datePreviousForActivityHistory = null; List activityHistory = new(); + Dictionary rankTimes = new(); + DateTime? datePrevious = null; + foreach (string leaderboardHistoryPath in _fileSystemService.TryGetFiles(DataSubDirectory.LeaderboardHistory).Where(p => p.EndsWith(".bin"))) { LeaderboardHistory leaderboard = _leaderboardHistoryCache.GetLeaderboardHistoryByFilePath(leaderboardHistoryPath); EntryHistory? entry = leaderboard.Entries.Find(e => e.Id == id); if (entry == null) + { + datePrevious = leaderboard.DateTime; continue; + } int illegitimateScoresAbove = leaderboard.Entries.Count(e => e.Rank < entry.Rank && bannedPlayerIds.Contains(e.Id)); int correctedRank = entry.Rank - illegitimateScoresAbove; @@ -103,6 +109,15 @@ public PlayerHistory GetPlayerHistoryById(int id) rankPreviousForRankHistory = correctedRank; } + if (datePrevious.HasValue) + { + // TODO: The TODO at the top of this method needs to be resolved before this can be accurate. + if (rankTimes.ContainsKey(correctedRank)) + rankTimes[correctedRank] += leaderboard.DateTime - datePrevious.Value; + else + rankTimes.Add(correctedRank, leaderboard.DateTime - datePrevious.Value); + } + if (entry.DeathsTotal > 0) { TimeSpan? timeSpan = datePreviousForActivityHistory == null ? null : leaderboard.DateTime - datePreviousForActivityHistory.Value; @@ -118,6 +133,8 @@ public PlayerHistory GetPlayerHistoryById(int id) totalTimeForActivityHistory = entry.TimeTotal; datePreviousForActivityHistory = leaderboard.DateTime; } + + datePrevious = leaderboard.DateTime; } return new() @@ -128,6 +145,7 @@ public PlayerHistory GetPlayerHistoryById(int id) RankHistory = rankHistory, ScoreHistory = scoreHistory, Usernames = usernamesHistory.OrderByDescending(kvp => kvp.Value).Select(kvp => kvp.Key).ToList(), + RankTimes = rankTimes, }; } } diff --git a/src/DevilDaggersInfo.Web.Server/Converters/DomainToApi/Main/PlayerConverters.cs b/src/DevilDaggersInfo.Web.Server/Converters/DomainToApi/Main/PlayerConverters.cs index c0878f553..ec0c65910 100644 --- a/src/DevilDaggersInfo.Web.Server/Converters/DomainToApi/Main/PlayerConverters.cs +++ b/src/DevilDaggersInfo.Web.Server/Converters/DomainToApi/Main/PlayerConverters.cs @@ -94,5 +94,6 @@ public static class PlayerConverters DeathType = sh.DeathType, }), HidePastUsernames = playerHistory.HidePastUsernames, + RankTimes = playerHistory.RankTimes, }; }