diff --git a/WotBlitzStatisticsPro.Blazor/Generated/DependencyInjection/WotBlitzStatisticsProClientServiceCollectionExtensions.WotBlitzStatisticsProClient.StrawberryShake.cs b/WotBlitzStatisticsPro.Blazor/Generated/DependencyInjection/WotBlitzStatisticsProClientServiceCollectionExtensions.WotBlitzStatisticsProClient.StrawberryShake.cs index 0bc7af6..a9e6d07 100644 --- a/WotBlitzStatisticsPro.Blazor/Generated/DependencyInjection/WotBlitzStatisticsProClientServiceCollectionExtensions.WotBlitzStatisticsProClient.StrawberryShake.cs +++ b/WotBlitzStatisticsPro.Blazor/Generated/DependencyInjection/WotBlitzStatisticsProClientServiceCollectionExtensions.WotBlitzStatisticsProClient.StrawberryShake.cs @@ -15,9 +15,9 @@ namespace Microsoft.Extensions.DependencyInjection return new ClientServiceProvider(global::Microsoft.Extensions.DependencyInjection.ServiceCollectionContainerBuilderExtensions.BuildServiceProvider(serviceCollection)); }); global::Microsoft.Extensions.DependencyInjection.ServiceCollectionServiceExtensions.AddSingleton(services, sp => new global::WotBlitzStatisticsPro.Blazor.GraphQl.State.WotBlitzStatisticsProClientStoreAccessor(global::Microsoft.Extensions.DependencyInjection.ServiceProviderServiceExtensions.GetRequiredService(global::Microsoft.Extensions.DependencyInjection.ServiceProviderServiceExtensions.GetRequiredService(sp)), global::Microsoft.Extensions.DependencyInjection.ServiceProviderServiceExtensions.GetRequiredService(global::Microsoft.Extensions.DependencyInjection.ServiceProviderServiceExtensions.GetRequiredService(sp)), global::Microsoft.Extensions.DependencyInjection.ServiceProviderServiceExtensions.GetRequiredService(global::Microsoft.Extensions.DependencyInjection.ServiceProviderServiceExtensions.GetRequiredService(sp)), global::Microsoft.Extensions.DependencyInjection.ServiceProviderServiceExtensions.GetRequiredService>(global::Microsoft.Extensions.DependencyInjection.ServiceProviderServiceExtensions.GetRequiredService(sp)), global::Microsoft.Extensions.DependencyInjection.ServiceProviderServiceExtensions.GetRequiredService>(global::Microsoft.Extensions.DependencyInjection.ServiceProviderServiceExtensions.GetRequiredService(sp)))); + global::Microsoft.Extensions.DependencyInjection.ServiceCollectionServiceExtensions.AddSingleton(services, sp => global::Microsoft.Extensions.DependencyInjection.ServiceProviderServiceExtensions.GetRequiredService(global::Microsoft.Extensions.DependencyInjection.ServiceProviderServiceExtensions.GetRequiredService(sp))); global::Microsoft.Extensions.DependencyInjection.ServiceCollectionServiceExtensions.AddSingleton(services, sp => global::Microsoft.Extensions.DependencyInjection.ServiceProviderServiceExtensions.GetRequiredService(global::Microsoft.Extensions.DependencyInjection.ServiceProviderServiceExtensions.GetRequiredService(sp))); global::Microsoft.Extensions.DependencyInjection.ServiceCollectionServiceExtensions.AddSingleton(services, sp => global::Microsoft.Extensions.DependencyInjection.ServiceProviderServiceExtensions.GetRequiredService(global::Microsoft.Extensions.DependencyInjection.ServiceProviderServiceExtensions.GetRequiredService(sp))); - global::Microsoft.Extensions.DependencyInjection.ServiceCollectionServiceExtensions.AddSingleton(services, sp => global::Microsoft.Extensions.DependencyInjection.ServiceProviderServiceExtensions.GetRequiredService(global::Microsoft.Extensions.DependencyInjection.ServiceProviderServiceExtensions.GetRequiredService(sp))); global::Microsoft.Extensions.DependencyInjection.ServiceCollectionServiceExtensions.AddSingleton(services, sp => global::Microsoft.Extensions.DependencyInjection.ServiceProviderServiceExtensions.GetRequiredService(global::Microsoft.Extensions.DependencyInjection.ServiceProviderServiceExtensions.GetRequiredService(sp))); global::Microsoft.Extensions.DependencyInjection.ServiceCollectionServiceExtensions.AddSingleton(services, sp => global::Microsoft.Extensions.DependencyInjection.ServiceProviderServiceExtensions.GetRequiredService(global::Microsoft.Extensions.DependencyInjection.ServiceProviderServiceExtensions.GetRequiredService(sp))); return new global::StrawberryShake.ClientBuilder("WotBlitzStatisticsProClient", services, serviceCollection); @@ -52,6 +52,13 @@ namespace Microsoft.Extensions.DependencyInjection global::Microsoft.Extensions.DependencyInjection.ServiceCollectionServiceExtensions.AddSingleton(services); global::Microsoft.Extensions.DependencyInjection.ServiceCollectionServiceExtensions.AddSingleton(services); global::Microsoft.Extensions.DependencyInjection.ServiceCollectionServiceExtensions.AddSingleton(services, sp => new global::StrawberryShake.Serialization.SerializerResolver(global::System.Linq.Enumerable.Concat(global::Microsoft.Extensions.DependencyInjection.ServiceProviderServiceExtensions.GetRequiredService>(parentServices), global::Microsoft.Extensions.DependencyInjection.ServiceProviderServiceExtensions.GetRequiredService>(sp)))); + global::Microsoft.Extensions.DependencyInjection.ServiceCollectionServiceExtensions.AddSingleton, global::WotBlitzStatisticsPro.Blazor.GraphQl.State.PlayerResultFactory>(services); + global::Microsoft.Extensions.DependencyInjection.ServiceCollectionServiceExtensions.AddSingleton(services, sp => global::Microsoft.Extensions.DependencyInjection.ServiceProviderServiceExtensions.GetRequiredService>(sp)); + global::Microsoft.Extensions.DependencyInjection.ServiceCollectionServiceExtensions.AddSingleton(services, sp => global::Microsoft.Extensions.DependencyInjection.ServiceProviderServiceExtensions.GetRequiredService(sp)); + global::Microsoft.Extensions.DependencyInjection.ServiceCollectionServiceExtensions.AddSingleton, global::WotBlitzStatisticsPro.Blazor.GraphQl.State.PlayerBuilder>(services); + global::Microsoft.Extensions.DependencyInjection.ServiceCollectionServiceExtensions.AddSingleton>(services, sp => new global::StrawberryShake.OperationExecutor(global::Microsoft.Extensions.DependencyInjection.ServiceProviderServiceExtensions.GetRequiredService(sp), () => global::Microsoft.Extensions.DependencyInjection.ServiceProviderServiceExtensions.GetRequiredService>(sp), global::Microsoft.Extensions.DependencyInjection.ServiceProviderServiceExtensions.GetRequiredService(sp), strategy)); + global::Microsoft.Extensions.DependencyInjection.ServiceCollectionServiceExtensions.AddSingleton(services); + global::Microsoft.Extensions.DependencyInjection.ServiceCollectionServiceExtensions.AddSingleton(services, sp => global::Microsoft.Extensions.DependencyInjection.ServiceProviderServiceExtensions.GetRequiredService(sp)); global::Microsoft.Extensions.DependencyInjection.ServiceCollectionServiceExtensions.AddSingleton, global::WotBlitzStatisticsPro.Blazor.GraphQl.State.FindClansResultFactory>(services); global::Microsoft.Extensions.DependencyInjection.ServiceCollectionServiceExtensions.AddSingleton(services, sp => global::Microsoft.Extensions.DependencyInjection.ServiceProviderServiceExtensions.GetRequiredService>(sp)); global::Microsoft.Extensions.DependencyInjection.ServiceCollectionServiceExtensions.AddSingleton(services, sp => global::Microsoft.Extensions.DependencyInjection.ServiceProviderServiceExtensions.GetRequiredService(sp)); @@ -66,13 +73,6 @@ namespace Microsoft.Extensions.DependencyInjection global::Microsoft.Extensions.DependencyInjection.ServiceCollectionServiceExtensions.AddSingleton>(services, sp => new global::StrawberryShake.OperationExecutor(global::Microsoft.Extensions.DependencyInjection.ServiceProviderServiceExtensions.GetRequiredService(sp), () => global::Microsoft.Extensions.DependencyInjection.ServiceProviderServiceExtensions.GetRequiredService>(sp), global::Microsoft.Extensions.DependencyInjection.ServiceProviderServiceExtensions.GetRequiredService(sp), strategy)); global::Microsoft.Extensions.DependencyInjection.ServiceCollectionServiceExtensions.AddSingleton(services); global::Microsoft.Extensions.DependencyInjection.ServiceCollectionServiceExtensions.AddSingleton(services, sp => global::Microsoft.Extensions.DependencyInjection.ServiceProviderServiceExtensions.GetRequiredService(sp)); - global::Microsoft.Extensions.DependencyInjection.ServiceCollectionServiceExtensions.AddSingleton, global::WotBlitzStatisticsPro.Blazor.GraphQl.State.PlayerResultFactory>(services); - global::Microsoft.Extensions.DependencyInjection.ServiceCollectionServiceExtensions.AddSingleton(services, sp => global::Microsoft.Extensions.DependencyInjection.ServiceProviderServiceExtensions.GetRequiredService>(sp)); - global::Microsoft.Extensions.DependencyInjection.ServiceCollectionServiceExtensions.AddSingleton(services, sp => global::Microsoft.Extensions.DependencyInjection.ServiceProviderServiceExtensions.GetRequiredService(sp)); - global::Microsoft.Extensions.DependencyInjection.ServiceCollectionServiceExtensions.AddSingleton, global::WotBlitzStatisticsPro.Blazor.GraphQl.State.PlayerBuilder>(services); - global::Microsoft.Extensions.DependencyInjection.ServiceCollectionServiceExtensions.AddSingleton>(services, sp => new global::StrawberryShake.OperationExecutor(global::Microsoft.Extensions.DependencyInjection.ServiceProviderServiceExtensions.GetRequiredService(sp), () => global::Microsoft.Extensions.DependencyInjection.ServiceProviderServiceExtensions.GetRequiredService>(sp), global::Microsoft.Extensions.DependencyInjection.ServiceProviderServiceExtensions.GetRequiredService(sp), strategy)); - global::Microsoft.Extensions.DependencyInjection.ServiceCollectionServiceExtensions.AddSingleton(services); - global::Microsoft.Extensions.DependencyInjection.ServiceCollectionServiceExtensions.AddSingleton(services, sp => global::Microsoft.Extensions.DependencyInjection.ServiceProviderServiceExtensions.GetRequiredService(sp)); global::Microsoft.Extensions.DependencyInjection.ServiceCollectionServiceExtensions.AddSingleton(services); global::Microsoft.Extensions.DependencyInjection.ServiceCollectionServiceExtensions.AddSingleton(services); global::Microsoft.Extensions.DependencyInjection.ServiceCollectionServiceExtensions.AddSingleton(services, sp => global::Microsoft.Extensions.DependencyInjection.ServiceProviderServiceExtensions.GetRequiredService(sp)); diff --git a/WotBlitzStatisticsPro.Blazor/Generated/IWotBlitzStatisticsProClient.WotBlitzStatisticsProClient.StrawberryShake.cs b/WotBlitzStatisticsPro.Blazor/Generated/IWotBlitzStatisticsProClient.WotBlitzStatisticsProClient.StrawberryShake.cs index e25ad62..a12d0fa 100644 --- a/WotBlitzStatisticsPro.Blazor/Generated/IWotBlitzStatisticsProClient.WotBlitzStatisticsProClient.StrawberryShake.cs +++ b/WotBlitzStatisticsPro.Blazor/Generated/IWotBlitzStatisticsProClient.WotBlitzStatisticsProClient.StrawberryShake.cs @@ -9,10 +9,10 @@ namespace WotBlitzStatisticsPro.Blazor.GraphQl [global::System.CodeDom.Compiler.GeneratedCode("StrawberryShake", "11.2.2.0")] public interface IWotBlitzStatisticsProClient { + global::WotBlitzStatisticsPro.Blazor.GraphQl.IPlayerQuery Player { get; } + global::WotBlitzStatisticsPro.Blazor.GraphQl.IFindClansQuery FindClans { get; } global::WotBlitzStatisticsPro.Blazor.GraphQl.IFindPlayersQuery FindPlayers { get; } - - global::WotBlitzStatisticsPro.Blazor.GraphQl.IPlayerQuery Player { get; } } } diff --git a/WotBlitzStatisticsPro.Blazor/Generated/WotBlitzStatisticsProClient.WotBlitzStatisticsProClient.StrawberryShake.cs b/WotBlitzStatisticsPro.Blazor/Generated/WotBlitzStatisticsProClient.WotBlitzStatisticsProClient.StrawberryShake.cs index 19c8e45..f9487f5 100644 --- a/WotBlitzStatisticsPro.Blazor/Generated/WotBlitzStatisticsProClient.WotBlitzStatisticsProClient.StrawberryShake.cs +++ b/WotBlitzStatisticsPro.Blazor/Generated/WotBlitzStatisticsProClient.WotBlitzStatisticsProClient.StrawberryShake.cs @@ -9,19 +9,19 @@ namespace WotBlitzStatisticsPro.Blazor.GraphQl [global::System.CodeDom.Compiler.GeneratedCode("StrawberryShake", "11.2.2.0")] public partial class WotBlitzStatisticsProClient : global::WotBlitzStatisticsPro.Blazor.GraphQl.IWotBlitzStatisticsProClient { + private readonly global::WotBlitzStatisticsPro.Blazor.GraphQl.IPlayerQuery _player; private readonly global::WotBlitzStatisticsPro.Blazor.GraphQl.IFindClansQuery _findClans; private readonly global::WotBlitzStatisticsPro.Blazor.GraphQl.IFindPlayersQuery _findPlayers; - private readonly global::WotBlitzStatisticsPro.Blazor.GraphQl.IPlayerQuery _player; - public WotBlitzStatisticsProClient(global::WotBlitzStatisticsPro.Blazor.GraphQl.IFindClansQuery findClans, global::WotBlitzStatisticsPro.Blazor.GraphQl.IFindPlayersQuery findPlayers, global::WotBlitzStatisticsPro.Blazor.GraphQl.IPlayerQuery player) + public WotBlitzStatisticsProClient(global::WotBlitzStatisticsPro.Blazor.GraphQl.IPlayerQuery player, global::WotBlitzStatisticsPro.Blazor.GraphQl.IFindClansQuery findClans, global::WotBlitzStatisticsPro.Blazor.GraphQl.IFindPlayersQuery findPlayers) { + _player = player ?? throw new global::System.ArgumentNullException(nameof(player)); _findClans = findClans ?? throw new global::System.ArgumentNullException(nameof(findClans)); _findPlayers = findPlayers ?? throw new global::System.ArgumentNullException(nameof(findPlayers)); - _player = player ?? throw new global::System.ArgumentNullException(nameof(player)); } public static global::System.String ClientName => "WotBlitzStatisticsProClient"; + public global::WotBlitzStatisticsPro.Blazor.GraphQl.IPlayerQuery Player => _player; public global::WotBlitzStatisticsPro.Blazor.GraphQl.IFindClansQuery FindClans => _findClans; public global::WotBlitzStatisticsPro.Blazor.GraphQl.IFindPlayersQuery FindPlayers => _findPlayers; - public global::WotBlitzStatisticsPro.Blazor.GraphQl.IPlayerQuery Player => _player; } } diff --git a/WotBlitzStatisticsPro.Blazor/Pages/PlayerInfoStatistics.razor b/WotBlitzStatisticsPro.Blazor/Pages/PlayerInfoStatistics.razor index 4ef6793..d8b19f1 100644 --- a/WotBlitzStatisticsPro.Blazor/Pages/PlayerInfoStatistics.razor +++ b/WotBlitzStatisticsPro.Blazor/Pages/PlayerInfoStatistics.razor @@ -4,5 +4,10 @@
+ +
+
+
+
@*
*@ \ No newline at end of file diff --git a/WotBlitzStatisticsPro.Blazor/Pages/PlayerInfoStatisticsBase.cs b/WotBlitzStatisticsPro.Blazor/Pages/PlayerInfoStatisticsBase.cs index 46efe38..cb55461 100644 --- a/WotBlitzStatisticsPro.Blazor/Pages/PlayerInfoStatisticsBase.cs +++ b/WotBlitzStatisticsPro.Blazor/Pages/PlayerInfoStatisticsBase.cs @@ -23,6 +23,11 @@ namespace WotBlitzStatisticsPro.Blazor.Pages await ChartsService.BuildBarChartBattlesByTankType("battlesByTankType", TanksList); await ChartsService.BuildBarChartWinRatesByTankType("winRateByTankType", TanksList); await ChartsService.BuildBarChartAvgDmgByTankType("avgDmgByTankType", TanksList); + + await ChartsService.BuildBarChartBattlesByNation("battlesByNation", TanksList); + await ChartsService.BuildBarChartWinRatesByNation("winRateByNation", TanksList); + await ChartsService.BuildBarChartAvgDmgByNation("avgDmgByNation", TanksList); + //await ChartsService.BuildStackedBarChart("stacked"); } } diff --git a/WotBlitzStatisticsPro.Blazor/Resources/App.de.resx b/WotBlitzStatisticsPro.Blazor/Resources/App.de.resx index f8a4425..a65ddb5 100644 --- a/WotBlitzStatisticsPro.Blazor/Resources/App.de.resx +++ b/WotBlitzStatisticsPro.Blazor/Resources/App.de.resx @@ -123,12 +123,18 @@ Mittlere EP + + Mittlerer Schaden dem Nation + Mittlerer Schaden dem Panzertype Gefechte + + Gefechte dem Nation + Gefechte dem Panzertype @@ -222,6 +228,9 @@ Sieg + + Sieg dem Nation + Panzertypensieg diff --git a/WotBlitzStatisticsPro.Blazor/Resources/App.ru.resx b/WotBlitzStatisticsPro.Blazor/Resources/App.ru.resx index d35deb5..cf4259a 100644 --- a/WotBlitzStatisticsPro.Blazor/Resources/App.ru.resx +++ b/WotBlitzStatisticsPro.Blazor/Resources/App.ru.resx @@ -123,12 +123,18 @@ Средний опыт + + Средний урон по нациям + Средний урон по типу танка Количество боёв + + Количество боёв по нациям + Количество боёв по типу танка @@ -222,6 +228,9 @@ Процент побед + + Процент побед по нациям + Процент побед по типу танка diff --git a/WotBlitzStatisticsPro.Blazor/Services/ChartService.cs b/WotBlitzStatisticsPro.Blazor/Services/ChartService.cs index 3022639..e0543db 100644 --- a/WotBlitzStatisticsPro.Blazor/Services/ChartService.cs +++ b/WotBlitzStatisticsPro.Blazor/Services/ChartService.cs @@ -201,6 +201,289 @@ namespace WotBlitzStatisticsPro.Blazor.Services await _jsRuntime.InvokeVoidAsync("eChartsInterop.BuildBarChartByTankType", elementId, _localize.GetString("Avg damage by tank types").Value, chartData); } + public async Task BuildBarChartBattlesByNation(string elementId, IEnumerable tanks) + { + var battlesCountByNation = new Dictionary(); + + foreach (var tank in tanks) + { + if (string.IsNullOrEmpty(tank.TankNationId)) + { + continue; + } + if (battlesCountByNation.ContainsKey(tank.TankNationId)) + { + battlesCountByNation[tank.TankNationId] += tank.Battles; + } + else + { + battlesCountByNation.Add(tank.TankNationId, tank.Battles); + } + } + + int chinaData = 0; + int euData = 0; + int franceData = 0; + int germanyData = 0; + int japanData = 0; + int otherData = 0; + int ukData = 0; + int usaData = 0; + int ussrData = 0; + if (battlesCountByNation.ContainsKey(Constants.CountryChina)) + { + chinaData = Convert.ToInt32(battlesCountByNation[Constants.CountryChina]); + } + if (battlesCountByNation.ContainsKey(Constants.CountryEuropean)) + { + euData = Convert.ToInt32(battlesCountByNation[Constants.CountryEuropean]); + } + if (battlesCountByNation.ContainsKey(Constants.CountryFrance)) + { + franceData = Convert.ToInt32(battlesCountByNation[Constants.CountryFrance]); + } + if (battlesCountByNation.ContainsKey(Constants.CountryGermany)) + { + germanyData = Convert.ToInt32(battlesCountByNation[Constants.CountryGermany]); + } + if (battlesCountByNation.ContainsKey(Constants.CountryJapan)) + { + japanData = Convert.ToInt32(battlesCountByNation[Constants.CountryJapan]); + } + if (battlesCountByNation.ContainsKey(Constants.CountryOther)) + { + otherData = Convert.ToInt32(battlesCountByNation[Constants.CountryOther]); + } + if (battlesCountByNation.ContainsKey(Constants.CountryUk)) + { + ukData = Convert.ToInt32(battlesCountByNation[Constants.CountryUk]); + } + if (battlesCountByNation.ContainsKey(Constants.CountryUsa)) + { + usaData = Convert.ToInt32(battlesCountByNation[Constants.CountryUsa]); + } + if (battlesCountByNation.ContainsKey(Constants.CountryUssr)) + { + ussrData = Convert.ToInt32(battlesCountByNation[Constants.CountryUssr]); + } + + + var chartData = new[] + { + new {country = Constants.CountryChina, value = chinaData, color = "#9FE3CE"}, + new {country = Constants.CountryEuropean, value = euData, color = "#9FE3CE"}, + new {country = Constants.CountryFrance, value = franceData, color = "#9FE3CE"}, + new {country = Constants.CountryGermany, value = germanyData, color = "#9FE3CE"}, + new {country = Constants.CountryJapan, value = japanData, color = "#9FE3CE"}, + new {country = Constants.CountryOther, value = otherData, color = "#9FE3CE"}, + new {country = Constants.CountryUk, value = ukData, color = "#9FE3CE"}, + new {country = Constants.CountryUsa, value = usaData, color = "#9FE3CE"}, + new {country = Constants.CountryUssr, value = ussrData, color = "#9FE3CE"}, + }; + + await _jsRuntime.InvokeVoidAsync("eChartsInterop.BuildBarChartByNation", elementId, _localize.GetString("Battles by nation").Value, chartData); + } + + public async Task BuildBarChartWinRatesByNation(string elementId, IEnumerable tanks) + { + var battlesCountByNation = new Dictionary(); + var winsCountByNation = new Dictionary(); + + foreach (var tank in tanks) + { + if (string.IsNullOrEmpty(tank.TankNationId)) + { + continue; + } + if (battlesCountByNation.ContainsKey(tank.TankNationId)) + { + battlesCountByNation[tank.TankNationId] += tank.Battles; + } + else + { + battlesCountByNation.Add(tank.TankNationId, tank.Battles); + } + if (winsCountByNation.ContainsKey(tank.TankNationId)) + { + winsCountByNation[tank.TankNationId] += tank.Wins; + } + else + { + winsCountByNation.Add(tank.TankNationId, tank.Wins); + } + } + + int chinaData = 0; + int euData = 0; + int franceData = 0; + int germanyData = 0; + int japanData = 0; + int otherData = 0; + int ukData = 0; + int usaData = 0; + int ussrData = 0; + if (battlesCountByNation.ContainsKey(Constants.CountryChina)) + { + chinaData = Convert.ToInt32(100 * winsCountByNation[Constants.CountryChina] / + battlesCountByNation[Constants.CountryChina]); + } + if (battlesCountByNation.ContainsKey(Constants.CountryEuropean)) + { + euData = Convert.ToInt32(100 * winsCountByNation[Constants.CountryEuropean] / + battlesCountByNation[Constants.CountryEuropean]); + } + if (battlesCountByNation.ContainsKey(Constants.CountryFrance)) + { + franceData = Convert.ToInt32(100 * winsCountByNation[Constants.CountryFrance] / + battlesCountByNation[Constants.CountryFrance]); + } + if (battlesCountByNation.ContainsKey(Constants.CountryGermany)) + { + germanyData = Convert.ToInt32(100 * winsCountByNation[Constants.CountryGermany] / + battlesCountByNation[Constants.CountryGermany]); + } + if (battlesCountByNation.ContainsKey(Constants.CountryJapan)) + { + japanData = Convert.ToInt32(100 * winsCountByNation[Constants.CountryJapan] / + battlesCountByNation[Constants.CountryJapan]); + } + if (battlesCountByNation.ContainsKey(Constants.CountryOther)) + { + otherData = Convert.ToInt32(100 * winsCountByNation[Constants.CountryOther] / + battlesCountByNation[Constants.CountryOther]); + } + if (battlesCountByNation.ContainsKey(Constants.CountryUk)) + { + ukData = Convert.ToInt32(100 * winsCountByNation[Constants.CountryUk] / + battlesCountByNation[Constants.CountryUk]); + } + if (battlesCountByNation.ContainsKey(Constants.CountryUsa)) + { + usaData = Convert.ToInt32(100 * winsCountByNation[Constants.CountryUsa] / + battlesCountByNation[Constants.CountryUsa]); + } + if (battlesCountByNation.ContainsKey(Constants.CountryUssr)) + { + ussrData = Convert.ToInt32(100 * winsCountByNation[Constants.CountryUssr] / + battlesCountByNation[Constants.CountryUssr]); + } + + var chartData = new[] + { + new {country = Constants.CountryChina, value = chinaData, color = chinaData.ScaleColor()}, + new {country = Constants.CountryEuropean, value = euData, color = euData.ScaleColor()}, + new {country = Constants.CountryFrance, value = franceData, color = franceData.ScaleColor()}, + new {country = Constants.CountryGermany, value = germanyData, color = germanyData.ScaleColor()}, + new {country = Constants.CountryJapan, value = japanData, color = japanData.ScaleColor()}, + new {country = Constants.CountryOther, value = otherData, color = otherData.ScaleColor()}, + new {country = Constants.CountryUk, value = ukData, color = ukData.ScaleColor()}, + new {country = Constants.CountryUsa, value = usaData, color = usaData.ScaleColor()}, + new {country = Constants.CountryUssr, value = ussrData, color = ussrData.ScaleColor()}, + }; + + await _jsRuntime.InvokeVoidAsync("eChartsInterop.BuildBarChartByNation", elementId, _localize.GetString("Win rate by nation").Value, chartData); + } + + public async Task BuildBarChartAvgDmgByNation(string elementId, IEnumerable tanks) + { + var battlesCountByNation = new Dictionary(); + var dmgCountByNation = new Dictionary(); + + foreach (var tank in tanks) + { + if (string.IsNullOrEmpty(tank.TankNationId)) + { + continue; + } + if (battlesCountByNation.ContainsKey(tank.TankNationId)) + { + battlesCountByNation[tank.TankNationId] += tank.Battles; + } + else + { + battlesCountByNation.Add(tank.TankNationId, tank.Battles); + } + if (dmgCountByNation.ContainsKey(tank.TankNationId)) + { + dmgCountByNation[tank.TankNationId] += tank.DamageDealt; + } + else + { + dmgCountByNation.Add(tank.TankNationId, tank.DamageDealt); + } + } + + int chinaData = 0; + int euData = 0; + int franceData = 0; + int germanyData = 0; + int japanData = 0; + int otherData = 0; + int ukData = 0; + int usaData = 0; + int ussrData = 0; + if (battlesCountByNation.ContainsKey(Constants.CountryChina)) + { + chinaData = Convert.ToInt32(dmgCountByNation[Constants.CountryChina] / + battlesCountByNation[Constants.CountryChina]); + } + if (battlesCountByNation.ContainsKey(Constants.CountryEuropean)) + { + euData = Convert.ToInt32(dmgCountByNation[Constants.CountryEuropean] / + battlesCountByNation[Constants.CountryEuropean]); + } + if (battlesCountByNation.ContainsKey(Constants.CountryFrance)) + { + franceData = Convert.ToInt32(dmgCountByNation[Constants.CountryFrance] / + battlesCountByNation[Constants.CountryFrance]); + } + if (battlesCountByNation.ContainsKey(Constants.CountryGermany)) + { + germanyData = Convert.ToInt32(dmgCountByNation[Constants.CountryGermany] / + battlesCountByNation[Constants.CountryGermany]); + } + if (battlesCountByNation.ContainsKey(Constants.CountryJapan)) + { + japanData = Convert.ToInt32(dmgCountByNation[Constants.CountryJapan] / + battlesCountByNation[Constants.CountryJapan]); + } + if (battlesCountByNation.ContainsKey(Constants.CountryOther)) + { + otherData = Convert.ToInt32(dmgCountByNation[Constants.CountryOther] / + battlesCountByNation[Constants.CountryOther]); + } + if (battlesCountByNation.ContainsKey(Constants.CountryUk)) + { + ukData = Convert.ToInt32(dmgCountByNation[Constants.CountryUk] / + battlesCountByNation[Constants.CountryUk]); + } + if (battlesCountByNation.ContainsKey(Constants.CountryUsa)) + { + usaData = Convert.ToInt32(dmgCountByNation[Constants.CountryUsa] / + battlesCountByNation[Constants.CountryUsa]); + } + if (battlesCountByNation.ContainsKey(Constants.CountryUssr)) + { + ussrData = Convert.ToInt32(dmgCountByNation[Constants.CountryUssr] / + battlesCountByNation[Constants.CountryUssr]); + } + + var chartData = new[] + { + new {country = Constants.CountryChina, value = chinaData, color = "#D98D8B"}, + new {country = Constants.CountryEuropean, value = euData, color = "#D98D8B"}, + new {country = Constants.CountryFrance, value = franceData, color = "#D98D8B"}, + new {country = Constants.CountryGermany, value = germanyData, color = "#D98D8B"}, + new {country = Constants.CountryJapan, value = japanData, color = "#D98D8B"}, + new {country = Constants.CountryOther, value = otherData, color = "#D98D8B"}, + new {country = Constants.CountryUk, value = ukData, color = "#D98D8B"}, + new {country = Constants.CountryUsa, value = usaData, color = "#D98D8B"}, + new {country = Constants.CountryUssr, value = ussrData, color = "#D98D8B"}, + }; + + await _jsRuntime.InvokeVoidAsync("eChartsInterop.BuildBarChartByNation", elementId, _localize.GetString("Avg damage by nation").Value, chartData); + } + public async Task BuildStackedBarChart(string elementId) { await _jsRuntime.InvokeVoidAsync("eChartsInterop.BuildStackedBarChart", elementId); diff --git a/WotBlitzStatisticsPro.Blazor/Services/IChartsService.cs b/WotBlitzStatisticsPro.Blazor/Services/IChartsService.cs index 7687285..8fa6e84 100644 --- a/WotBlitzStatisticsPro.Blazor/Services/IChartsService.cs +++ b/WotBlitzStatisticsPro.Blazor/Services/IChartsService.cs @@ -9,6 +9,9 @@ namespace WotBlitzStatisticsPro.Blazor.Services Task BuildBarChartBattlesByTankType(string elementId, IEnumerable tanks); Task BuildBarChartWinRatesByTankType(string elementId, IEnumerable tanks); Task BuildBarChartAvgDmgByTankType(string elementId, IEnumerable tanks); + Task BuildBarChartBattlesByNation(string elementId, IEnumerable tanks); + Task BuildBarChartWinRatesByNation(string elementId, IEnumerable tanks); + Task BuildBarChartAvgDmgByNation(string elementId, IEnumerable tanks); Task BuildStackedBarChart(string elementId); } } \ No newline at end of file diff --git a/WotBlitzStatisticsPro.Blazor/wwwroot/echarts/echarts-interop.js b/WotBlitzStatisticsPro.Blazor/wwwroot/echarts/echarts-interop.js index 6686831..97aa7ad 100644 --- a/WotBlitzStatisticsPro.Blazor/wwwroot/echarts/echarts-interop.js +++ b/WotBlitzStatisticsPro.Blazor/wwwroot/echarts/echarts-interop.js @@ -129,6 +129,216 @@ eChartsInterop.BuildBarChartByTankType = function (elementId, chartTitle, chartD }); }; +eChartsInterop.BuildBarChartByNation = function (elementId, chartTitle, chartData) { + var flags = { + 'china': '/flags/china-round.png', + 'european': '/flags/eu-round.png', + 'france': '/flags/france-round.png', + 'germany': '/flags/germany-round.png', + 'japan': '/flags/japan-round.png', + 'other': '/flags/other-round.png', + 'uk': '/flags/uk-round.png', + 'usa': '/flags/usa-round.png', + 'ussr': '/flags/ussr-round.png', + }; + + var seriesLabel = { + show: true + } + + // based on prepared DOM, initialize echarts instance + var myChart = echarts.init(document.getElementById(elementId), 'dark'); + + var chinaData = chartData.find(d => d.country === 'china'); + var euData = chartData.find(d => d.country === 'european'); + var franceData = chartData.find(d => d.country === 'france'); + var germanyData = chartData.find(d => d.country === 'germany'); + var japanData = chartData.find(d => d.country === 'japan'); + var otherData = chartData.find(d => d.country === 'other'); + var ukData = chartData.find(d => d.country === 'uk'); + var usaData = chartData.find(d => d.country === 'usa'); + var ussrData = chartData.find(d => d.country === 'ussr'); + + // specify chart configuration item and data + var option = { + title: { + text: chartTitle + }, + toolbox: { + show: true, + feature: { + saveAsImage: {} + } + }, + xAxis: { + type: 'value', + name: '', + axisLabel: { + formatter: '{value}' + } + }, + yAxis: { + type: 'category', + data: ['other', 'usa', 'germany', 'ussr', 'uk', 'japan', 'china', 'france', 'european'], + axisTick: { + alignWithLabel: true + }, + axisLabel: { + formatter: function (value) { + return '{' + value + '| }'; + }, + rich: { + value: { + lineHeight: 10, + align: 'center' + }, + other: { + height: 20, + width: 20, + align: 'center', + backgroundColor: { + image: flags.other + } + }, + usa: { + height: 20, + width: 20, + align: 'center', + backgroundColor: { + image: flags.usa + } + }, + germany: { + height: 20, + width: 20, + align: 'center', + backgroundColor: { + image: flags.germany + } + }, + ussr: { + height: 20, + width: 20, + align: 'center', + backgroundColor: { + image: flags.ussr + } + }, + uk: { + height: 20, + width: 20, + align: 'center', + backgroundColor: { + image: flags.uk + } + }, + japan: { + height: 20, + width: 20, + align: 'center', + backgroundColor: { + image: flags.japan + } + }, + china: { + height: 20, + width: 20, + align: 'center', + backgroundColor: { + image: flags.china + } + }, + france: { + height: 20, + width: 20, + align: 'center', + backgroundColor: { + image: flags.france + } + }, + european: { + height: 20, + width: 20, + align: 'center', + backgroundColor: { + image: flags.european + } + } + } + } + }, + series: [ + { + type: 'bar', + label: seriesLabel, + barWidth: '30px', + data: [ + { + value: otherData.value, + itemStyle: { + color: otherData.color + } + }, + { + value: usaData.value, + itemStyle: { + color: usaData.color + } + }, + { + value: germanyData.value, + itemStyle: { + color: germanyData.color + } + }, + { + value: ussrData.value, + itemStyle: { + color: ussrData.color + } + }, + { + value: ukData.value, + itemStyle: { + color: ukData.color + } + }, + { + value: japanData.value, + itemStyle: { + color: japanData.color + } + }, + { + value: chinaData.value, + itemStyle: { + color: chinaData.color + } + }, + { + value: franceData.value, + itemStyle: { + color: franceData.color + } + }, + { + value: euData.value, + itemStyle: { + color: euData.color + } + } + ] + }] + }; + + // use configuration item and data specified to show chart + myChart.setOption(option); + window.addEventListener('resize', + function() { + myChart.resize(); + }); +}; + eChartsInterop.BuildStackedBarChart = function (elementId) { var tankTypes = { 'HeavyTank': '/tank-type/vehicle.class.heavy.small.scale-200.png', diff --git a/WotBlitzStatisticsPro.Blazor/wwwroot/flags/china-round.png b/WotBlitzStatisticsPro.Blazor/wwwroot/flags/china-round.png new file mode 100644 index 0000000..9a562c1 Binary files /dev/null and b/WotBlitzStatisticsPro.Blazor/wwwroot/flags/china-round.png differ diff --git a/WotBlitzStatisticsPro.Blazor/wwwroot/flags/eu-round.png b/WotBlitzStatisticsPro.Blazor/wwwroot/flags/eu-round.png new file mode 100644 index 0000000..14b3d1d Binary files /dev/null and b/WotBlitzStatisticsPro.Blazor/wwwroot/flags/eu-round.png differ diff --git a/WotBlitzStatisticsPro.Blazor/wwwroot/flags/france-round.png b/WotBlitzStatisticsPro.Blazor/wwwroot/flags/france-round.png new file mode 100644 index 0000000..67fb669 Binary files /dev/null and b/WotBlitzStatisticsPro.Blazor/wwwroot/flags/france-round.png differ diff --git a/WotBlitzStatisticsPro.Blazor/wwwroot/flags/germany-round.png b/WotBlitzStatisticsPro.Blazor/wwwroot/flags/germany-round.png new file mode 100644 index 0000000..cd1fd48 Binary files /dev/null and b/WotBlitzStatisticsPro.Blazor/wwwroot/flags/germany-round.png differ diff --git a/WotBlitzStatisticsPro.Blazor/wwwroot/flags/japan-round.png b/WotBlitzStatisticsPro.Blazor/wwwroot/flags/japan-round.png new file mode 100644 index 0000000..3584708 Binary files /dev/null and b/WotBlitzStatisticsPro.Blazor/wwwroot/flags/japan-round.png differ diff --git a/WotBlitzStatisticsPro.Blazor/wwwroot/flags/other-round.png b/WotBlitzStatisticsPro.Blazor/wwwroot/flags/other-round.png new file mode 100644 index 0000000..eaf69c1 Binary files /dev/null and b/WotBlitzStatisticsPro.Blazor/wwwroot/flags/other-round.png differ diff --git a/WotBlitzStatisticsPro.Blazor/wwwroot/flags/uk-round.png b/WotBlitzStatisticsPro.Blazor/wwwroot/flags/uk-round.png new file mode 100644 index 0000000..694eeb5 Binary files /dev/null and b/WotBlitzStatisticsPro.Blazor/wwwroot/flags/uk-round.png differ diff --git a/WotBlitzStatisticsPro.Blazor/wwwroot/flags/usa-round.png b/WotBlitzStatisticsPro.Blazor/wwwroot/flags/usa-round.png new file mode 100644 index 0000000..5fc713a Binary files /dev/null and b/WotBlitzStatisticsPro.Blazor/wwwroot/flags/usa-round.png differ diff --git a/WotBlitzStatisticsPro.Blazor/wwwroot/flags/ussr-round.png b/WotBlitzStatisticsPro.Blazor/wwwroot/flags/ussr-round.png new file mode 100644 index 0000000..8947e2e Binary files /dev/null and b/WotBlitzStatisticsPro.Blazor/wwwroot/flags/ussr-round.png differ