From 75d1c17b4ba005839dccb8ee2a4864f7a92157ed Mon Sep 17 00:00:00 2001 From: Michael Shabanov Date: Mon, 25 Oct 2021 14:29:47 +0300 Subject: [PATCH 1/5] chore: assembly version added --- WotBlitzStatisticsPro.Blazor/Shared/MainLayout.razor | 2 +- WotBlitzStatisticsPro.Blazor/Shared/MainLayoutBase.cs | 4 ++++ .../WotBlitzStatisticsPro.Blazor.csproj | 1 + 3 files changed, 6 insertions(+), 1 deletion(-) diff --git a/WotBlitzStatisticsPro.Blazor/Shared/MainLayout.razor b/WotBlitzStatisticsPro.Blazor/Shared/MainLayout.razor index 2706829..ef4cf2f 100644 --- a/WotBlitzStatisticsPro.Blazor/Shared/MainLayout.razor +++ b/WotBlitzStatisticsPro.Blazor/Shared/MainLayout.razor @@ -42,7 +42,7 @@ - + diff --git a/WotBlitzStatisticsPro.Blazor/Shared/MainLayoutBase.cs b/WotBlitzStatisticsPro.Blazor/Shared/MainLayoutBase.cs index c86e6c2..6bd36ce 100644 --- a/WotBlitzStatisticsPro.Blazor/Shared/MainLayoutBase.cs +++ b/WotBlitzStatisticsPro.Blazor/Shared/MainLayoutBase.cs @@ -8,6 +8,7 @@ using Radzen.Blazor; using WotBlitzStatisticsPro.Blazor.Messages; using WotBlitzStatisticsPro.Blazor.Model; using WotBlitzStatisticsPro.Blazor.Services; +using System.Reflection; namespace WotBlitzStatisticsPro.Blazor.Shared { @@ -27,6 +28,8 @@ namespace WotBlitzStatisticsPro.Blazor.Shared public bool SidebarExpanded { get; set; } = false; public bool BodyExpanded { get; set; } = true; + public string Version { get; set; } + public Dictionary CultureInfos { get; set; } = new() { { "en-US", new CultureInfo("en-US", false)}, @@ -63,6 +66,7 @@ namespace WotBlitzStatisticsPro.Blazor.Shared //} NotificationsService.MessageArrived += NotificationsService_MessageArrived; + Version = Assembly.GetExecutingAssembly().GetName().Version.ToString(); } private void NotificationsService_MessageArrived() diff --git a/WotBlitzStatisticsPro.Blazor/WotBlitzStatisticsPro.Blazor.csproj b/WotBlitzStatisticsPro.Blazor/WotBlitzStatisticsPro.Blazor.csproj index 5757a04..f5e2eb8 100644 --- a/WotBlitzStatisticsPro.Blazor/WotBlitzStatisticsPro.Blazor.csproj +++ b/WotBlitzStatisticsPro.Blazor/WotBlitzStatisticsPro.Blazor.csproj @@ -4,6 +4,7 @@ net5.0 service-worker-assets.js true + 1.0.0.1 From bebb5ee69202af6767f1fba41e06f470fbb1a333 Mon Sep 17 00:00:00 2001 From: Michael Shabanov Date: Mon, 25 Oct 2021 15:44:06 +0300 Subject: [PATCH 2/5] fix: utc time to local time --- .../Helpers/DateDifferenceHelper.cs | 12 ++++++++++++ .../Pages/PlayerInfoLayout.razor | 2 +- WotBlitzStatisticsPro.Blazor/Program.cs | 4 ++-- 3 files changed, 15 insertions(+), 3 deletions(-) diff --git a/WotBlitzStatisticsPro.Blazor/Helpers/DateDifferenceHelper.cs b/WotBlitzStatisticsPro.Blazor/Helpers/DateDifferenceHelper.cs index 639c02f..d8898c0 100644 --- a/WotBlitzStatisticsPro.Blazor/Helpers/DateDifferenceHelper.cs +++ b/WotBlitzStatisticsPro.Blazor/Helpers/DateDifferenceHelper.cs @@ -6,6 +6,12 @@ namespace WotBlitzStatisticsPro.Blazor.Helpers { public static class DateDifferenceHelper { + public static DateTime ConvertToLocalTime(this DateTimeOffset dateToConvert) + { + var specifiedTimeConvert = DateTime.SpecifyKind(dateToConvert.DateTime, DateTimeKind.Utc); + return specifiedTimeConvert.ToLocalTime(); + } + public static string SinceTime(this int timeInLinuxTimeStamp, IStringLocalizer localizer) { var currentDate = DateTime.Now; @@ -25,6 +31,11 @@ namespace WotBlitzStatisticsPro.Blazor.Helpers } public static string SinceTime(this DateTimeOffset time, IStringLocalizer localizer) + { + return time.DateTime.SinceTime(localizer); + } + + public static string SinceTime(this DateTime time, IStringLocalizer localizer) { var currentDate = DateTime.Now; @@ -41,6 +52,7 @@ namespace WotBlitzStatisticsPro.Blazor.Helpers return $"{difference.value} {ago}"; } + public static (int value, TimeInterval interval) ParseTheDifference(TimeSpan difference) { if (difference.TotalHours < 1) diff --git a/WotBlitzStatisticsPro.Blazor/Pages/PlayerInfoLayout.razor b/WotBlitzStatisticsPro.Blazor/Pages/PlayerInfoLayout.razor index 81356f6..dfaa1a4 100644 --- a/WotBlitzStatisticsPro.Blazor/Pages/PlayerInfoLayout.razor +++ b/WotBlitzStatisticsPro.Blazor/Pages/PlayerInfoLayout.razor @@ -17,7 +17,7 @@ @Localize["Created"]: @AccountInfo.CreatedAt.ToString("d") | @AccountInfo.CreatedAt.SinceTime(Localize)
- @Localize["Last battle"]: @AccountInfo.LastBattleTime.ToString("g") | @AccountInfo.LastBattleTime.SinceTime(Localize) + @Localize["Last battle"]: @AccountInfo.LastBattleTime.ConvertToLocalTime().ToString("g") | @AccountInfo.LastBattleTime.ConvertToLocalTime().SinceTime(Localize)
diff --git a/WotBlitzStatisticsPro.Blazor/Program.cs b/WotBlitzStatisticsPro.Blazor/Program.cs index 1bd9636..e9d8343 100644 --- a/WotBlitzStatisticsPro.Blazor/Program.cs +++ b/WotBlitzStatisticsPro.Blazor/Program.cs @@ -51,11 +51,11 @@ namespace WotBlitzStatisticsPro.Blazor //var useMock = Environment.GetEnvironmentVariable("USE_GRAPH_QL_MOCK"); //if (useMock != null && useMock == "true") //{ - //builder.Services.AddTransient(); + builder.Services.AddTransient(); //} //else //{ - builder.Services.AddTransient(); + //builder.Services.AddTransient(); //} var host = builder.Build(); From d3e1e52e199f687cc7f15498bb05d3faea8b831d Mon Sep 17 00:00:00 2001 From: Michael Shabanov Date: Mon, 25 Oct 2021 18:34:55 +0300 Subject: [PATCH 3/5] feat: media query added --- .../Pages/PlayerInfoLayout.razor | 1 + .../Pages/PlayerInfoLayoutBase.cs | 7 +++++++ WotBlitzStatisticsPro.Blazor/Program.cs | 1 + .../Services/IMediaQueriesService.cs | 9 +++++++++ .../Services/MediaQueriesService.cs | 20 +++++++++++++++++++ .../wwwroot/index.html | 1 + .../wwwroot/media-queries.js | 6 ++++++ 7 files changed, 45 insertions(+) create mode 100644 WotBlitzStatisticsPro.Blazor/Services/IMediaQueriesService.cs create mode 100644 WotBlitzStatisticsPro.Blazor/Services/MediaQueriesService.cs create mode 100644 WotBlitzStatisticsPro.Blazor/wwwroot/media-queries.js diff --git a/WotBlitzStatisticsPro.Blazor/Pages/PlayerInfoLayout.razor b/WotBlitzStatisticsPro.Blazor/Pages/PlayerInfoLayout.razor index dfaa1a4..1225187 100644 --- a/WotBlitzStatisticsPro.Blazor/Pages/PlayerInfoLayout.razor +++ b/WotBlitzStatisticsPro.Blazor/Pages/PlayerInfoLayout.razor @@ -4,6 +4,7 @@ +SmallScreen = @SmallScreen @if (AccountInfo != null) {

diff --git a/WotBlitzStatisticsPro.Blazor/Pages/PlayerInfoLayoutBase.cs b/WotBlitzStatisticsPro.Blazor/Pages/PlayerInfoLayoutBase.cs index bc965eb..9fe4ff3 100644 --- a/WotBlitzStatisticsPro.Blazor/Pages/PlayerInfoLayoutBase.cs +++ b/WotBlitzStatisticsPro.Blazor/Pages/PlayerInfoLayoutBase.cs @@ -22,6 +22,9 @@ namespace WotBlitzStatisticsPro.Blazor.Pages [Inject] public INotificationsService Notifications { get; set; } + [Inject] + public IMediaQueriesService MediaQueriesService { get; set; } + [Parameter] public long AccountId { get; set; } @@ -32,12 +35,16 @@ namespace WotBlitzStatisticsPro.Blazor.Pages public IReadOnlyList AchievementsBySection { get; set; } + public bool SmallScreen { get; set; } + protected override async Task OnInitializedAsync() { var loggedInInfo = await LocalStorageService.GetItemAsync(Constants.LoginInfoLocalStorageKey); var settings = await LocalStorageService.ReadSettings(); CurrentRealmType = settings.RealmType; + SmallScreen = await MediaQueriesService.IsScreenWidthLessThen(1000); + try { // Maybe add refresh button instead of calling mutation each time diff --git a/WotBlitzStatisticsPro.Blazor/Program.cs b/WotBlitzStatisticsPro.Blazor/Program.cs index e9d8343..a815dd6 100644 --- a/WotBlitzStatisticsPro.Blazor/Program.cs +++ b/WotBlitzStatisticsPro.Blazor/Program.cs @@ -30,6 +30,7 @@ namespace WotBlitzStatisticsPro.Blazor builder.Services.AddScoped(); builder.Services.AddScoped(); builder.Services.AddScoped(); + builder.Services.AddScoped(); builder.Services.AddMediatR(typeof(Program)); diff --git a/WotBlitzStatisticsPro.Blazor/Services/IMediaQueriesService.cs b/WotBlitzStatisticsPro.Blazor/Services/IMediaQueriesService.cs new file mode 100644 index 0000000..58c4dd2 --- /dev/null +++ b/WotBlitzStatisticsPro.Blazor/Services/IMediaQueriesService.cs @@ -0,0 +1,9 @@ +using System.Threading.Tasks; + +namespace WotBlitzStatisticsPro.Blazor.Services +{ + public interface IMediaQueriesService + { + ValueTask IsScreenWidthLessThen(long widthInPx); + } +} diff --git a/WotBlitzStatisticsPro.Blazor/Services/MediaQueriesService.cs b/WotBlitzStatisticsPro.Blazor/Services/MediaQueriesService.cs new file mode 100644 index 0000000..47eb2d9 --- /dev/null +++ b/WotBlitzStatisticsPro.Blazor/Services/MediaQueriesService.cs @@ -0,0 +1,20 @@ +using Microsoft.JSInterop; +using System.Threading.Tasks; + +namespace WotBlitzStatisticsPro.Blazor.Services +{ + public class MediaQueriesService : IMediaQueriesService + { + private readonly IJSRuntime _jsRuntime; + + public MediaQueriesService(IJSRuntime jsRuntime) + { + _jsRuntime = jsRuntime; + } + + public ValueTask IsScreenWidthLessThen(long widthInPx) + { + return _jsRuntime.InvokeAsync("mediaQueries.IsScreenWidthLessThen", widthInPx); + } + } +} diff --git a/WotBlitzStatisticsPro.Blazor/wwwroot/index.html b/WotBlitzStatisticsPro.Blazor/wwwroot/index.html index c461187..d70d6e4 100644 --- a/WotBlitzStatisticsPro.Blazor/wwwroot/index.html +++ b/WotBlitzStatisticsPro.Blazor/wwwroot/index.html @@ -26,6 +26,7 @@ + diff --git a/WotBlitzStatisticsPro.Blazor/wwwroot/media-queries.js b/WotBlitzStatisticsPro.Blazor/wwwroot/media-queries.js new file mode 100644 index 0000000..77458b7 --- /dev/null +++ b/WotBlitzStatisticsPro.Blazor/wwwroot/media-queries.js @@ -0,0 +1,6 @@ +var mediaQueries = mediaQueries || {}; + +mediaQueries.IsScreenWidthLessThen = function (width) { + let mql = window.matchMedia(`(max-width: ${width}px)`); + return mql.matches; +}; \ No newline at end of file From 644a8417093437f1633f49c092fe0cc5daff8f58 Mon Sep 17 00:00:00 2001 From: Mikhail Shabanov Date: Wed, 3 Nov 2021 15:29:03 +0100 Subject: [PATCH 4/5] chore: fixed the relevant tank finding algorithm --- .../Helpers/TanksHelper.cs | 81 +++++++++++++++++++ .../Pages/PlayerInfoOverview.razor | 4 +- 2 files changed, 83 insertions(+), 2 deletions(-) create mode 100644 WotBlitzStatisticsPro.Blazor/Helpers/TanksHelper.cs diff --git a/WotBlitzStatisticsPro.Blazor/Helpers/TanksHelper.cs b/WotBlitzStatisticsPro.Blazor/Helpers/TanksHelper.cs new file mode 100644 index 0000000..c16cca6 --- /dev/null +++ b/WotBlitzStatisticsPro.Blazor/Helpers/TanksHelper.cs @@ -0,0 +1,81 @@ +using System.Collections.Generic; +using System.Linq; +using System.Text; +using WotBlitzStatisticsPro.Blazor.GraphQl; + +namespace WotBlitzStatisticsPro.Blazor.Helpers +{ + public static class TanksHelper + { + public static ITank FindMostRelevantTank(this IReadOnlyList allTanks) + { + const int topTanksToMerge = 6; + if (allTanks.Count == 1) + { + return allTanks.First(); + } + + // Merge 6 tanks with max battles with 6 tanks with max Wn7, then with 6 tanks with max AvgDamage then with 6 tanks with Max Win rate. And sort result by max AvgXp and take first + + var topByBattles = allTanks + .OrderByDescending(t => t.Battles) + .Take(topTanksToMerge) + .Select(t => t.TankId) + .ToList(); + var topByWn7 = allTanks + .Where(t => topByBattles.Contains(t.TankId)) + .OrderByDescending(t => t.Wn7) + .Take(topTanksToMerge) + .Select(t => t.TankId) + .ToList(); + var topByDamage = allTanks + .Where(t => topByBattles.Contains(t.TankId)) + .OrderByDescending(t => t.AvgDamage) + .Take(topTanksToMerge) + .Select(t => t.TankId) + .ToList(); + var topByWinRate = allTanks + .Where(t => topByBattles.Contains(t.TankId)) + .OrderByDescending(t => t.WinRate) + .Take(topTanksToMerge) + .Select(t => t.TankId) + .ToList(); + + var firstIntersection = topByBattles.Intersect(topByWn7).ToList(); + if (!firstIntersection.Any()) + { + return allTanks.First(t => t.TankId == topByBattles.First()); + } + if(firstIntersection.Count() == 1) + { + return allTanks.First(t => t.TankId == firstIntersection.First()); + } + + var secondIntersection = topByDamage.Intersect(firstIntersection).ToList(); + if (!secondIntersection.Any()) + { + return allTanks.First(t => t.TankId == firstIntersection.First()); + } + if (secondIntersection.Count() == 1) + { + return allTanks.First(t => t.TankId == secondIntersection.First()); + } + + var thirdIntersection = topByWinRate.Intersect(secondIntersection).ToList(); + if (!thirdIntersection.Any()) + { + return allTanks.First(t => t.TankId == secondIntersection.First()); + } + if (thirdIntersection.Count() == 1) + { + return allTanks.First(t => t.TankId == thirdIntersection.First()); + } + + return allTanks + .Where(t => thirdIntersection.Contains(t.TankId)) + .OrderByDescending(t => t.AvgXp) + .First(); + } + + } +} \ No newline at end of file diff --git a/WotBlitzStatisticsPro.Blazor/Pages/PlayerInfoOverview.razor b/WotBlitzStatisticsPro.Blazor/Pages/PlayerInfoOverview.razor index 5250d22..1c89bdf 100644 --- a/WotBlitzStatisticsPro.Blazor/Pages/PlayerInfoOverview.razor +++ b/WotBlitzStatisticsPro.Blazor/Pages/PlayerInfoOverview.razor @@ -53,7 +53,7 @@ } -
+
@Localize["Tank with Max frags"] (@AccountInfo.MaxFrags):
@@ -76,7 +76,7 @@ protected override void OnInitialized() { - MostRelevantTank = AccountInfo?.Tanks?.Where(t => t.Battles > 50).OrderByDescending(t => t.Wn7).FirstOrDefault(); + MostRelevantTank = AccountInfo?.Tanks?.FindMostRelevantTank(); MaxXpTank = AccountInfo?.Tanks?.FirstOrDefault(t => t.TankId == AccountInfo.MaxXpTankId); MaxFragsTank = AccountInfo?.Tanks?.FirstOrDefault(t => t.TankId == AccountInfo.MaxFragsTankId); } From b205961d766613f15f7e12aaf4b7ee585b5e9318 Mon Sep 17 00:00:00 2001 From: Mikhail Shabanov Date: Wed, 24 Nov 2021 14:59:10 +0100 Subject: [PATCH 5/5] feat: added tanks winrate tooltip and tank last battle with time --- .../Pages/PlayerInfoLayout.razor | 2 +- .../Pages/PlayerInfoTanksList.razor | 43 ++++++++++--------- WotBlitzStatisticsPro.Blazor/Program.cs | 4 +- 3 files changed, 26 insertions(+), 23 deletions(-) diff --git a/WotBlitzStatisticsPro.Blazor/Pages/PlayerInfoLayout.razor b/WotBlitzStatisticsPro.Blazor/Pages/PlayerInfoLayout.razor index 1225187..15cca5c 100644 --- a/WotBlitzStatisticsPro.Blazor/Pages/PlayerInfoLayout.razor +++ b/WotBlitzStatisticsPro.Blazor/Pages/PlayerInfoLayout.razor @@ -4,7 +4,6 @@ -SmallScreen = @SmallScreen @if (AccountInfo != null) {

@@ -30,6 +29,7 @@ SmallScreen = @SmallScreen + @*TODO: In case of @SmallScreen == true, then show new tanks list component - mobile version *@ diff --git a/WotBlitzStatisticsPro.Blazor/Pages/PlayerInfoTanksList.razor b/WotBlitzStatisticsPro.Blazor/Pages/PlayerInfoTanksList.razor index d102d55..ec64946 100644 --- a/WotBlitzStatisticsPro.Blazor/Pages/PlayerInfoTanksList.razor +++ b/WotBlitzStatisticsPro.Blazor/Pages/PlayerInfoTanksList.razor @@ -83,7 +83,7 @@ @@ -94,7 +94,7 @@ - @TotalBattles.ToString("N0") + @TotalBattles.ToString("N0") @@ -119,8 +119,7 @@ Title="@Localize["Wn7"]" Frozen="false" Width="80px" - TextAlign="TextAlign.Center" - > + TextAlign="TextAlign.Center">