diff --git a/src/Controllers/Common/ContentController.cs b/src/Controllers/Common/ContentController.cs index bfe965f..c2ba5ba 100644 --- a/src/Controllers/Common/ContentController.cs +++ b/src/Controllers/Common/ContentController.cs @@ -2149,7 +2149,7 @@ public class ContentController : Controller { [Route("ContentWebService.asmx/GetPeriodicGameDataByGame")] // used by Math Blaster and WoJS (probably from 24 hours ago to now) [VikingSession(UseLock = true)] public IActionResult GetPeriodicGameDataByGame(Viking viking, [FromForm] int gameId, bool isMultiplayer, int difficulty, int gameLevel, string key, int count, bool AscendingOrder, int score, bool buddyFilter, string apiKey) { - return Ok(gameDataService.GetGameData(viking, gameId, isMultiplayer, difficulty, gameLevel, key, count, AscendingOrder, buddyFilter, apiKey, DateTime.Now.AddHours(-24), DateTime.Now)); + return Ok(gameDataService.GetDailyGameData(viking, gameId, isMultiplayer, difficulty, gameLevel, key, count, AscendingOrder, buddyFilter, apiKey)); } [HttpPost] diff --git a/src/Model/GameDataPair.cs b/src/Model/GameDataPair.cs index e5d45aa..4b9d9c8 100644 --- a/src/Model/GameDataPair.cs +++ b/src/Model/GameDataPair.cs @@ -10,6 +10,7 @@ public class GameDataPair { public int GameDataId { get; set; } public string Name { get; set; } = null!; public int Value { get; set; } + public int DailyValue { get; set; } [JsonIgnore] public virtual GameData GameData { get; set; } = null!; } diff --git a/src/Services/GameDataService.cs b/src/Services/GameDataService.cs index 8814586..06c2128 100644 --- a/src/Services/GameDataService.cs +++ b/src/Services/GameDataService.cs @@ -31,9 +31,11 @@ public class GameDataService { viking.GameData.Add(gameData); } - gameData.DatePlayed = DateTime.UtcNow; + SavePairs(gameData, xmlDocumentData); + gameData.DatePlayed = DateTime.UtcNow; ctx.SaveChanges(); + return true; } @@ -70,6 +72,33 @@ public class GameDataService { return GetSummaryFromResponse(viking, isMultiplayer, difficulty, gameLevel, key, selectedData); } + + public GameDataSummary GetDailyGameData(Viking viking, int gameId, bool isMultiplayer, int difficulty, int gameLevel, string key, int count, bool AscendingOrder, bool buddyFilter, string apiKey) { + IQueryable query = ctx.GameData + .Where(x => + x.GameId == gameId && x.IsMultiplayer == false && + x.Difficulty == difficulty && x.GameLevel == gameLevel && + x.DatePlayed.Date == DateTime.UtcNow.Date + ).SelectMany(e => e.GameDataPairs).Where(x => x.Name == key); + + // TODO: Buddy filter + + if (AscendingOrder) query = query.OrderBy(e => e.Value); + else query = query.OrderByDescending(e => e.Value); + + List selectedData; + if (ClientVersion.GetVersion(apiKey) <= ClientVersion.Max_OldJS) + // use DisplayName instead of Name + selectedData = query.Select(e => new GameDataResponse( + XmlUtil.DeserializeXml(e.GameData.Viking.AvatarSerialized).DisplayName, e.GameData.Viking.Uid, e.GameData.DatePlayed, false, false, e.DailyValue) + ).Take(count).ToList(); + else + selectedData = query.Select(e => new GameDataResponse( + e.GameData.Viking.Name, e.GameData.Viking.Uid, e.GameData.DatePlayed, false, false, e.DailyValue) + ).Take(count).ToList(); + + return GetSummaryFromResponse(viking, isMultiplayer, difficulty, gameLevel, key, selectedData); + } // ByUser for JumpStart's My Scores public GameDataSummary GetGameDataByUser(Viking viking, int gameId, bool isMultiplayer, int difficulty, int gameLevel, string key, int count, bool AscendingOrder, string apiKey) { @@ -141,12 +170,20 @@ public class GameDataService { private void SavePairs(Model.GameData gameData, string xmlDocumentData) { foreach (var pair in GetGameDataPairs(xmlDocumentData)) { GameDataPair? dbPair = gameData.GameDataPairs.FirstOrDefault(x => x.Name == pair.Name); - if (dbPair == null) + + // If the score type is "time", use newBest <= existing (newest time is smaller than (or the same as) existing time). + // For anything else, use newBest > existing (newest score is larger than existing score). + bool newBest = (dbPair == null) || ((pair.Name == "time") != (dbPair.Value <= pair.Value)); + + if (dbPair == null) { gameData.GameDataPairs.Add(pair); - else if (pair.Name == "time" && dbPair.Value > pair.Value) - dbPair.Value = pair.Value; - else if (pair.Name != "time" && dbPair.Value <= pair.Value) - dbPair.Value = pair.Value; + dbPair = pair; + } else if (newBest) dbPair.Value = pair.Value; + + if ( + newBest || // Surpassed Score (or Unset) + gameData.DatePlayed.Date != DateTime.UtcNow.Date // Another Day + ) dbPair.DailyValue = pair.Value; } }