From 385449c1e7e971e4d6552d59778e32259f4cc61b Mon Sep 17 00:00:00 2001 From: Spirtix Date: Sun, 26 Nov 2023 16:01:39 +0100 Subject: [PATCH] highscore fixes --- mitm-redirect.py | 1 + src/Controllers/Common/ContentController.cs | 7 +-- src/Schema/GetGameDataRequest.cs | 48 +++++++++++++++++++++ src/Schema/GetGameDataResponse.cs | 5 ++- src/Services/GameDataService.cs | 33 +++++++++++++- 5 files changed, 88 insertions(+), 6 deletions(-) create mode 100644 src/Schema/GetGameDataRequest.cs diff --git a/mitm-redirect.py b/mitm-redirect.py index 7f23d73..86661cf 100644 --- a/mitm-redirect.py +++ b/mitm-redirect.py @@ -82,6 +82,7 @@ methods = [ 'ApplyPayout', 'RedeemMysteryBoxItems', 'SendRawGameData', + 'GetGameData', 'GetGameDataByGame', 'GetGameDataByGameForDateRange', 'GetTopAchievementPointUsers', diff --git a/src/Controllers/Common/ContentController.cs b/src/Controllers/Common/ContentController.cs index 15aaa61..eb66216 100644 --- a/src/Controllers/Common/ContentController.cs +++ b/src/Controllers/Common/ContentController.cs @@ -949,9 +949,10 @@ public class ContentController : Controller { [HttpPost] [Produces("application/xml")] [Route("V2/ContentWebService.asmx/GetGameData")] - public IActionResult GetGameData() { - // TODO: This is a placeholder - return Ok(new GetGameDataResponse()); + [VikingSession] + public IActionResult GetGameData(Viking viking, [FromForm] string gameDataRequest) { + GetGameDataRequest request = XmlUtil.DeserializeXml(gameDataRequest); + return Ok(gameDataService.GetGameDataForPlayer(viking, request)); } [HttpPost] diff --git a/src/Schema/GetGameDataRequest.cs b/src/Schema/GetGameDataRequest.cs new file mode 100644 index 0000000..81501b6 --- /dev/null +++ b/src/Schema/GetGameDataRequest.cs @@ -0,0 +1,48 @@ +using System.Xml.Serialization; + +namespace sodoff.Schema; +[XmlRoot(ElementName = "GetGameDataRequest", Namespace = "")] +[Serializable] +public class GetGameDataRequest { + [XmlElement(ElementName = "ProductGroupID")] + public int? ProductGroupID { get; set; } + + [XmlElement(ElementName = "UserID")] + public Guid? UserID { get; set; } + + [XmlElement(ElementName = "GameID")] + public int? GameID { get; set; } + + [XmlElement(ElementName = "GameLevelID")] + public int? GameLevelID { get; set; } + + [XmlElement(ElementName = "DifficultlyID")] + public int? DifficultlyID { get; set; } + + [XmlElement(ElementName = "IsMultiplayer")] + public bool? IsMultiplayer { get; set; } + + [XmlElement(ElementName = "TopScoresOnly")] + public bool? TopScoresOnly { get; set; } + + [XmlElement(ElementName = "AllProductGroups")] + public bool? AllProductGroups { get; set; } + + [XmlElement(ElementName = "AllUsers")] + public bool? AllUsers { get; set; } + + [XmlElement(ElementName = "KEY")] + public string Key { get; set; } + + [XmlElement(ElementName = "CNT")] + public int? Count { get; set; } + + [XmlElement(ElementName = "SC")] + public int? Score { get; set; } + + [XmlElement(ElementName = "AO")] + public bool? AscendingOrder { get; set; } + + [XmlElement(ElementName = "FBIDS")] + public List FacebookUserIDs { get; set; } +} diff --git a/src/Schema/GetGameDataResponse.cs b/src/Schema/GetGameDataResponse.cs index bb26050..4c05ea8 100644 --- a/src/Schema/GetGameDataResponse.cs +++ b/src/Schema/GetGameDataResponse.cs @@ -4,6 +4,7 @@ namespace sodoff.Schema; [XmlRoot(ElementName = "GetGameDataResponse", Namespace = "")] [Serializable] -public class GetGameDataResponse -{ +public class GetGameDataResponse { + [XmlElement(ElementName = "GameDataSummaryList")] + public List GameDataSummaryList { get; set; } = new List(); } diff --git a/src/Services/GameDataService.cs b/src/Services/GameDataService.cs index c4c396a..834f64f 100644 --- a/src/Services/GameDataService.cs +++ b/src/Services/GameDataService.cs @@ -55,6 +55,37 @@ public class GameDataService { return GetSummaryFromResponse(viking, isMultiplayer, difficulty, gameLevel, key, selectedData); } + public GetGameDataResponse GetGameDataForPlayer(Viking viking, GetGameDataRequest request) { + GetGameDataResponse response = new(); + if (request.GameID is null) + return response; + + var dbData = viking.GameData.Where(x => x.GameId == request.GameID) + .SelectMany(e => e.GameDataPairs) + .Select(x => new { x.Name, x.Value, x.GameData.DatePlayed, x.GameData.Win, x.GameData.Loss, x.GameData.IsMultiplayer, x.GameData.Difficulty, x.GameData.GameLevel }); + foreach (var data in dbData) { + response.GameDataSummaryList.Add(new GameDataSummary { + GameID = (int)request.GameID, + IsMultiplayer = data.IsMultiplayer, + Difficulty = data.Difficulty, + GameLevel = data.GameLevel, + Key = data.Name, + GameDataList = new Schema.GameData[] { + new Schema.GameData { + IsMember = true, + Value = data.Value, + DatePlayed = data.DatePlayed, + Win = data.Win ? 1 : 0, + Loss = data.Loss ? 1 : 0, + UserID = viking.Uid + } + } + }); + } + + return response; + } + private GameDataSummary GetSummaryFromResponse(Viking viking, bool isMultiplayer, int difficulty, int gameLevel, string key, List selectedData) { GameDataSummary gameData = new(); gameData.IsMultiplayer = isMultiplayer; @@ -87,7 +118,7 @@ public class GameDataService { GameDataPair? dbPair = gameData.GameDataPairs.FirstOrDefault(x => x.Name == pair.Name); if (dbPair == null) gameData.GameDataPairs.Add(pair); - else + else if (dbPair.Value <= pair.Value) dbPair.Value = pair.Value; } }