diff --git a/TOOHUCardAPI/Controllers/PlayerDataController.cs b/TOOHUCardAPI/Controllers/PlayerDataController.cs index 9b2bac4..ac60f30 100644 --- a/TOOHUCardAPI/Controllers/PlayerDataController.cs +++ b/TOOHUCardAPI/Controllers/PlayerDataController.cs @@ -114,7 +114,11 @@ namespace TOOHUCardAPI.Controllers private async Task Get(string body) { PlayerDataGetRequestObject requestObject = JsonConvert.DeserializeObject(body); - IEnumerable users = await Task.WhenAll(requestObject.Ids.Values.Select(val => _userService.LoginUser(val))); + IEnumerable users = new List(); + foreach (var val in requestObject.Ids.Values) + { + users = users.Append(await _userService.LoginUser(val)); // threading errors + } IEnumerable queriedUserSteamIds = requestObject.Ids.Select(i => i.Value); IEnumerable responsePlayers = users .Where(user => queriedUserSteamIds.Contains(user.SteamId)) diff --git a/TOOHUCardAPI/DTO/PlayerData/PlayerDataGetResponseObject.cs b/TOOHUCardAPI/DTO/PlayerData/PlayerDataGetResponseObject.cs index 072cd0b..4b6a02c 100644 --- a/TOOHUCardAPI/DTO/PlayerData/PlayerDataGetResponseObject.cs +++ b/TOOHUCardAPI/DTO/PlayerData/PlayerDataGetResponseObject.cs @@ -37,6 +37,7 @@ namespace TOOHUCardAPI.DTO.PlayerData [JsonProperty("power_max_total")] public int PowerMaxTotal { get; set; } [JsonProperty("pet_model")] public string PetModel { get; set; } [JsonProperty("pet_effect")] public string PetEffect { get; set; } + public Dictionary EncodedCardGroups { get; set; } public Dictionary ToDynamicProperties() { @@ -52,6 +53,9 @@ namespace TOOHUCardAPI.DTO.PlayerData PlayerDataGetResponseObjectPlayer responseObject = mapper.Map(user); responseObject.IsFirstWin = user.LastFirstWin.AddDays(1) < DateTime.Now ? 1 : 0; responseObject.LevelList = user.CardLevels.EncodeLevelList(); + responseObject.EncodedCardGroups = user.EncodedCardGroups + .Select(ecg => KeyValuePair.Create(ecg.GroupKey, ecg.EncodedString)) + .ToDictionary(kv => kv.Key, kv => kv.Value); return responseObject; } } diff --git a/TOOHUCardAPI/DTO/RankData/RankCardDTO.cs b/TOOHUCardAPI/DTO/RankData/RankCardDTO.cs new file mode 100644 index 0000000..92e7e03 --- /dev/null +++ b/TOOHUCardAPI/DTO/RankData/RankCardDTO.cs @@ -0,0 +1,14 @@ +using System.Collections.Generic; + +namespace TOOHUCardAPI.DTO.RankData +{ + public class RankCardDTO + { + public string ItemName { get; set; } + public int Star { get; set; } + public long Damage { get; set; } + public int Power { get; set; } + public int Attack { get; set; } + public Dictionary Equip { get; set; } + } +} \ No newline at end of file diff --git a/TOOHUCardAPI/DTO/RankData/RankDataGetResponse.cs b/TOOHUCardAPI/DTO/RankData/RankDataGetResponse.cs index 303ecee..3012faa 100644 --- a/TOOHUCardAPI/DTO/RankData/RankDataGetResponse.cs +++ b/TOOHUCardAPI/DTO/RankData/RankDataGetResponse.cs @@ -1,7 +1,18 @@ +using System.Collections.Generic; +using Newtonsoft.Json; + namespace TOOHUCardAPI.DTO.RankData { public class RankDataGetResponse : OkResponse { - + [JsonProperty("bo")] + public RankDataGetResponseBody Body { get; set; } + } + + public class RankDataGetResponseBody + { + [JsonProperty()] + public Dictionary FFAEntries { get; set; } + public Dictionary TeamEntries { get; set; } } } \ No newline at end of file diff --git a/TOOHUCardAPI/DTO/RankData/RankEntryDTO.cs b/TOOHUCardAPI/DTO/RankData/RankEntryDTO.cs new file mode 100644 index 0000000..c34ed72 --- /dev/null +++ b/TOOHUCardAPI/DTO/RankData/RankEntryDTO.cs @@ -0,0 +1,17 @@ +using System.Collections.Generic; + +namespace TOOHUCardAPI.DTO.RankData +{ + public class RankEntryDTO + { + public string RankType { get; set; } + public long SteamId { get; set; } + public long UserId { get; set; } + public string Username { get; set; } + public string Version { get; set; } + public int Wave { get; set; } + public long Damage { get; set; } + // need cards here + public List Cards { get; set; } + } +} \ No newline at end of file diff --git a/TOOHUCardAPI/Data/JsonConverters/PlayerDataGetResponseObjectPlayerConverter.cs b/TOOHUCardAPI/Data/JsonConverters/PlayerDataGetResponseObjectPlayerConverter.cs new file mode 100644 index 0000000..06ead5b --- /dev/null +++ b/TOOHUCardAPI/Data/JsonConverters/PlayerDataGetResponseObjectPlayerConverter.cs @@ -0,0 +1,36 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using Newtonsoft.Json; +using Newtonsoft.Json.Linq; +using TOOHUCardAPI.DTO.PlayerData; + +namespace TOOHUCardAPI.Data.JsonConverters +{ + public class PlayerDataGetResponseObjectPlayerConverter : JsonConverter + { + public override void WriteJson(JsonWriter writer, PlayerDataGetResponseObjectPlayer value, JsonSerializer serializer) + { + var encodedCardGroups = value.EncodedCardGroups; + value.EncodedCardGroups = null; + JObject jo = JObject.FromObject(value); + foreach (var (key, s) in encodedCardGroups) + { + jo[key] = s; + } + jo.WriteTo(writer); + } + + public override PlayerDataGetResponseObjectPlayer ReadJson(JsonReader reader, Type objectType, + PlayerDataGetResponseObjectPlayer existingValue, bool hasExistingValue, JsonSerializer serializer) + { + JObject jo = JObject.Load(reader); + PlayerDataGetResponseObjectPlayer playerObject = existingValue ?? new PlayerDataGetResponseObjectPlayer(); + serializer.Populate(reader, playerObject); + playerObject.EncodedCardGroups = jo.Properties().Where(prop => prop.Name.Contains("cardgroup")) + .Select(prop => KeyValuePair.Create(prop.Name, prop.Value.ToObject())) + .ToDictionary(kv => kv.Key, kv => kv.Value); + return playerObject; + } + } +} \ No newline at end of file diff --git a/TOOHUCardAPI/Data/JsonConverters/RankEntryDTOConverter.cs b/TOOHUCardAPI/Data/JsonConverters/RankEntryDTOConverter.cs new file mode 100644 index 0000000..59bdba2 --- /dev/null +++ b/TOOHUCardAPI/Data/JsonConverters/RankEntryDTOConverter.cs @@ -0,0 +1,36 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using Newtonsoft.Json; +using Newtonsoft.Json.Linq; +using TOOHUCardAPI.DTO.RankData; + +namespace TOOHUCardAPI.Data.JsonConverters +{ + public class RankEntryDTOConverter : JsonConverter + { + public override void WriteJson(JsonWriter writer, RankEntryDTO value, JsonSerializer serializer) + { + List cards = value.Cards; + value.Cards = null; + JObject jo = JObject.FromObject(value); + for (int i = 0; i < cards.Count; i++) + { + jo[$"card{i}"] = JObject.FromObject(cards[i]); + + } + jo.WriteTo(writer); + } + + public override RankEntryDTO ReadJson(JsonReader reader, Type objectType, RankEntryDTO existingValue, bool hasExistingValue, + JsonSerializer serializer) + { + JObject jo = JObject.Load(reader); + RankEntryDTO dto = new RankEntryDTO(); + serializer.Populate(reader, dto); + dto.Cards = jo.Properties().Where(prop => prop.Name.Contains("card")) + .Select(i => i.Value.ToObject()).ToList(); + return dto; + } + } +} \ No newline at end of file diff --git a/TOOHUCardAPI/Startup.cs b/TOOHUCardAPI/Startup.cs index 4bb3595..fec629b 100644 --- a/TOOHUCardAPI/Startup.cs +++ b/TOOHUCardAPI/Startup.cs @@ -12,8 +12,10 @@ using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Hosting; using Microsoft.Extensions.Logging; using Microsoft.OpenApi.Models; +using Newtonsoft.Json; using NLog.Extensions.Logging; using TOOHUCardAPI.Data; +using TOOHUCardAPI.Data.JsonConverters; using TOOHUCardAPI.Data.Repositories; using TOOHUCardAPI.Data.Services; @@ -32,7 +34,14 @@ namespace TOOHUCardAPI // This method gets called by the runtime. Use this method to add services to the container. public void ConfigureServices(IServiceCollection services) { - services.AddControllers().AddNewtonsoftJson(); + services.AddControllers().AddNewtonsoftJson(opt => + { + opt.SerializerSettings.Converters = new List + { + new RankEntryDTOConverter(), + new PlayerDataGetResponseObjectPlayerConverter() + }; + }); services.AddDbContext(opt => { opt.UseNpgsql(Configuration.GetConnectionString("postgres"));