diff --git a/WotBlitzStatisticsPro.Blazor/Model/ChartByTierItem.cs b/WotBlitzStatisticsPro.Blazor/Model/ChartByTierItem.cs new file mode 100644 index 0000000..476a16f --- /dev/null +++ b/WotBlitzStatisticsPro.Blazor/Model/ChartByTierItem.cs @@ -0,0 +1,4 @@ +namespace WotBlitzStatisticsPro.Blazor.Model +{ + public record ChartByTierItem(string Tier, int Value, string Color); +} diff --git a/WotBlitzStatisticsPro.Blazor/Pages/PlayerInfoStatistics.razor b/WotBlitzStatisticsPro.Blazor/Pages/PlayerInfoStatistics.razor index d8b19f1..4c80347 100644 --- a/WotBlitzStatisticsPro.Blazor/Pages/PlayerInfoStatistics.razor +++ b/WotBlitzStatisticsPro.Blazor/Pages/PlayerInfoStatistics.razor @@ -9,5 +9,10 @@
+ +
+
+
+
@*
*@ \ No newline at end of file diff --git a/WotBlitzStatisticsPro.Blazor/Pages/PlayerInfoStatisticsBase.cs b/WotBlitzStatisticsPro.Blazor/Pages/PlayerInfoStatisticsBase.cs index cb55461..daf1ca5 100644 --- a/WotBlitzStatisticsPro.Blazor/Pages/PlayerInfoStatisticsBase.cs +++ b/WotBlitzStatisticsPro.Blazor/Pages/PlayerInfoStatisticsBase.cs @@ -28,6 +28,10 @@ namespace WotBlitzStatisticsPro.Blazor.Pages await ChartsService.BuildBarChartWinRatesByNation("winRateByNation", TanksList); await ChartsService.BuildBarChartAvgDmgByNation("avgDmgByNation", TanksList); + await ChartsService.BuildBarChartBattlesByTier("battlesByTier", TanksList); + await ChartsService.BuildBarChartWinRatesByTier("winRateByTier", TanksList); + await ChartsService.BuildBarChartAvgDmgByTier("avgDmgByTier", TanksList); + //await ChartsService.BuildStackedBarChart("stacked"); } } diff --git a/WotBlitzStatisticsPro.Blazor/Resources/App.de.resx b/WotBlitzStatisticsPro.Blazor/Resources/App.de.resx index a65ddb5..a9e4df6 100644 --- a/WotBlitzStatisticsPro.Blazor/Resources/App.de.resx +++ b/WotBlitzStatisticsPro.Blazor/Resources/App.de.resx @@ -129,6 +129,9 @@ Mittlerer Schaden dem Panzertype + + Mittlerer Schaden dem Rang + Gefechte @@ -138,6 +141,9 @@ Gefechte dem Panzertype + + Gefechte dem Rang + Abbrechen @@ -234,6 +240,9 @@ Panzertypensieg + + Sieg dem Rang + vor Jahren diff --git a/WotBlitzStatisticsPro.Blazor/Resources/App.ru.resx b/WotBlitzStatisticsPro.Blazor/Resources/App.ru.resx index cf4259a..50b820a 100644 --- a/WotBlitzStatisticsPro.Blazor/Resources/App.ru.resx +++ b/WotBlitzStatisticsPro.Blazor/Resources/App.ru.resx @@ -129,6 +129,9 @@ Средний урон по типу танка + + Средний урон по уровню + Количество боёв @@ -138,6 +141,9 @@ Количество боёв по типу танка + + Количество боёв по уровню + Отмена @@ -234,6 +240,9 @@ Процент побед по типу танка + + Процент побед по уровню + лет назад diff --git a/WotBlitzStatisticsPro.Blazor/Services/ChartService.cs b/WotBlitzStatisticsPro.Blazor/Services/ChartService.cs index e0543db..b5d1138 100644 --- a/WotBlitzStatisticsPro.Blazor/Services/ChartService.cs +++ b/WotBlitzStatisticsPro.Blazor/Services/ChartService.cs @@ -5,6 +5,7 @@ using Microsoft.Extensions.Localization; using Microsoft.JSInterop; using WotBlitzStatisticsPro.Blazor.GraphQl; using WotBlitzStatisticsPro.Blazor.Helpers; +using WotBlitzStatisticsPro.Blazor.Model; namespace WotBlitzStatisticsPro.Blazor.Services { @@ -483,10 +484,159 @@ namespace WotBlitzStatisticsPro.Blazor.Services await _jsRuntime.InvokeVoidAsync("eChartsInterop.BuildBarChartByNation", elementId, _localize.GetString("Avg damage by nation").Value, chartData); } + public async Task BuildBarChartBattlesByTier(string elementId, IEnumerable tanks) + { + var battlesCountByTier = new Dictionary(); + + foreach (var tank in tanks) + { + if (tank.Tier == 0) + { + continue; + } + if (battlesCountByTier.ContainsKey(tank.Tier)) + { + battlesCountByTier[tank.Tier] += tank.Battles; + } + else + { + battlesCountByTier.Add(tank.Tier, tank.Battles); + } + } + + var values = new int[10]; + for (int i = 0; i < values.Length; i++) + { + values[i] = 0; + } + + for (int i = 1; i < 11; i++) + { + if(battlesCountByTier.ContainsKey(i)) + { + values[i - 1] = Convert.ToInt32(battlesCountByTier[i]); + } + } + + var chartData = new List(); + for (int i = 0; i < values.Length; i++) + { + chartData.Add(new ((i + 1).RomanNumber(), values[i], "#9FE3CE")); + } + + await _jsRuntime.InvokeVoidAsync("eChartsInterop.BuildBarChartByTier", elementId, _localize.GetString("Battles by tier").Value, chartData.ToArray()); + } + + public async Task BuildBarChartWinRatesByTier(string elementId, IEnumerable tanks) + { + var battlesCountByTier = new Dictionary(); + var winsCountByTier = new Dictionary(); + + foreach (var tank in tanks) + { + if (tank.Tier == 0) + { + continue; + } + if (battlesCountByTier.ContainsKey(tank.Tier)) + { + battlesCountByTier[tank.Tier] += tank.Battles; + } + else + { + battlesCountByTier.Add(tank.Tier, tank.Battles); + } + if (winsCountByTier.ContainsKey(tank.Tier)) + { + winsCountByTier[tank.Tier] += tank.Wins; + } + else + { + winsCountByTier.Add(tank.Tier, tank.Wins); + } + } + + var values = new int[10]; + for (int i = 0; i < values.Length; i++) + { + values[i] = 0; + } + + for (int i = 1; i < 11; i++) + { + if (battlesCountByTier.ContainsKey(i)) + { + values[i - 1] = Convert.ToInt32(100 * winsCountByTier[i] / + battlesCountByTier[i]); + } + } + + var chartData = new List(); + for (int i = 0; i < values.Length; i++) + { + chartData.Add(new((i + 1).RomanNumber(), values[i], values[i].ScaleColor())); + } + + await _jsRuntime.InvokeVoidAsync("eChartsInterop.BuildBarChartByTier", elementId, _localize.GetString("Win rate by tier").Value, chartData.ToArray()); + } + + public async Task BuildBarChartAvgDmgByTier(string elementId, IEnumerable tanks) + { + var battlesCountByTier = new Dictionary(); + var dmgCountByTier = new Dictionary(); + + foreach (var tank in tanks) + { + if (tank.Tier == 0) + { + continue; + } + if (battlesCountByTier.ContainsKey(tank.Tier)) + { + battlesCountByTier[tank.Tier] += tank.Battles; + } + else + { + battlesCountByTier.Add(tank.Tier, tank.Battles); + } + if (dmgCountByTier.ContainsKey(tank.Tier)) + { + dmgCountByTier[tank.Tier] += tank.DamageDealt; + } + else + { + dmgCountByTier.Add(tank.Tier, tank.DamageDealt); + } + } + + var values = new int[10]; + for (int i = 0; i < values.Length; i++) + { + values[i] = 0; + } + + for (int i = 1; i < 11; i++) + { + if (battlesCountByTier.ContainsKey(i)) + { + values[i - 1] = Convert.ToInt32(dmgCountByTier[i] / + battlesCountByTier[i]); + } + } + + var chartData = new List(); + for (int i = 0; i < values.Length; i++) + { + chartData.Add(new((i + 1).RomanNumber(), values[i], "#D98D8B")); + } + + await _jsRuntime.InvokeVoidAsync("eChartsInterop.BuildBarChartByTier", elementId, _localize.GetString("Avg damage by tier").Value, chartData.ToArray()); + } public async Task BuildStackedBarChart(string elementId) { await _jsRuntime.InvokeVoidAsync("eChartsInterop.BuildStackedBarChart", elementId); } + } } \ No newline at end of file diff --git a/WotBlitzStatisticsPro.Blazor/Services/IChartsService.cs b/WotBlitzStatisticsPro.Blazor/Services/IChartsService.cs index 8fa6e84..0598afa 100644 --- a/WotBlitzStatisticsPro.Blazor/Services/IChartsService.cs +++ b/WotBlitzStatisticsPro.Blazor/Services/IChartsService.cs @@ -12,6 +12,9 @@ namespace WotBlitzStatisticsPro.Blazor.Services Task BuildBarChartBattlesByNation(string elementId, IEnumerable tanks); Task BuildBarChartWinRatesByNation(string elementId, IEnumerable tanks); Task BuildBarChartAvgDmgByNation(string elementId, IEnumerable tanks); + Task BuildBarChartBattlesByTier(string elementId, IEnumerable tanks); + Task BuildBarChartWinRatesByTier(string elementId, IEnumerable tanks); + Task BuildBarChartAvgDmgByTier(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 97aa7ad..5a758d3 100644 --- a/WotBlitzStatisticsPro.Blazor/wwwroot/echarts/echarts-interop.js +++ b/WotBlitzStatisticsPro.Blazor/wwwroot/echarts/echarts-interop.js @@ -339,6 +339,118 @@ eChartsInterop.BuildBarChartByNation = function (elementId, chartTitle, chartDat }); }; +eChartsInterop.BuildBarChartByTier = function (elementId, chartTitle, chartData) { + + var seriesLabel = { + show: true + } + + // based on prepared DOM, initialize echarts instance + var myChart = echarts.init(document.getElementById(elementId), 'dark'); + + // 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: ['X', 'IX', 'VIII', 'VII', 'VI', 'V', 'IV', 'III', 'II', 'I'], + axisTick: { + alignWithLabel: true + } + }, + series: [ + { + type: 'bar', + label: seriesLabel, + barWidth: '30px', + data: [ + { + value: chartData[9].value, + itemStyle: { + color: chartData[9].color + } + }, + { + value: chartData[8].value, + itemStyle: { + color: chartData[8].color + } + }, + { + value: chartData[7].value, + itemStyle: { + color: chartData[7].color + } + }, + { + value: chartData[6].value, + itemStyle: { + color: chartData[6].color + } + }, + { + value: chartData[5].value, + itemStyle: { + color: chartData[5].color + } + }, + { + value: chartData[4].value, + itemStyle: { + color: chartData[4].color + } + }, + { + value: chartData[3].value, + itemStyle: { + color: chartData[3].color + } + }, + { + value: chartData[2].value, + itemStyle: { + color: chartData[2].color + } + }, + { + value: chartData[1].value, + itemStyle: { + color: chartData[1].color + } + }, + { + value: chartData[0].value, + itemStyle: { + color: chartData[0].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', @@ -479,4 +591,5 @@ eChartsInterop.BuildStackedBarChart = function (elementId) { window.onresize = function () { myChart.resize(); }; -}; \ No newline at end of file +}; +