From 66bb9f0a8283de08257d61e8d60e5b521afbf533 Mon Sep 17 00:00:00 2001 From: Hipposgrumm Date: Wed, 11 Jun 2025 14:59:42 -0600 Subject: [PATCH] Daily Scoreboard now works correctly. --- src/Controllers/Common/ContentController.cs | 2 +- src/Model/DBContext.cs | 14 +++++ src/Model/DailyHighscore.cs | 15 +++++ src/Model/DailyHighscorePair.cs | 13 +++++ src/Model/Viking.cs | 1 + src/Services/GameDataService.cs | 62 ++++++++++++++++++++- 6 files changed, 104 insertions(+), 3 deletions(-) create mode 100644 src/Model/DailyHighscore.cs create mode 100644 src/Model/DailyHighscorePair.cs diff --git a/src/Controllers/Common/ContentController.cs b/src/Controllers/Common/ContentController.cs index 52dea2b..cb2745f 100644 --- a/src/Controllers/Common/ContentController.cs +++ b/src/Controllers/Common/ContentController.cs @@ -2150,7 +2150,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/DBContext.cs b/src/Model/DBContext.cs index 1832763..ce01bc0 100644 --- a/src/Model/DBContext.cs +++ b/src/Model/DBContext.cs @@ -19,6 +19,8 @@ public class DBContext : DbContext { public DbSet RoomItems { get; set; } = null!; public DbSet GameData { get; set; } = null!; public DbSet GameDataPairs { get; set; } = null!; + public DbSet DailyHighscores { get; set; } = null!; + public DbSet DailyHighscorePairs { get; set; } = null!; public DbSet AchievementPoints { get; set; } = null!; public DbSet ProfileAnswers { get; set; } = null!; public DbSet MMORoles { get; set; } = null!; @@ -129,6 +131,9 @@ public class DBContext : DbContext { builder.Entity().HasMany(v => v.GameData) .WithOne(e => e.Viking); + builder.Entity().HasMany(v => v.DailyHighscores) + .WithOne(e => e.Viking); + builder.Entity().HasMany(v => v.SavedData) .WithOne(e => e.Viking); @@ -222,6 +227,15 @@ public class DBContext : DbContext { builder.Entity().HasOne(e => e.GameData) .WithMany(e => e.GameDataPairs); + builder.Entity().HasOne(e => e.Viking) + .WithMany(e => e.DailyHighscores); + + builder.Entity().HasMany(e => e.ScorePairs) + .WithOne(e => e.DailyScore); + + builder.Entity().HasOne(e => e.DailyScore) + .WithMany(e => e.ScorePairs); + // Others .. builder.Entity().HasOne(s => s.Viking) .WithMany(e => e.Images) diff --git a/src/Model/DailyHighscore.cs b/src/Model/DailyHighscore.cs new file mode 100644 index 0000000..4d89c0f --- /dev/null +++ b/src/Model/DailyHighscore.cs @@ -0,0 +1,15 @@ +using System.ComponentModel.DataAnnotations; + +namespace sodoff.Model; + +public class DailyHighscore { + [Key] + public int Id { get; set; } + public int VikingId { get; set; } + public int GameId { get; set; } + public int Difficulty { get; set; } + public int GameLevel { get; set; } + public bool IsMultiplayer { get; set; } + public virtual ICollection ScorePairs { get; set; } = null!; + public virtual Viking Viking { get; set; } = null!; +} diff --git a/src/Model/DailyHighscorePair.cs b/src/Model/DailyHighscorePair.cs new file mode 100644 index 0000000..6b312f3 --- /dev/null +++ b/src/Model/DailyHighscorePair.cs @@ -0,0 +1,13 @@ +using System.ComponentModel.DataAnnotations; + +namespace sodoff.Model; + +public class DailyHighscorePair { + [Key] + public int Id { get; set; } + public int DailyScoreId { get; set; } + public string Name { get; set; } = null!; + public int Value { get; set; } + public DateTime DatePlayed { get; set; } + public virtual DailyHighscore DailyScore { get; set; } = null!; +} diff --git a/src/Model/Viking.cs b/src/Model/Viking.cs index a787107..cd19e70 100644 --- a/src/Model/Viking.cs +++ b/src/Model/Viking.cs @@ -34,6 +34,7 @@ public class Viking { public virtual ICollection PairData { get; set; } = null!; public virtual ICollection InventoryItems { get; set; } = null!; public virtual ICollection GameData { get; set; } = null!; + public virtual ICollection DailyHighscores { get; set; } = null!; public virtual ICollection ProfileAnswers { get; set; } = null!; public virtual ICollection SavedData { get; set; } = null!; public virtual ICollection Parties { get; set; } = null!; diff --git a/src/Services/GameDataService.cs b/src/Services/GameDataService.cs index 8814586..b76216a 100644 --- a/src/Services/GameDataService.cs +++ b/src/Services/GameDataService.cs @@ -32,8 +32,21 @@ public class GameDataService { } gameData.DatePlayed = DateTime.UtcNow; - SavePairs(gameData, xmlDocumentData); + + DailyHighscore? daily = viking.DailyHighscores.FirstOrDefault(x => x.GameId == gameId && x.IsMultiplayer == isMultiplayer && x.Difficulty == difficulty && x.GameLevel == gameLevel); + if (daily == null) { + daily = new DailyHighscore { + GameId = gameId, + Difficulty = difficulty, + GameLevel = gameLevel, + IsMultiplayer = isMultiplayer, + ScorePairs = new List() + }; + viking.DailyHighscores.Add(daily); + } + SavePairs(gameData, daily, xmlDocumentData); ctx.SaveChanges(); + return true; } @@ -70,6 +83,30 @@ 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.DailyHighscores + .Where(x => x.GameId == gameId && x.IsMultiplayer == false && x.Difficulty == difficulty && x.GameLevel == gameLevel) + .SelectMany(e => e.ScorePairs).Where(x => x.DatePlayed == DateTime.Today && 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.DailyScore.Viking.AvatarSerialized).DisplayName, e.DailyScore.Viking.Uid, e.DatePlayed, false, false, e.Value) + ).Take(count).ToList(); + else + selectedData = query.Select(e => new GameDataResponse( + e.DailyScore.Viking.Name, e.DailyScore.Viking.Uid, e.DatePlayed, false, false, e.Value) + ).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) { @@ -138,7 +175,7 @@ public class GameDataService { return gameData; } - private void SavePairs(Model.GameData gameData, string xmlDocumentData) { + private void SavePairs(Model.GameData gameData, DailyHighscore daily, string xmlDocumentData) { foreach (var pair in GetGameDataPairs(xmlDocumentData)) { GameDataPair? dbPair = gameData.GameDataPairs.FirstOrDefault(x => x.Name == pair.Name); if (dbPair == null) @@ -147,6 +184,27 @@ public class GameDataService { dbPair.Value = pair.Value; else if (pair.Name != "time" && dbPair.Value <= pair.Value) dbPair.Value = pair.Value; + + DailyHighscorePair? dailyPair = daily.ScorePairs.FirstOrDefault(x => x.Name == pair.Name); + if (dailyPair == null) { + daily.Difficulty = gameData.Difficulty; + daily.GameLevel = gameData.GameLevel; + dailyPair = new DailyHighscorePair { + Name = pair.Name, + Value = pair.Value, + DatePlayed = DateTime.Today + }; + daily.ScorePairs.Add(dailyPair); + } else if ( + (pair.Name == "time" && dailyPair.Value > pair.Value) || // Better Time + (pair.Name != "time" && dailyPair.Value <= pair.Value) || // Better Score + dailyPair.DatePlayed != DateTime.Today // Another Day + ) { + daily.Difficulty = gameData.Difficulty; + daily.GameLevel = gameData.GameLevel; + dailyPair.DatePlayed = DateTime.Today; + dailyPair.Value = pair.Value; + } } }