From d557871fd3ef74b5d869c5e516dc8051a3e77db0 Mon Sep 17 00:00:00 2001 From: Robert Paciorek Date: Sun, 3 Mar 2024 13:54:48 +0000 Subject: [PATCH] rework ProductData and Petz saves - support for separate saves for lands via ClientVersion.GetVersion(apiKey) - add Adventureland apiKey to ClientVersion --- src/Controllers/Common/ContentController.cs | 51 ++++++++++++--------- src/Model/DBContext.cs | 10 ++++ src/Model/SaveData.cs | 8 ++++ src/Model/Viking.cs | 4 +- src/Util/ClientVersion.cs | 4 ++ src/Util/SavedData.cs | 22 +++++++++ 6 files changed, 75 insertions(+), 24 deletions(-) create mode 100644 src/Model/SaveData.cs create mode 100644 src/Util/SavedData.cs diff --git a/src/Controllers/Common/ContentController.cs b/src/Controllers/Common/ContentController.cs index 686d68f..34fe6dd 100644 --- a/src/Controllers/Common/ContentController.cs +++ b/src/Controllers/Common/ContentController.cs @@ -59,16 +59,23 @@ public class ContentController : Controller { //[Produces("application/xml")] [Route("ContentWebService.asmx/GetProduct")] // used by World Of Jumpstart [VikingSession(UseLock=false)] - public string? GetProduct(Viking viking) { - return viking.ProductData; + public string? GetProduct(Viking viking, [FromForm] string apiKey) { + return Util.SavedData.Get( + viking, + ClientVersion.GetVersion(apiKey) + ); } [HttpPost] //[Produces("application/xml")] [Route("ContentWebService.asmx/SetProduct")] // used by World Of Jumpstart [VikingSession] - public bool SetProduct(Viking viking, [FromForm] string contentXml) { - viking.ProductData = contentXml; + public bool SetProduct(Viking viking, [FromForm] string contentXml, [FromForm] string apiKey) { + Util.SavedData.Set( + viking, + ClientVersion.GetVersion(apiKey), + contentXml + ); ctx.SaveChanges(); return true; } @@ -78,30 +85,34 @@ public class ContentController : Controller { [HttpPost] //[Produces("application/xml")] [Route("ContentWebService.asmx/GetCurrentPetByUserID")] // used by World Of Jumpstart - public IActionResult GetCurrentPetByUserID([FromForm] Guid userId, [FromForm] bool isActive) { - string? petData = ctx.Vikings.FirstOrDefault(e => e.Uid == userId)?.PetSerialized; - if (petData is null) - return Ok(XmlUtil.SerializeXml(null)); - - return Ok(petData); + public string GetCurrentPetByUserID([FromForm] Guid userId) { + return GetCurrentPet(ctx.Vikings.FirstOrDefault(e => e.Uid == userId)); } [HttpPost] //[Produces("application/xml")] [Route("ContentWebService.asmx/GetCurrentPet")] // used by World Of Jumpstart - public IActionResult GetCurrentPet(Viking viking, [FromForm] bool isActive) { - if (viking.PetSerialized is null) - return Ok(XmlUtil.SerializeXml(null)); - - return Ok(viking.PetSerialized); + [VikingSession] + public string GetCurrentPet(Viking viking) { + string? ret = Util.SavedData.Get( + viking, + ClientVersion.WoJS + 1 + ); + if (ret is null) + return XmlUtil.SerializeXml(null); + return ret; } [HttpPost] [Produces("application/xml")] [Route("ContentWebService.asmx/SetCurrentPet")] // used by World Of Jumpstart [VikingSession] - public bool SetCurrentPet(Viking viking, [FromForm] string contentXml) { - viking.PetSerialized = contentXml; + public bool SetCurrentPet(Viking viking, [FromForm] string? contentXml) { + Util.SavedData.Set( + viking, + ClientVersion.WoJS + 1, + contentXml + ); ctx.SaveChanges(); return true; } @@ -110,10 +121,8 @@ public class ContentController : Controller { [Produces("application/xml")] [Route("ContentWebService.asmx/DelCurrentPet")] // used by World Of Jumpstart [VikingSession] - public bool DelCurrentPet(Viking viking, [FromForm] bool isActive) { - viking.PetSerialized = null; - ctx.SaveChanges(); - return true; + public bool DelCurrentPet(Viking viking) { + return SetCurrentPet(viking, null); } [HttpPost] diff --git a/src/Model/DBContext.cs b/src/Model/DBContext.cs index 6448fb5..157603b 100644 --- a/src/Model/DBContext.cs +++ b/src/Model/DBContext.cs @@ -112,6 +112,9 @@ public class DBContext : DbContext { builder.Entity().HasMany(v => v.GameData) .WithOne(e => e.Viking); + builder.Entity().HasMany(v => v.SavedData) + .WithOne(e => e.Viking); + builder.Entity().HasMany(v => v.ProfileAnswers) .WithOne(e => e.Viking); @@ -204,6 +207,13 @@ public class DBContext : DbContext { .WithMany(e => e.AchievementPoints) .HasForeignKey(e => e.VikingId); + builder.Entity().HasKey(e => new { e.VikingId, e.SaveId }); + + builder.Entity() + .HasOne(e => e.Viking) + .WithMany(v => v.SavedData) + .HasForeignKey(e => e.VikingId); + builder.Entity().HasOne(i => i.Viking) .WithMany(i => i.ProfileAnswers) .HasForeignKey(e => e.VikingId); diff --git a/src/Model/SaveData.cs b/src/Model/SaveData.cs new file mode 100644 index 0000000..0d411cf --- /dev/null +++ b/src/Model/SaveData.cs @@ -0,0 +1,8 @@ +namespace sodoff.Model; +public class SavedData { + public int VikingId { get; set; } + public uint SaveId { get; set; } + public string? SerializedData { get; set; } + + public virtual Viking Viking { get; set; } = null!; +} diff --git a/src/Model/Viking.cs b/src/Model/Viking.cs index f46eddf..f5f0441 100644 --- a/src/Model/Viking.cs +++ b/src/Model/Viking.cs @@ -32,8 +32,6 @@ public class Viking { public virtual ICollection InventoryItems { get; set; } = null!; public virtual ICollection GameData { get; set; } = null!; public virtual ICollection ProfileAnswers { get; set; } = null!; + public virtual ICollection SavedData { get; set; } = null!; public virtual Dragon? SelectedDragon { get; set; } - - public string? ProductData { get; set; } - public string? PetSerialized { get; set; } } diff --git a/src/Util/ClientVersion.cs b/src/Util/ClientVersion.cs index d28c328..50e2257 100644 --- a/src/Util/ClientVersion.cs +++ b/src/Util/ClientVersion.cs @@ -28,6 +28,10 @@ public class ClientVersion { apiKey == "1552008f-4a95-46f5-80e2-58574da65875" ) { return WoJS; + } else if ( + apiKey == "b4e0f71a-1cda-462a-97b3-0b355e87e0c8" + ) { + return WoJS+10; // WoJS--Adventureland } return 0; } diff --git a/src/Util/SavedData.cs b/src/Util/SavedData.cs new file mode 100644 index 0000000..845e1ab --- /dev/null +++ b/src/Util/SavedData.cs @@ -0,0 +1,22 @@ +using sodoff.Model; + +namespace sodoff.Util; +public class SavedData { + public static string? Get(Viking? viking, uint saveId) { + return viking?.SavedData.FirstOrDefault(s => s.SaveId == saveId)?.SerializedData; + } + + public static void Set(Viking viking, uint saveId, string? contentXml) { + Console.WriteLine($"\n\n{saveId} {contentXml}\n"); + Model.SavedData? savedData = viking.SavedData.FirstOrDefault(s => s.SaveId == saveId); + if (savedData is null) { + savedData = new() { + SaveId = saveId, + SerializedData = contentXml + }; + viking.SavedData.Add(savedData); + } else { + savedData.SerializedData = contentXml; + } + } +}