diff --git a/WotBlitzStatisticsPro.Blazor.Tests/Services/GraphQlBackendServiceTests.cs b/WotBlitzStatisticsPro.Blazor.Tests/Services/GraphQlBackendServiceTests.cs index e5b99c6..ac6e285 100644 --- a/WotBlitzStatisticsPro.Blazor.Tests/Services/GraphQlBackendServiceTests.cs +++ b/WotBlitzStatisticsPro.Blazor.Tests/Services/GraphQlBackendServiceTests.cs @@ -13,6 +13,8 @@ namespace WotBlitzStatisticsPro.Blazor.Tests.Services { public class GraphQlBackendServiceTests { + private const long CurrentAccountId = 123456789; + private Mock _findClanQueryMock; private Mock _findPlayersQueryMock; private Mock _playerQueryMock; @@ -30,6 +32,11 @@ namespace WotBlitzStatisticsPro.Blazor.Tests.Services private List _findClansErrors; private Mock> _findClansOperationResultMock; + private Mock _playerInfoResultMock; + private List _playerInfoErrors; + private Mock> _playerInfoOperationResultMock; + + [SetUp] public async Task Init() { @@ -39,6 +46,7 @@ namespace WotBlitzStatisticsPro.Blazor.Tests.Services await SetUpFindClans(); await SetUpFindPlayers(); + await SetUpGetPlayer(); _generatedClient = new WotBlitzStatisticsProClient(_findClanQueryMock.Object, _findPlayersQueryMock.Object, _playerQueryMock.Object); @@ -110,6 +118,39 @@ namespace WotBlitzStatisticsPro.Blazor.Tests.Services _notificationServiceMock.Verify(n => n.ReportError(It.IsAny(), It.IsAny()), Times.Once); } + [Test] + public async Task ShouldCallGetPlayerInfo() + { + var expectedRealm = RealmType.Ru; + _playerInfoOperationResultMock.SetupGet(r => r.Data).Returns(_playerInfoResultMock.Object); + + var playerInfoResponse = await _service.GetPlayerInfo(CurrentAccountId, expectedRealm); + + playerInfoResponse.Should().NotBeNull(); + playerInfoResponse.accountInfo.Should().NotBeNull(); + playerInfoResponse.achievementsBySection.Should().NotBeNull(); + playerInfoResponse.achievementsBySection.Should().NotBeEmpty(); + + _playerQueryMock.Verify(q => q.ExecuteAsync(CurrentAccountId, expectedRealm, It.IsAny(), It.IsAny()), Times.Once); + _notificationServiceMock.Verify(n => n.ReportError(It.IsAny(), It.IsAny()), Times.Never); + } + + [Test] + public async Task ShouldNotifyAboutErrorIfGetPlayerInfoFails() + { + var expectedRealm = RealmType.Ru; + + AddErrorToResult(); + + var playerInfoResponse = await _service.GetPlayerInfo(CurrentAccountId, expectedRealm); + + playerInfoResponse.accountInfo.Should().BeNull(); + playerInfoResponse.achievementsBySection.Should().BeNull(); + + _playerQueryMock.Verify(q => q.ExecuteAsync(CurrentAccountId, expectedRealm, It.IsAny(), It.IsAny()), Times.Once); + _notificationServiceMock.Verify(n => n.ReportError(It.IsAny(), It.IsAny()), Times.Once); + } + private async Task SetUpFindPlayers() { var players = await _mockDataService.FindPlayers("foo", RealmType.Ru); @@ -146,6 +187,25 @@ namespace WotBlitzStatisticsPro.Blazor.Tests.Services .ReturnsAsync(_findClansOperationResultMock.Object); } + private async Task SetUpGetPlayer() + { + var result = await _mockDataService.GetPlayerInfo(CurrentAccountId, RealmType.Ru); + + _playerInfoErrors = new List(); + _playerInfoResultMock = new(); + _playerInfoOperationResultMock = new(); + _playerInfoResultMock.SetupGet(r => r.AccountInfo).Returns(result.accountInfo); + _playerInfoResultMock.SetupGet(r => r.AccountMedals).Returns(new Player_AccountMedals_AccountAchievementsResponse(CurrentAccountId, result.achievementsBySection)); + _playerInfoOperationResultMock.SetupGet(r => r.Errors).Returns(_findClansErrors); + + _playerQueryMock.Setup(q => q.ExecuteAsync( + It.IsAny(), + It.IsAny(), + It.IsAny(), + It.IsAny())) + .ReturnsAsync(_playerInfoOperationResultMock.Object); + } + private void AddErrorToResult() { string graphQlErrorMessage = "{\"errors\": [{\"extensions\": {\"message\": \"GraphQL error message here\"}}]}"; @@ -154,6 +214,7 @@ namespace WotBlitzStatisticsPro.Blazor.Tests.Services error.SetupGet(e => e.Extensions).Returns(errorDetails); _findPlayersErrors.Add(error.Object); _findClansErrors.Add(error.Object); + _playerInfoErrors.Add(error.Object); } } } \ No newline at end of file diff --git a/WotBlitzStatisticsPro.Blazor/Generated/DependencyInjection/WotBlitzStatisticsProClientServiceCollectionExtensions.WotBlitzStatisticsProClient.StrawberryShake.cs b/WotBlitzStatisticsPro.Blazor/Generated/DependencyInjection/WotBlitzStatisticsProClientServiceCollectionExtensions.WotBlitzStatisticsProClient.StrawberryShake.cs index d2fdb92..0bc7af6 100644 --- a/WotBlitzStatisticsPro.Blazor/Generated/DependencyInjection/WotBlitzStatisticsProClientServiceCollectionExtensions.WotBlitzStatisticsProClient.StrawberryShake.cs +++ b/WotBlitzStatisticsPro.Blazor/Generated/DependencyInjection/WotBlitzStatisticsProClientServiceCollectionExtensions.WotBlitzStatisticsProClient.StrawberryShake.cs @@ -32,6 +32,7 @@ namespace Microsoft.Extensions.DependencyInjection var clientFactory = global::Microsoft.Extensions.DependencyInjection.ServiceProviderServiceExtensions.GetRequiredService(parentServices); return new global::StrawberryShake.Transport.Http.HttpConnection(() => clientFactory.CreateClient("WotBlitzStatisticsProClient")); }); + global::Microsoft.Extensions.DependencyInjection.ServiceCollectionServiceExtensions.AddSingleton, global::WotBlitzStatisticsPro.Blazor.GraphQl.State.Player_AccountMedals_Sections_Medals_AchievementFromAchievementEntityMapper>(services); global::Microsoft.Extensions.DependencyInjection.ServiceCollectionServiceExtensions.AddSingleton(services); global::Microsoft.Extensions.DependencyInjection.ServiceCollectionServiceExtensions.AddSingleton(services); global::Microsoft.Extensions.DependencyInjection.ServiceCollectionServiceExtensions.AddSingleton(services); diff --git a/WotBlitzStatisticsPro.Blazor/Generated/IPlayerQuery.WotBlitzStatisticsProClient.StrawberryShake.cs b/WotBlitzStatisticsPro.Blazor/Generated/IPlayerQuery.WotBlitzStatisticsProClient.StrawberryShake.cs index 9df6e85..01abf36 100644 --- a/WotBlitzStatisticsPro.Blazor/Generated/IPlayerQuery.WotBlitzStatisticsProClient.StrawberryShake.cs +++ b/WotBlitzStatisticsPro.Blazor/Generated/IPlayerQuery.WotBlitzStatisticsProClient.StrawberryShake.cs @@ -99,6 +99,33 @@ namespace WotBlitzStatisticsPro.Blazor.GraphQl /// normalImage /// } /// } + /// accountMedals(accountId: $accountId, realmType: $realmType, requestLanguage: $requestLanguage) { + /// __typename + /// accountId + /// sections { + /// __typename + /// sectionId + /// order + /// name + /// medals { + /// __typename + /// id + /// name + /// medalType + /// condition + /// description + /// achievementValue + /// maxSeriesValue + /// image + /// imageBig + /// order + /// sectionId + /// ... on Achievement { + /// id + /// } + /// } + /// } + /// } /// } /// /// diff --git a/WotBlitzStatisticsPro.Blazor/Generated/IPlayerResult.WotBlitzStatisticsProClient.StrawberryShake.cs b/WotBlitzStatisticsPro.Blazor/Generated/IPlayerResult.WotBlitzStatisticsProClient.StrawberryShake.cs index 183fc2c..399c58c 100644 --- a/WotBlitzStatisticsPro.Blazor/Generated/IPlayerResult.WotBlitzStatisticsProClient.StrawberryShake.cs +++ b/WotBlitzStatisticsPro.Blazor/Generated/IPlayerResult.WotBlitzStatisticsProClient.StrawberryShake.cs @@ -10,5 +10,10 @@ namespace WotBlitzStatisticsPro.Blazor.GraphQl /// Gathers all account information /// public global::WotBlitzStatisticsPro.Blazor.GraphQl.IPlayer_AccountInfo AccountInfo { get; } + + /// + /// Returns information about player's achievements + /// + public global::WotBlitzStatisticsPro.Blazor.GraphQl.IPlayer_AccountMedals AccountMedals { get; } } } diff --git a/WotBlitzStatisticsPro.Blazor/Generated/IPlayer_AccountMedals.WotBlitzStatisticsProClient.StrawberryShake.cs b/WotBlitzStatisticsPro.Blazor/Generated/IPlayer_AccountMedals.WotBlitzStatisticsProClient.StrawberryShake.cs new file mode 100644 index 0000000..a8ae1dd --- /dev/null +++ b/WotBlitzStatisticsPro.Blazor/Generated/IPlayer_AccountMedals.WotBlitzStatisticsProClient.StrawberryShake.cs @@ -0,0 +1,22 @@ +// +#nullable enable + +namespace WotBlitzStatisticsPro.Blazor.GraphQl +{ + /// + /// Represents information about player's achievements + /// + [global::System.CodeDom.Compiler.GeneratedCode("StrawberryShake", "11.2.2.0")] + public interface IPlayer_AccountMedals + { + /// + /// Player Id + /// + public global::System.Int64 AccountId { get; } + + /// + /// Player Achievements by sections + /// + public global::System.Collections.Generic.IReadOnlyList? Sections { get; } + } +} diff --git a/WotBlitzStatisticsPro.Blazor/Generated/IPlayer_AccountMedals_AccountAchievementsResponse.WotBlitzStatisticsProClient.StrawberryShake.cs b/WotBlitzStatisticsPro.Blazor/Generated/IPlayer_AccountMedals_AccountAchievementsResponse.WotBlitzStatisticsProClient.StrawberryShake.cs new file mode 100644 index 0000000..d227137 --- /dev/null +++ b/WotBlitzStatisticsPro.Blazor/Generated/IPlayer_AccountMedals_AccountAchievementsResponse.WotBlitzStatisticsProClient.StrawberryShake.cs @@ -0,0 +1,13 @@ +// +#nullable enable + +namespace WotBlitzStatisticsPro.Blazor.GraphQl +{ + /// + /// Represents information about player's achievements + /// + [global::System.CodeDom.Compiler.GeneratedCode("StrawberryShake", "11.2.2.0")] + public interface IPlayer_AccountMedals_AccountAchievementsResponse : IPlayer_AccountMedals + { + } +} diff --git a/WotBlitzStatisticsPro.Blazor/Generated/IPlayer_AccountMedals_Sections.WotBlitzStatisticsProClient.StrawberryShake.cs b/WotBlitzStatisticsPro.Blazor/Generated/IPlayer_AccountMedals_Sections.WotBlitzStatisticsProClient.StrawberryShake.cs new file mode 100644 index 0000000..2f6782d --- /dev/null +++ b/WotBlitzStatisticsPro.Blazor/Generated/IPlayer_AccountMedals_Sections.WotBlitzStatisticsProClient.StrawberryShake.cs @@ -0,0 +1,32 @@ +// +#nullable enable + +namespace WotBlitzStatisticsPro.Blazor.GraphQl +{ + /// + /// Represents achievement section info and it's achievements list + /// + [global::System.CodeDom.Compiler.GeneratedCode("StrawberryShake", "11.2.2.0")] + public interface IPlayer_AccountMedals_Sections + { + /// + /// Section Identifier + /// + public global::System.String SectionId { get; } + + /// + /// Section order + /// + public global::System.Int32 Order { get; } + + /// + /// Section Name + /// + public global::System.String Name { get; } + + /// + /// Achievements in the section + /// + public global::System.Collections.Generic.IReadOnlyList? Medals { get; } + } +} diff --git a/WotBlitzStatisticsPro.Blazor/Generated/IPlayer_AccountMedals_Sections_AchievementSection.WotBlitzStatisticsProClient.StrawberryShake.cs b/WotBlitzStatisticsPro.Blazor/Generated/IPlayer_AccountMedals_Sections_AchievementSection.WotBlitzStatisticsProClient.StrawberryShake.cs new file mode 100644 index 0000000..d62aaea --- /dev/null +++ b/WotBlitzStatisticsPro.Blazor/Generated/IPlayer_AccountMedals_Sections_AchievementSection.WotBlitzStatisticsProClient.StrawberryShake.cs @@ -0,0 +1,13 @@ +// +#nullable enable + +namespace WotBlitzStatisticsPro.Blazor.GraphQl +{ + /// + /// Represents achievement section info and it's achievements list + /// + [global::System.CodeDom.Compiler.GeneratedCode("StrawberryShake", "11.2.2.0")] + public interface IPlayer_AccountMedals_Sections_AchievementSection : IPlayer_AccountMedals_Sections + { + } +} diff --git a/WotBlitzStatisticsPro.Blazor/Generated/IPlayer_AccountMedals_Sections_Medals.WotBlitzStatisticsProClient.StrawberryShake.cs b/WotBlitzStatisticsPro.Blazor/Generated/IPlayer_AccountMedals_Sections_Medals.WotBlitzStatisticsProClient.StrawberryShake.cs new file mode 100644 index 0000000..6fd3a18 --- /dev/null +++ b/WotBlitzStatisticsPro.Blazor/Generated/IPlayer_AccountMedals_Sections_Medals.WotBlitzStatisticsProClient.StrawberryShake.cs @@ -0,0 +1,67 @@ +// +#nullable enable + +namespace WotBlitzStatisticsPro.Blazor.GraphQl +{ + /// + /// Player's achievement information + /// + [global::System.CodeDom.Compiler.GeneratedCode("StrawberryShake", "11.2.2.0")] + public interface IPlayer_AccountMedals_Sections_Medals + { + /// + /// Achievement Id + /// + public global::System.String Id { get; } + + /// + /// Achievement name + /// + public global::System.String? Name { get; } + + /// + /// Achievement type + /// + public global::System.String? MedalType { get; } + + /// + /// Achievement condition + /// + public global::System.String? Condition { get; } + + /// + /// Achievement description + /// + public global::System.String? Description { get; } + + /// + /// Achievement value + /// + public global::System.Int32 AchievementValue { get; } + + /// + /// Achievement max series value + /// + public global::System.Int32? MaxSeriesValue { get; } + + /// + /// Achievement normal sized image + /// + public global::System.String? Image { get; } + + /// + /// Achievement big image + /// + public global::System.String? ImageBig { get; } + + /// + /// Order + /// + public global::System.Int64? Order { get; } + + /// + /// Section Id + /// + public global::System.String SectionId { get; } + } +} diff --git a/WotBlitzStatisticsPro.Blazor/Generated/IPlayer_AccountMedals_Sections_Medals_Achievement.WotBlitzStatisticsProClient.StrawberryShake.cs b/WotBlitzStatisticsPro.Blazor/Generated/IPlayer_AccountMedals_Sections_Medals_Achievement.WotBlitzStatisticsProClient.StrawberryShake.cs new file mode 100644 index 0000000..2781c77 --- /dev/null +++ b/WotBlitzStatisticsPro.Blazor/Generated/IPlayer_AccountMedals_Sections_Medals_Achievement.WotBlitzStatisticsProClient.StrawberryShake.cs @@ -0,0 +1,13 @@ +// +#nullable enable + +namespace WotBlitzStatisticsPro.Blazor.GraphQl +{ + /// + /// Player's achievement information + /// + [global::System.CodeDom.Compiler.GeneratedCode("StrawberryShake", "11.2.2.0")] + public interface IPlayer_AccountMedals_Sections_Medals_Achievement : IPlayer_AccountMedals_Sections_Medals + { + } +} diff --git a/WotBlitzStatisticsPro.Blazor/Generated/PlayerQuery.WotBlitzStatisticsProClient.StrawberryShake.cs b/WotBlitzStatisticsPro.Blazor/Generated/PlayerQuery.WotBlitzStatisticsProClient.StrawberryShake.cs index d4825a7..dbf0cc0 100644 --- a/WotBlitzStatisticsPro.Blazor/Generated/PlayerQuery.WotBlitzStatisticsProClient.StrawberryShake.cs +++ b/WotBlitzStatisticsPro.Blazor/Generated/PlayerQuery.WotBlitzStatisticsProClient.StrawberryShake.cs @@ -99,6 +99,33 @@ namespace WotBlitzStatisticsPro.Blazor.GraphQl /// normalImage /// } /// } + /// accountMedals(accountId: $accountId, realmType: $realmType, requestLanguage: $requestLanguage) { + /// __typename + /// accountId + /// sections { + /// __typename + /// sectionId + /// order + /// name + /// medals { + /// __typename + /// id + /// name + /// medalType + /// condition + /// description + /// achievementValue + /// maxSeriesValue + /// image + /// imageBig + /// order + /// sectionId + /// ... on Achievement { + /// id + /// } + /// } + /// } + /// } /// } /// /// diff --git a/WotBlitzStatisticsPro.Blazor/Generated/PlayerQueryDocument.WotBlitzStatisticsProClient.StrawberryShake.cs b/WotBlitzStatisticsPro.Blazor/Generated/PlayerQueryDocument.WotBlitzStatisticsProClient.StrawberryShake.cs index a77924b..0fe3ad4 100644 --- a/WotBlitzStatisticsPro.Blazor/Generated/PlayerQueryDocument.WotBlitzStatisticsProClient.StrawberryShake.cs +++ b/WotBlitzStatisticsPro.Blazor/Generated/PlayerQueryDocument.WotBlitzStatisticsProClient.StrawberryShake.cs @@ -99,6 +99,33 @@ namespace WotBlitzStatisticsPro.Blazor.GraphQl /// normalImage /// } /// } + /// accountMedals(accountId: $accountId, realmType: $realmType, requestLanguage: $requestLanguage) { + /// __typename + /// accountId + /// sections { + /// __typename + /// sectionId + /// order + /// name + /// medals { + /// __typename + /// id + /// name + /// medalType + /// condition + /// description + /// achievementValue + /// maxSeriesValue + /// image + /// imageBig + /// order + /// sectionId + /// ... on Achievement { + /// id + /// } + /// } + /// } + /// } /// } /// /// @@ -111,8 +138,8 @@ namespace WotBlitzStatisticsPro.Blazor.GraphQl public static PlayerQueryDocument Instance { get; } = new PlayerQueryDocument(); public global::StrawberryShake.OperationKind Kind => global::StrawberryShake.OperationKind.Query; - public global::System.ReadOnlySpan Body => new global::System.Byte[]{0x71, 0x75, 0x65, 0x72, 0x79, 0x20, 0x50, 0x6c, 0x61, 0x79, 0x65, 0x72, 0x28, 0x24, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x49, 0x64, 0x3a, 0x20, 0x4c, 0x6f, 0x6e, 0x67, 0x21, 0x2c, 0x20, 0x24, 0x72, 0x65, 0x61, 0x6c, 0x6d, 0x54, 0x79, 0x70, 0x65, 0x3a, 0x20, 0x52, 0x65, 0x61, 0x6c, 0x6d, 0x54, 0x79, 0x70, 0x65, 0x21, 0x2c, 0x20, 0x24, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x4c, 0x61, 0x6e, 0x67, 0x75, 0x61, 0x67, 0x65, 0x3a, 0x20, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x4c, 0x61, 0x6e, 0x67, 0x75, 0x61, 0x67, 0x65, 0x21, 0x29, 0x20, 0x7b, 0x20, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x28, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x49, 0x64, 0x3a, 0x20, 0x24, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x49, 0x64, 0x2c, 0x20, 0x72, 0x65, 0x61, 0x6c, 0x6d, 0x54, 0x79, 0x70, 0x65, 0x3a, 0x20, 0x24, 0x72, 0x65, 0x61, 0x6c, 0x6d, 0x54, 0x79, 0x70, 0x65, 0x2c, 0x20, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x4c, 0x61, 0x6e, 0x67, 0x75, 0x61, 0x67, 0x65, 0x3a, 0x20, 0x24, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x4c, 0x61, 0x6e, 0x67, 0x75, 0x61, 0x67, 0x65, 0x29, 0x20, 0x7b, 0x20, 0x5f, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x6e, 0x61, 0x6d, 0x65, 0x20, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x49, 0x64, 0x20, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x41, 0x74, 0x20, 0x6c, 0x61, 0x73, 0x74, 0x42, 0x61, 0x74, 0x74, 0x6c, 0x65, 0x54, 0x69, 0x6d, 0x65, 0x20, 0x6e, 0x69, 0x63, 0x6b, 0x6e, 0x61, 0x6d, 0x65, 0x20, 0x6d, 0x61, 0x78, 0x46, 0x72, 0x61, 0x67, 0x73, 0x54, 0x61, 0x6e, 0x6b, 0x49, 0x64, 0x20, 0x6d, 0x61, 0x78, 0x58, 0x70, 0x54, 0x61, 0x6e, 0x6b, 0x49, 0x64, 0x20, 0x62, 0x61, 0x74, 0x74, 0x6c, 0x65, 0x73, 0x20, 0x63, 0x61, 0x70, 0x74, 0x75, 0x72, 0x65, 0x50, 0x6f, 0x69, 0x6e, 0x74, 0x73, 0x20, 0x64, 0x61, 0x6d, 0x61, 0x67, 0x65, 0x44, 0x65, 0x61, 0x6c, 0x74, 0x20, 0x64, 0x61, 0x6d, 0x61, 0x67, 0x65, 0x52, 0x65, 0x63, 0x65, 0x69, 0x76, 0x65, 0x64, 0x20, 0x64, 0x72, 0x6f, 0x70, 0x70, 0x65, 0x64, 0x43, 0x61, 0x70, 0x74, 0x75, 0x72, 0x65, 0x50, 0x6f, 0x69, 0x6e, 0x74, 0x73, 0x20, 0x66, 0x72, 0x61, 0x67, 0x73, 0x20, 0x66, 0x72, 0x61, 0x67, 0x73, 0x38, 0x50, 0x20, 0x68, 0x69, 0x74, 0x73, 0x20, 0x6c, 0x6f, 0x73, 0x73, 0x65, 0x73, 0x20, 0x6d, 0x61, 0x78, 0x46, 0x72, 0x61, 0x67, 0x73, 0x20, 0x6d, 0x61, 0x78, 0x58, 0x70, 0x20, 0x73, 0x68, 0x6f, 0x74, 0x73, 0x20, 0x73, 0x70, 0x6f, 0x74, 0x74, 0x65, 0x64, 0x20, 0x73, 0x75, 0x72, 0x76, 0x69, 0x76, 0x65, 0x64, 0x42, 0x61, 0x74, 0x74, 0x6c, 0x65, 0x73, 0x20, 0x77, 0x69, 0x6e, 0x41, 0x6e, 0x64, 0x53, 0x75, 0x72, 0x76, 0x69, 0x76, 0x65, 0x64, 0x20, 0x77, 0x69, 0x6e, 0x73, 0x20, 0x78, 0x70, 0x20, 0x77, 0x6e, 0x37, 0x20, 0x77, 0x69, 0x6e, 0x52, 0x61, 0x74, 0x65, 0x20, 0x61, 0x76, 0x67, 0x44, 0x61, 0x6d, 0x61, 0x67, 0x65, 0x20, 0x61, 0x76, 0x67, 0x58, 0x70, 0x20, 0x64, 0x61, 0x6d, 0x61, 0x67, 0x65, 0x43, 0x6f, 0x65, 0x66, 0x66, 0x69, 0x63, 0x69, 0x65, 0x6e, 0x74, 0x20, 0x73, 0x75, 0x72, 0x76, 0x69, 0x76, 0x61, 0x6c, 0x52, 0x61, 0x74, 0x65, 0x20, 0x61, 0x76, 0x67, 0x54, 0x69, 0x65, 0x72, 0x20, 0x63, 0x6c, 0x61, 0x6e, 0x49, 0x6e, 0x66, 0x6f, 0x20, 0x7b, 0x20, 0x5f, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x6e, 0x61, 0x6d, 0x65, 0x20, 0x63, 0x6c, 0x61, 0x6e, 0x49, 0x64, 0x20, 0x6a, 0x6f, 0x69, 0x6e, 0x65, 0x64, 0x41, 0x74, 0x20, 0x72, 0x6f, 0x6c, 0x65, 0x20, 0x72, 0x6f, 0x6c, 0x65, 0x4c, 0x6f, 0x63, 0x61, 0x6c, 0x69, 0x7a, 0x65, 0x64, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x20, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x41, 0x74, 0x20, 0x63, 0x72, 0x65, 0x61, 0x74, 0x6f, 0x72, 0x49, 0x64, 0x20, 0x63, 0x72, 0x65, 0x61, 0x74, 0x6f, 0x72, 0x4e, 0x61, 0x6d, 0x65, 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x48, 0x74, 0x6d, 0x6c, 0x20, 0x6c, 0x65, 0x61, 0x64, 0x65, 0x72, 0x49, 0x64, 0x20, 0x6c, 0x65, 0x61, 0x64, 0x65, 0x72, 0x4e, 0x61, 0x6d, 0x65, 0x20, 0x6d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x73, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x20, 0x6d, 0x6f, 0x74, 0x74, 0x6f, 0x20, 0x74, 0x61, 0x67, 0x20, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, 0x41, 0x74, 0x20, 0x7d, 0x20, 0x74, 0x61, 0x6e, 0x6b, 0x73, 0x20, 0x7b, 0x20, 0x5f, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x6e, 0x61, 0x6d, 0x65, 0x20, 0x74, 0x61, 0x6e, 0x6b, 0x49, 0x64, 0x20, 0x62, 0x61, 0x74, 0x74, 0x6c, 0x65, 0x4c, 0x69, 0x66, 0x65, 0x54, 0x69, 0x6d, 0x65, 0x49, 0x6e, 0x53, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x73, 0x20, 0x6c, 0x61, 0x73, 0x74, 0x42, 0x61, 0x74, 0x74, 0x6c, 0x65, 0x54, 0x69, 0x6d, 0x65, 0x20, 0x6d, 0x61, 0x72, 0x6b, 0x4f, 0x66, 0x4d, 0x61, 0x73, 0x74, 0x65, 0x72, 0x79, 0x20, 0x62, 0x61, 0x74, 0x74, 0x6c, 0x65, 0x73, 0x20, 0x63, 0x61, 0x70, 0x74, 0x75, 0x72, 0x65, 0x50, 0x6f, 0x69, 0x6e, 0x74, 0x73, 0x20, 0x64, 0x61, 0x6d, 0x61, 0x67, 0x65, 0x44, 0x65, 0x61, 0x6c, 0x74, 0x20, 0x64, 0x61, 0x6d, 0x61, 0x67, 0x65, 0x52, 0x65, 0x63, 0x65, 0x69, 0x76, 0x65, 0x64, 0x20, 0x64, 0x72, 0x6f, 0x70, 0x70, 0x65, 0x64, 0x43, 0x61, 0x70, 0x74, 0x75, 0x72, 0x65, 0x50, 0x6f, 0x69, 0x6e, 0x74, 0x73, 0x20, 0x66, 0x72, 0x61, 0x67, 0x73, 0x20, 0x66, 0x72, 0x61, 0x67, 0x73, 0x38, 0x50, 0x20, 0x68, 0x69, 0x74, 0x73, 0x20, 0x6c, 0x6f, 0x73, 0x73, 0x65, 0x73, 0x20, 0x6d, 0x61, 0x78, 0x46, 0x72, 0x61, 0x67, 0x73, 0x20, 0x6d, 0x61, 0x78, 0x58, 0x70, 0x20, 0x73, 0x68, 0x6f, 0x74, 0x73, 0x20, 0x73, 0x70, 0x6f, 0x74, 0x74, 0x65, 0x64, 0x20, 0x73, 0x75, 0x72, 0x76, 0x69, 0x76, 0x65, 0x64, 0x42, 0x61, 0x74, 0x74, 0x6c, 0x65, 0x73, 0x20, 0x77, 0x69, 0x6e, 0x41, 0x6e, 0x64, 0x53, 0x75, 0x72, 0x76, 0x69, 0x76, 0x65, 0x64, 0x20, 0x77, 0x69, 0x6e, 0x73, 0x20, 0x78, 0x70, 0x20, 0x77, 0x6e, 0x37, 0x20, 0x77, 0x69, 0x6e, 0x52, 0x61, 0x74, 0x65, 0x20, 0x61, 0x76, 0x67, 0x44, 0x61, 0x6d, 0x61, 0x67, 0x65, 0x20, 0x61, 0x76, 0x67, 0x58, 0x70, 0x20, 0x64, 0x61, 0x6d, 0x61, 0x67, 0x65, 0x43, 0x6f, 0x65, 0x66, 0x66, 0x69, 0x63, 0x69, 0x65, 0x6e, 0x74, 0x20, 0x73, 0x75, 0x72, 0x76, 0x69, 0x76, 0x61, 0x6c, 0x52, 0x61, 0x74, 0x65, 0x20, 0x61, 0x76, 0x67, 0x42, 0x61, 0x74, 0x74, 0x6c, 0x65, 0x4c, 0x69, 0x66, 0x65, 0x54, 0x69, 0x6d, 0x65, 0x49, 0x6e, 0x4d, 0x69, 0x6e, 0x75, 0x74, 0x65, 0x73, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x20, 0x74, 0x61, 0x6e, 0x6b, 0x4e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x20, 0x74, 0x61, 0x6e, 0x6b, 0x4e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x74, 0x69, 0x65, 0x72, 0x20, 0x74, 0x61, 0x6e, 0x6b, 0x54, 0x79, 0x70, 0x65, 0x49, 0x64, 0x20, 0x74, 0x61, 0x6e, 0x6b, 0x54, 0x79, 0x70, 0x65, 0x20, 0x69, 0x73, 0x50, 0x72, 0x65, 0x6d, 0x69, 0x75, 0x6d, 0x20, 0x70, 0x72, 0x65, 0x76, 0x69, 0x65, 0x77, 0x49, 0x6d, 0x61, 0x67, 0x65, 0x20, 0x6e, 0x6f, 0x72, 0x6d, 0x61, 0x6c, 0x49, 0x6d, 0x61, 0x67, 0x65, 0x20, 0x7d, 0x20, 0x7d, 0x20, 0x7d}; - public global::StrawberryShake.DocumentHash Hash { get; } = new global::StrawberryShake.DocumentHash("md5Hash", "15d5e03ef055dc951c047827ff49084b"); + public global::System.ReadOnlySpan Body => new global::System.Byte[]{0x71, 0x75, 0x65, 0x72, 0x79, 0x20, 0x50, 0x6c, 0x61, 0x79, 0x65, 0x72, 0x28, 0x24, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x49, 0x64, 0x3a, 0x20, 0x4c, 0x6f, 0x6e, 0x67, 0x21, 0x2c, 0x20, 0x24, 0x72, 0x65, 0x61, 0x6c, 0x6d, 0x54, 0x79, 0x70, 0x65, 0x3a, 0x20, 0x52, 0x65, 0x61, 0x6c, 0x6d, 0x54, 0x79, 0x70, 0x65, 0x21, 0x2c, 0x20, 0x24, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x4c, 0x61, 0x6e, 0x67, 0x75, 0x61, 0x67, 0x65, 0x3a, 0x20, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x4c, 0x61, 0x6e, 0x67, 0x75, 0x61, 0x67, 0x65, 0x21, 0x29, 0x20, 0x7b, 0x20, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x28, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x49, 0x64, 0x3a, 0x20, 0x24, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x49, 0x64, 0x2c, 0x20, 0x72, 0x65, 0x61, 0x6c, 0x6d, 0x54, 0x79, 0x70, 0x65, 0x3a, 0x20, 0x24, 0x72, 0x65, 0x61, 0x6c, 0x6d, 0x54, 0x79, 0x70, 0x65, 0x2c, 0x20, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x4c, 0x61, 0x6e, 0x67, 0x75, 0x61, 0x67, 0x65, 0x3a, 0x20, 0x24, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x4c, 0x61, 0x6e, 0x67, 0x75, 0x61, 0x67, 0x65, 0x29, 0x20, 0x7b, 0x20, 0x5f, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x6e, 0x61, 0x6d, 0x65, 0x20, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x49, 0x64, 0x20, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x41, 0x74, 0x20, 0x6c, 0x61, 0x73, 0x74, 0x42, 0x61, 0x74, 0x74, 0x6c, 0x65, 0x54, 0x69, 0x6d, 0x65, 0x20, 0x6e, 0x69, 0x63, 0x6b, 0x6e, 0x61, 0x6d, 0x65, 0x20, 0x6d, 0x61, 0x78, 0x46, 0x72, 0x61, 0x67, 0x73, 0x54, 0x61, 0x6e, 0x6b, 0x49, 0x64, 0x20, 0x6d, 0x61, 0x78, 0x58, 0x70, 0x54, 0x61, 0x6e, 0x6b, 0x49, 0x64, 0x20, 0x62, 0x61, 0x74, 0x74, 0x6c, 0x65, 0x73, 0x20, 0x63, 0x61, 0x70, 0x74, 0x75, 0x72, 0x65, 0x50, 0x6f, 0x69, 0x6e, 0x74, 0x73, 0x20, 0x64, 0x61, 0x6d, 0x61, 0x67, 0x65, 0x44, 0x65, 0x61, 0x6c, 0x74, 0x20, 0x64, 0x61, 0x6d, 0x61, 0x67, 0x65, 0x52, 0x65, 0x63, 0x65, 0x69, 0x76, 0x65, 0x64, 0x20, 0x64, 0x72, 0x6f, 0x70, 0x70, 0x65, 0x64, 0x43, 0x61, 0x70, 0x74, 0x75, 0x72, 0x65, 0x50, 0x6f, 0x69, 0x6e, 0x74, 0x73, 0x20, 0x66, 0x72, 0x61, 0x67, 0x73, 0x20, 0x66, 0x72, 0x61, 0x67, 0x73, 0x38, 0x50, 0x20, 0x68, 0x69, 0x74, 0x73, 0x20, 0x6c, 0x6f, 0x73, 0x73, 0x65, 0x73, 0x20, 0x6d, 0x61, 0x78, 0x46, 0x72, 0x61, 0x67, 0x73, 0x20, 0x6d, 0x61, 0x78, 0x58, 0x70, 0x20, 0x73, 0x68, 0x6f, 0x74, 0x73, 0x20, 0x73, 0x70, 0x6f, 0x74, 0x74, 0x65, 0x64, 0x20, 0x73, 0x75, 0x72, 0x76, 0x69, 0x76, 0x65, 0x64, 0x42, 0x61, 0x74, 0x74, 0x6c, 0x65, 0x73, 0x20, 0x77, 0x69, 0x6e, 0x41, 0x6e, 0x64, 0x53, 0x75, 0x72, 0x76, 0x69, 0x76, 0x65, 0x64, 0x20, 0x77, 0x69, 0x6e, 0x73, 0x20, 0x78, 0x70, 0x20, 0x77, 0x6e, 0x37, 0x20, 0x77, 0x69, 0x6e, 0x52, 0x61, 0x74, 0x65, 0x20, 0x61, 0x76, 0x67, 0x44, 0x61, 0x6d, 0x61, 0x67, 0x65, 0x20, 0x61, 0x76, 0x67, 0x58, 0x70, 0x20, 0x64, 0x61, 0x6d, 0x61, 0x67, 0x65, 0x43, 0x6f, 0x65, 0x66, 0x66, 0x69, 0x63, 0x69, 0x65, 0x6e, 0x74, 0x20, 0x73, 0x75, 0x72, 0x76, 0x69, 0x76, 0x61, 0x6c, 0x52, 0x61, 0x74, 0x65, 0x20, 0x61, 0x76, 0x67, 0x54, 0x69, 0x65, 0x72, 0x20, 0x63, 0x6c, 0x61, 0x6e, 0x49, 0x6e, 0x66, 0x6f, 0x20, 0x7b, 0x20, 0x5f, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x6e, 0x61, 0x6d, 0x65, 0x20, 0x63, 0x6c, 0x61, 0x6e, 0x49, 0x64, 0x20, 0x6a, 0x6f, 0x69, 0x6e, 0x65, 0x64, 0x41, 0x74, 0x20, 0x72, 0x6f, 0x6c, 0x65, 0x20, 0x72, 0x6f, 0x6c, 0x65, 0x4c, 0x6f, 0x63, 0x61, 0x6c, 0x69, 0x7a, 0x65, 0x64, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x20, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x41, 0x74, 0x20, 0x63, 0x72, 0x65, 0x61, 0x74, 0x6f, 0x72, 0x49, 0x64, 0x20, 0x63, 0x72, 0x65, 0x61, 0x74, 0x6f, 0x72, 0x4e, 0x61, 0x6d, 0x65, 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x48, 0x74, 0x6d, 0x6c, 0x20, 0x6c, 0x65, 0x61, 0x64, 0x65, 0x72, 0x49, 0x64, 0x20, 0x6c, 0x65, 0x61, 0x64, 0x65, 0x72, 0x4e, 0x61, 0x6d, 0x65, 0x20, 0x6d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x73, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x20, 0x6d, 0x6f, 0x74, 0x74, 0x6f, 0x20, 0x74, 0x61, 0x67, 0x20, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, 0x41, 0x74, 0x20, 0x7d, 0x20, 0x74, 0x61, 0x6e, 0x6b, 0x73, 0x20, 0x7b, 0x20, 0x5f, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x6e, 0x61, 0x6d, 0x65, 0x20, 0x74, 0x61, 0x6e, 0x6b, 0x49, 0x64, 0x20, 0x62, 0x61, 0x74, 0x74, 0x6c, 0x65, 0x4c, 0x69, 0x66, 0x65, 0x54, 0x69, 0x6d, 0x65, 0x49, 0x6e, 0x53, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x73, 0x20, 0x6c, 0x61, 0x73, 0x74, 0x42, 0x61, 0x74, 0x74, 0x6c, 0x65, 0x54, 0x69, 0x6d, 0x65, 0x20, 0x6d, 0x61, 0x72, 0x6b, 0x4f, 0x66, 0x4d, 0x61, 0x73, 0x74, 0x65, 0x72, 0x79, 0x20, 0x62, 0x61, 0x74, 0x74, 0x6c, 0x65, 0x73, 0x20, 0x63, 0x61, 0x70, 0x74, 0x75, 0x72, 0x65, 0x50, 0x6f, 0x69, 0x6e, 0x74, 0x73, 0x20, 0x64, 0x61, 0x6d, 0x61, 0x67, 0x65, 0x44, 0x65, 0x61, 0x6c, 0x74, 0x20, 0x64, 0x61, 0x6d, 0x61, 0x67, 0x65, 0x52, 0x65, 0x63, 0x65, 0x69, 0x76, 0x65, 0x64, 0x20, 0x64, 0x72, 0x6f, 0x70, 0x70, 0x65, 0x64, 0x43, 0x61, 0x70, 0x74, 0x75, 0x72, 0x65, 0x50, 0x6f, 0x69, 0x6e, 0x74, 0x73, 0x20, 0x66, 0x72, 0x61, 0x67, 0x73, 0x20, 0x66, 0x72, 0x61, 0x67, 0x73, 0x38, 0x50, 0x20, 0x68, 0x69, 0x74, 0x73, 0x20, 0x6c, 0x6f, 0x73, 0x73, 0x65, 0x73, 0x20, 0x6d, 0x61, 0x78, 0x46, 0x72, 0x61, 0x67, 0x73, 0x20, 0x6d, 0x61, 0x78, 0x58, 0x70, 0x20, 0x73, 0x68, 0x6f, 0x74, 0x73, 0x20, 0x73, 0x70, 0x6f, 0x74, 0x74, 0x65, 0x64, 0x20, 0x73, 0x75, 0x72, 0x76, 0x69, 0x76, 0x65, 0x64, 0x42, 0x61, 0x74, 0x74, 0x6c, 0x65, 0x73, 0x20, 0x77, 0x69, 0x6e, 0x41, 0x6e, 0x64, 0x53, 0x75, 0x72, 0x76, 0x69, 0x76, 0x65, 0x64, 0x20, 0x77, 0x69, 0x6e, 0x73, 0x20, 0x78, 0x70, 0x20, 0x77, 0x6e, 0x37, 0x20, 0x77, 0x69, 0x6e, 0x52, 0x61, 0x74, 0x65, 0x20, 0x61, 0x76, 0x67, 0x44, 0x61, 0x6d, 0x61, 0x67, 0x65, 0x20, 0x61, 0x76, 0x67, 0x58, 0x70, 0x20, 0x64, 0x61, 0x6d, 0x61, 0x67, 0x65, 0x43, 0x6f, 0x65, 0x66, 0x66, 0x69, 0x63, 0x69, 0x65, 0x6e, 0x74, 0x20, 0x73, 0x75, 0x72, 0x76, 0x69, 0x76, 0x61, 0x6c, 0x52, 0x61, 0x74, 0x65, 0x20, 0x61, 0x76, 0x67, 0x42, 0x61, 0x74, 0x74, 0x6c, 0x65, 0x4c, 0x69, 0x66, 0x65, 0x54, 0x69, 0x6d, 0x65, 0x49, 0x6e, 0x4d, 0x69, 0x6e, 0x75, 0x74, 0x65, 0x73, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x20, 0x74, 0x61, 0x6e, 0x6b, 0x4e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x20, 0x74, 0x61, 0x6e, 0x6b, 0x4e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x74, 0x69, 0x65, 0x72, 0x20, 0x74, 0x61, 0x6e, 0x6b, 0x54, 0x79, 0x70, 0x65, 0x49, 0x64, 0x20, 0x74, 0x61, 0x6e, 0x6b, 0x54, 0x79, 0x70, 0x65, 0x20, 0x69, 0x73, 0x50, 0x72, 0x65, 0x6d, 0x69, 0x75, 0x6d, 0x20, 0x70, 0x72, 0x65, 0x76, 0x69, 0x65, 0x77, 0x49, 0x6d, 0x61, 0x67, 0x65, 0x20, 0x6e, 0x6f, 0x72, 0x6d, 0x61, 0x6c, 0x49, 0x6d, 0x61, 0x67, 0x65, 0x20, 0x7d, 0x20, 0x7d, 0x20, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x4d, 0x65, 0x64, 0x61, 0x6c, 0x73, 0x28, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x49, 0x64, 0x3a, 0x20, 0x24, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x49, 0x64, 0x2c, 0x20, 0x72, 0x65, 0x61, 0x6c, 0x6d, 0x54, 0x79, 0x70, 0x65, 0x3a, 0x20, 0x24, 0x72, 0x65, 0x61, 0x6c, 0x6d, 0x54, 0x79, 0x70, 0x65, 0x2c, 0x20, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x4c, 0x61, 0x6e, 0x67, 0x75, 0x61, 0x67, 0x65, 0x3a, 0x20, 0x24, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x4c, 0x61, 0x6e, 0x67, 0x75, 0x61, 0x67, 0x65, 0x29, 0x20, 0x7b, 0x20, 0x5f, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x6e, 0x61, 0x6d, 0x65, 0x20, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x49, 0x64, 0x20, 0x73, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x20, 0x7b, 0x20, 0x5f, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x6e, 0x61, 0x6d, 0x65, 0x20, 0x73, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x20, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x20, 0x6d, 0x65, 0x64, 0x61, 0x6c, 0x73, 0x20, 0x7b, 0x20, 0x5f, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x6e, 0x61, 0x6d, 0x65, 0x20, 0x69, 0x64, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x20, 0x6d, 0x65, 0x64, 0x61, 0x6c, 0x54, 0x79, 0x70, 0x65, 0x20, 0x63, 0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x61, 0x63, 0x68, 0x69, 0x65, 0x76, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x20, 0x6d, 0x61, 0x78, 0x53, 0x65, 0x72, 0x69, 0x65, 0x73, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x20, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x20, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x42, 0x69, 0x67, 0x20, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x20, 0x73, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x20, 0x2e, 0x2e, 0x2e, 0x20, 0x6f, 0x6e, 0x20, 0x41, 0x63, 0x68, 0x69, 0x65, 0x76, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x20, 0x7b, 0x20, 0x69, 0x64, 0x20, 0x7d, 0x20, 0x7d, 0x20, 0x7d, 0x20, 0x7d, 0x20, 0x7d}; + public global::StrawberryShake.DocumentHash Hash { get; } = new global::StrawberryShake.DocumentHash("md5Hash", "032972243d83d3556ee9d9b34cd35f25"); public override global::System.String ToString() { #if NETSTANDARD2_0 diff --git a/WotBlitzStatisticsPro.Blazor/Generated/PlayerResult.WotBlitzStatisticsProClient.StrawberryShake.cs b/WotBlitzStatisticsPro.Blazor/Generated/PlayerResult.WotBlitzStatisticsProClient.StrawberryShake.cs index a68af84..b2f317b 100644 --- a/WotBlitzStatisticsPro.Blazor/Generated/PlayerResult.WotBlitzStatisticsProClient.StrawberryShake.cs +++ b/WotBlitzStatisticsPro.Blazor/Generated/PlayerResult.WotBlitzStatisticsProClient.StrawberryShake.cs @@ -6,9 +6,10 @@ namespace WotBlitzStatisticsPro.Blazor.GraphQl [global::System.CodeDom.Compiler.GeneratedCode("StrawberryShake", "11.2.2.0")] public partial class PlayerResult : global::System.IEquatable, IPlayerResult { - public PlayerResult(global::WotBlitzStatisticsPro.Blazor.GraphQl.IPlayer_AccountInfo accountInfo) + public PlayerResult(global::WotBlitzStatisticsPro.Blazor.GraphQl.IPlayer_AccountInfo accountInfo, global::WotBlitzStatisticsPro.Blazor.GraphQl.IPlayer_AccountMedals accountMedals) { AccountInfo = accountInfo; + AccountMedals = accountMedals; } /// @@ -16,6 +17,11 @@ namespace WotBlitzStatisticsPro.Blazor.GraphQl /// public global::WotBlitzStatisticsPro.Blazor.GraphQl.IPlayer_AccountInfo AccountInfo { get; } + /// + /// Returns information about player's achievements + /// + public global::WotBlitzStatisticsPro.Blazor.GraphQl.IPlayer_AccountMedals AccountMedals { get; } + public virtual global::System.Boolean Equals(PlayerResult? other) { if (ReferenceEquals(null, other)) @@ -33,7 +39,7 @@ namespace WotBlitzStatisticsPro.Blazor.GraphQl return false; } - return (AccountInfo.Equals(other.AccountInfo)); + return (AccountInfo.Equals(other.AccountInfo)) && AccountMedals.Equals(other.AccountMedals); } public override global::System.Boolean Equals(global::System.Object? obj) @@ -62,6 +68,7 @@ namespace WotBlitzStatisticsPro.Blazor.GraphQl { int hash = 5; hash ^= 397 * AccountInfo.GetHashCode(); + hash ^= 397 * AccountMedals.GetHashCode(); return hash; } } diff --git a/WotBlitzStatisticsPro.Blazor/Generated/Player_AccountMedals_AccountAchievementsResponse.WotBlitzStatisticsProClient.StrawberryShake.cs b/WotBlitzStatisticsPro.Blazor/Generated/Player_AccountMedals_AccountAchievementsResponse.WotBlitzStatisticsProClient.StrawberryShake.cs new file mode 100644 index 0000000..9b749fb --- /dev/null +++ b/WotBlitzStatisticsPro.Blazor/Generated/Player_AccountMedals_AccountAchievementsResponse.WotBlitzStatisticsProClient.StrawberryShake.cs @@ -0,0 +1,86 @@ +// +#nullable enable + +namespace WotBlitzStatisticsPro.Blazor.GraphQl +{ + /// + /// Represents information about player's achievements + /// + [global::System.CodeDom.Compiler.GeneratedCode("StrawberryShake", "11.2.2.0")] + public partial class Player_AccountMedals_AccountAchievementsResponse : global::System.IEquatable, IPlayer_AccountMedals_AccountAchievementsResponse + { + public Player_AccountMedals_AccountAchievementsResponse(global::System.Int64 accountId, global::System.Collections.Generic.IReadOnlyList? sections) + { + AccountId = accountId; + Sections = sections; + } + + /// + /// Player Id + /// + public global::System.Int64 AccountId { get; } + + /// + /// Player Achievements by sections + /// + public global::System.Collections.Generic.IReadOnlyList? Sections { get; } + + public virtual global::System.Boolean Equals(Player_AccountMedals_AccountAchievementsResponse? other) + { + if (ReferenceEquals(null, other)) + { + return false; + } + + if (ReferenceEquals(this, other)) + { + return true; + } + + if (other.GetType() != GetType()) + { + return false; + } + + return (AccountId == other.AccountId) && global::StrawberryShake.Helper.ComparisonHelper.SequenceEqual(Sections, other.Sections); + } + + public override global::System.Boolean Equals(global::System.Object? obj) + { + if (ReferenceEquals(null, obj)) + { + return false; + } + + if (ReferenceEquals(this, obj)) + { + return true; + } + + if (obj.GetType() != GetType()) + { + return false; + } + + return Equals((Player_AccountMedals_AccountAchievementsResponse)obj); + } + + public override global::System.Int32 GetHashCode() + { + unchecked + { + int hash = 5; + hash ^= 397 * AccountId.GetHashCode(); + if (Sections != null) + { + foreach (var Sections_elm in Sections) + { + hash ^= 397 * Sections_elm.GetHashCode(); + } + } + + return hash; + } + } + } +} diff --git a/WotBlitzStatisticsPro.Blazor/Generated/Player_AccountMedals_Sections_AchievementSection.WotBlitzStatisticsProClient.StrawberryShake.cs b/WotBlitzStatisticsPro.Blazor/Generated/Player_AccountMedals_Sections_AchievementSection.WotBlitzStatisticsProClient.StrawberryShake.cs new file mode 100644 index 0000000..04aea34 --- /dev/null +++ b/WotBlitzStatisticsPro.Blazor/Generated/Player_AccountMedals_Sections_AchievementSection.WotBlitzStatisticsProClient.StrawberryShake.cs @@ -0,0 +1,100 @@ +// +#nullable enable + +namespace WotBlitzStatisticsPro.Blazor.GraphQl +{ + /// + /// Represents achievement section info and it's achievements list + /// + [global::System.CodeDom.Compiler.GeneratedCode("StrawberryShake", "11.2.2.0")] + public partial class Player_AccountMedals_Sections_AchievementSection : global::System.IEquatable, IPlayer_AccountMedals_Sections_AchievementSection + { + public Player_AccountMedals_Sections_AchievementSection(global::System.String sectionId, global::System.Int32 order, global::System.String name, global::System.Collections.Generic.IReadOnlyList? medals) + { + SectionId = sectionId; + Order = order; + Name = name; + Medals = medals; + } + + /// + /// Section Identifier + /// + public global::System.String SectionId { get; } + + /// + /// Section order + /// + public global::System.Int32 Order { get; } + + /// + /// Section Name + /// + public global::System.String Name { get; } + + /// + /// Achievements in the section + /// + public global::System.Collections.Generic.IReadOnlyList? Medals { get; } + + public virtual global::System.Boolean Equals(Player_AccountMedals_Sections_AchievementSection? other) + { + if (ReferenceEquals(null, other)) + { + return false; + } + + if (ReferenceEquals(this, other)) + { + return true; + } + + if (other.GetType() != GetType()) + { + return false; + } + + return (SectionId.Equals(other.SectionId)) && Order == other.Order && Name.Equals(other.Name) && global::StrawberryShake.Helper.ComparisonHelper.SequenceEqual(Medals, other.Medals); + } + + public override global::System.Boolean Equals(global::System.Object? obj) + { + if (ReferenceEquals(null, obj)) + { + return false; + } + + if (ReferenceEquals(this, obj)) + { + return true; + } + + if (obj.GetType() != GetType()) + { + return false; + } + + return Equals((Player_AccountMedals_Sections_AchievementSection)obj); + } + + public override global::System.Int32 GetHashCode() + { + unchecked + { + int hash = 5; + hash ^= 397 * SectionId.GetHashCode(); + hash ^= 397 * Order.GetHashCode(); + hash ^= 397 * Name.GetHashCode(); + if (Medals != null) + { + foreach (var Medals_elm in Medals) + { + hash ^= 397 * Medals_elm.GetHashCode(); + } + } + + return hash; + } + } + } +} diff --git a/WotBlitzStatisticsPro.Blazor/Generated/Player_AccountMedals_Sections_Medals_Achievement.WotBlitzStatisticsProClient.StrawberryShake.cs b/WotBlitzStatisticsPro.Blazor/Generated/Player_AccountMedals_Sections_Medals_Achievement.WotBlitzStatisticsProClient.StrawberryShake.cs new file mode 100644 index 0000000..6ccb105 --- /dev/null +++ b/WotBlitzStatisticsPro.Blazor/Generated/Player_AccountMedals_Sections_Medals_Achievement.WotBlitzStatisticsProClient.StrawberryShake.cs @@ -0,0 +1,174 @@ +// +#nullable enable + +namespace WotBlitzStatisticsPro.Blazor.GraphQl +{ + /// + /// Player's achievement information + /// + [global::System.CodeDom.Compiler.GeneratedCode("StrawberryShake", "11.2.2.0")] + public partial class Player_AccountMedals_Sections_Medals_Achievement : global::System.IEquatable, IPlayer_AccountMedals_Sections_Medals_Achievement + { + public Player_AccountMedals_Sections_Medals_Achievement(global::System.String id, global::System.String? name, global::System.String? medalType, global::System.String? condition, global::System.String? description, global::System.Int32 achievementValue, global::System.Int32? maxSeriesValue, global::System.String? image, global::System.String? imageBig, global::System.Int64? order, global::System.String sectionId) + { + Id = id; + Name = name; + MedalType = medalType; + Condition = condition; + Description = description; + AchievementValue = achievementValue; + MaxSeriesValue = maxSeriesValue; + Image = image; + ImageBig = imageBig; + Order = order; + SectionId = sectionId; + } + + /// + /// Achievement Id + /// + public global::System.String Id { get; } + + /// + /// Achievement name + /// + public global::System.String? Name { get; } + + /// + /// Achievement type + /// + public global::System.String? MedalType { get; } + + /// + /// Achievement condition + /// + public global::System.String? Condition { get; } + + /// + /// Achievement description + /// + public global::System.String? Description { get; } + + /// + /// Achievement value + /// + public global::System.Int32 AchievementValue { get; } + + /// + /// Achievement max series value + /// + public global::System.Int32? MaxSeriesValue { get; } + + /// + /// Achievement normal sized image + /// + public global::System.String? Image { get; } + + /// + /// Achievement big image + /// + public global::System.String? ImageBig { get; } + + /// + /// Order + /// + public global::System.Int64? Order { get; } + + /// + /// Section Id + /// + public global::System.String SectionId { get; } + + public virtual global::System.Boolean Equals(Player_AccountMedals_Sections_Medals_Achievement? other) + { + if (ReferenceEquals(null, other)) + { + return false; + } + + if (ReferenceEquals(this, other)) + { + return true; + } + + if (other.GetType() != GetType()) + { + return false; + } + + return (Id.Equals(other.Id)) && ((Name is null && other.Name is null) || Name != null && Name.Equals(other.Name)) && ((MedalType is null && other.MedalType is null) || MedalType != null && MedalType.Equals(other.MedalType)) && ((Condition is null && other.Condition is null) || Condition != null && Condition.Equals(other.Condition)) && ((Description is null && other.Description is null) || Description != null && Description.Equals(other.Description)) && AchievementValue == other.AchievementValue && MaxSeriesValue == other.MaxSeriesValue && ((Image is null && other.Image is null) || Image != null && Image.Equals(other.Image)) && ((ImageBig is null && other.ImageBig is null) || ImageBig != null && ImageBig.Equals(other.ImageBig)) && Order == other.Order && SectionId.Equals(other.SectionId); + } + + public override global::System.Boolean Equals(global::System.Object? obj) + { + if (ReferenceEquals(null, obj)) + { + return false; + } + + if (ReferenceEquals(this, obj)) + { + return true; + } + + if (obj.GetType() != GetType()) + { + return false; + } + + return Equals((Player_AccountMedals_Sections_Medals_Achievement)obj); + } + + public override global::System.Int32 GetHashCode() + { + unchecked + { + int hash = 5; + hash ^= 397 * Id.GetHashCode(); + if (Name != null) + { + hash ^= 397 * Name.GetHashCode(); + } + + if (MedalType != null) + { + hash ^= 397 * MedalType.GetHashCode(); + } + + if (Condition != null) + { + hash ^= 397 * Condition.GetHashCode(); + } + + if (Description != null) + { + hash ^= 397 * Description.GetHashCode(); + } + + hash ^= 397 * AchievementValue.GetHashCode(); + if (MaxSeriesValue != null) + { + hash ^= 397 * MaxSeriesValue.GetHashCode(); + } + + if (Image != null) + { + hash ^= 397 * Image.GetHashCode(); + } + + if (ImageBig != null) + { + hash ^= 397 * ImageBig.GetHashCode(); + } + + if (Order != null) + { + hash ^= 397 * Order.GetHashCode(); + } + + hash ^= 397 * SectionId.GetHashCode(); + return hash; + } + } + } +} diff --git a/WotBlitzStatisticsPro.Blazor/Generated/State/AccountAchievementsResponseData.WotBlitzStatisticsProClient.StrawberryShake.cs b/WotBlitzStatisticsPro.Blazor/Generated/State/AccountAchievementsResponseData.WotBlitzStatisticsProClient.StrawberryShake.cs new file mode 100644 index 0000000..df6c9bc --- /dev/null +++ b/WotBlitzStatisticsPro.Blazor/Generated/State/AccountAchievementsResponseData.WotBlitzStatisticsProClient.StrawberryShake.cs @@ -0,0 +1,25 @@ +// +#nullable enable + +namespace WotBlitzStatisticsPro.Blazor.GraphQl.State +{ + ///Represents information about player's achievements + [global::System.CodeDom.Compiler.GeneratedCode("StrawberryShake", "11.2.2.0")] + public partial class AccountAchievementsResponseData + { + public AccountAchievementsResponseData(global::System.String __typename, global::System.Int64? accountId = default !, global::System.Collections.Generic.IReadOnlyList? sections = default !) + { + this.__typename = __typename ?? throw new global::System.ArgumentNullException(nameof(__typename)); + AccountId = accountId; + Sections = sections; + } + + public global::System.String __typename { get; } + + ///Player Id + public global::System.Int64? AccountId { get; } + + ///Player Achievements by sections + public global::System.Collections.Generic.IReadOnlyList? Sections { get; } + } +} diff --git a/WotBlitzStatisticsPro.Blazor/Generated/State/AchievementEntity.WotBlitzStatisticsProClient.StrawberryShake.cs b/WotBlitzStatisticsPro.Blazor/Generated/State/AchievementEntity.WotBlitzStatisticsProClient.StrawberryShake.cs new file mode 100644 index 0000000..5b5600b --- /dev/null +++ b/WotBlitzStatisticsPro.Blazor/Generated/State/AchievementEntity.WotBlitzStatisticsProClient.StrawberryShake.cs @@ -0,0 +1,58 @@ +// +#nullable enable + +namespace WotBlitzStatisticsPro.Blazor.GraphQl.State +{ + ///Player's achievement information + [global::System.CodeDom.Compiler.GeneratedCode("StrawberryShake", "11.2.2.0")] + public partial class AchievementEntity + { + public AchievementEntity(global::System.String id = default !, global::System.String? name = default !, global::System.String? medalType = default !, global::System.String? condition = default !, global::System.String? description = default !, global::System.Int32 achievementValue = default !, global::System.Int32? maxSeriesValue = default !, global::System.String? image = default !, global::System.String? imageBig = default !, global::System.Int64? order = default !, global::System.String sectionId = default !) + { + Id = id; + Name = name; + MedalType = medalType; + Condition = condition; + Description = description; + AchievementValue = achievementValue; + MaxSeriesValue = maxSeriesValue; + Image = image; + ImageBig = imageBig; + Order = order; + SectionId = sectionId; + } + + ///Achievement Id + public global::System.String Id { get; } + + ///Achievement name + public global::System.String? Name { get; } + + ///Achievement type + public global::System.String? MedalType { get; } + + ///Achievement condition + public global::System.String? Condition { get; } + + ///Achievement description + public global::System.String? Description { get; } + + ///Achievement value + public global::System.Int32 AchievementValue { get; } + + ///Achievement max series value + public global::System.Int32? MaxSeriesValue { get; } + + ///Achievement normal sized image + public global::System.String? Image { get; } + + ///Achievement big image + public global::System.String? ImageBig { get; } + + ///Order + public global::System.Int64? Order { get; } + + ///Section Id + public global::System.String SectionId { get; } + } +} diff --git a/WotBlitzStatisticsPro.Blazor/Generated/State/AchievementSectionData.WotBlitzStatisticsProClient.StrawberryShake.cs b/WotBlitzStatisticsPro.Blazor/Generated/State/AchievementSectionData.WotBlitzStatisticsProClient.StrawberryShake.cs new file mode 100644 index 0000000..1f06991 --- /dev/null +++ b/WotBlitzStatisticsPro.Blazor/Generated/State/AchievementSectionData.WotBlitzStatisticsProClient.StrawberryShake.cs @@ -0,0 +1,33 @@ +// +#nullable enable + +namespace WotBlitzStatisticsPro.Blazor.GraphQl.State +{ + ///Represents achievement section info and it's achievements list + [global::System.CodeDom.Compiler.GeneratedCode("StrawberryShake", "11.2.2.0")] + public partial class AchievementSectionData + { + public AchievementSectionData(global::System.String __typename, global::System.String? sectionId = default !, global::System.Int32? order = default !, global::System.String? name = default !, global::System.Collections.Generic.IReadOnlyList? medals = default !) + { + this.__typename = __typename ?? throw new global::System.ArgumentNullException(nameof(__typename)); + SectionId = sectionId; + Order = order; + Name = name; + Medals = medals; + } + + public global::System.String __typename { get; } + + ///Section Identifier + public global::System.String? SectionId { get; } + + ///Section order + public global::System.Int32? Order { get; } + + ///Section Name + public global::System.String? Name { get; } + + ///Achievements in the section + public global::System.Collections.Generic.IReadOnlyList? Medals { get; } + } +} diff --git a/WotBlitzStatisticsPro.Blazor/Generated/State/PlayerBuilder.WotBlitzStatisticsProClient.StrawberryShake.cs b/WotBlitzStatisticsPro.Blazor/Generated/State/PlayerBuilder.WotBlitzStatisticsProClient.StrawberryShake.cs index 2403d85..1169885 100644 --- a/WotBlitzStatisticsPro.Blazor/Generated/State/PlayerBuilder.WotBlitzStatisticsProClient.StrawberryShake.cs +++ b/WotBlitzStatisticsPro.Blazor/Generated/State/PlayerBuilder.WotBlitzStatisticsProClient.StrawberryShake.cs @@ -74,11 +74,13 @@ namespace WotBlitzStatisticsPro.Blazor.GraphQl.State { var entityIds = new global::System.Collections.Generic.HashSet(); global::StrawberryShake.IEntityStoreSnapshot snapshot = default !; + global::WotBlitzStatisticsPro.Blazor.GraphQl.State.AccountAchievementsResponseData accountMedalsId = default !; _entityStore.Update(session => { + accountMedalsId = DeserializeNonNullableIPlayer_AccountMedals(session, global::StrawberryShake.Json.JsonElementExtensions.GetPropertyOrNull(obj, "accountMedals"), entityIds); snapshot = session.CurrentSnapshot; }); - var resultInfo = new PlayerResultInfo(DeserializeNonNullableIPlayer_AccountInfo(global::StrawberryShake.Json.JsonElementExtensions.GetPropertyOrNull(obj, "accountInfo")), entityIds, snapshot.Version); + var resultInfo = new PlayerResultInfo(DeserializeNonNullableIPlayer_AccountInfo(global::StrawberryShake.Json.JsonElementExtensions.GetPropertyOrNull(obj, "accountInfo")), accountMedalsId, entityIds, snapshot.Version); return (_resultDataFactory.Create(resultInfo), resultInfo); } @@ -255,5 +257,105 @@ namespace WotBlitzStatisticsPro.Blazor.GraphQl.State return _booleanParser.Parse(obj.Value.GetBoolean()!); } + + private global::WotBlitzStatisticsPro.Blazor.GraphQl.State.AccountAchievementsResponseData DeserializeNonNullableIPlayer_AccountMedals(global::StrawberryShake.IEntityStoreUpdateSession session, global::System.Text.Json.JsonElement? obj, global::System.Collections.Generic.ISet entityIds) + { + if (!obj.HasValue) + { + throw new global::System.ArgumentNullException(); + } + + var typename = obj.Value.GetProperty("__typename").GetString(); + if (typename?.Equals("AccountAchievementsResponse", global::System.StringComparison.Ordinal) ?? false) + { + return new global::WotBlitzStatisticsPro.Blazor.GraphQl.State.AccountAchievementsResponseData(typename, accountId: DeserializeNonNullableInt64(global::StrawberryShake.Json.JsonElementExtensions.GetPropertyOrNull(obj, "accountId")), sections: DeserializeIPlayer_AccountMedals_SectionsNonNullableArray(session, global::StrawberryShake.Json.JsonElementExtensions.GetPropertyOrNull(obj, "sections"), entityIds)); + } + + throw new global::System.NotSupportedException(); + } + + private global::System.Collections.Generic.IReadOnlyList? DeserializeIPlayer_AccountMedals_SectionsNonNullableArray(global::StrawberryShake.IEntityStoreUpdateSession session, global::System.Text.Json.JsonElement? obj, global::System.Collections.Generic.ISet entityIds) + { + if (!obj.HasValue) + { + return null; + } + + var achievementSections = new global::System.Collections.Generic.List(); + foreach (global::System.Text.Json.JsonElement child in obj.Value.EnumerateArray()) + { + achievementSections.Add(DeserializeNonNullableIPlayer_AccountMedals_Sections(session, child, entityIds)); + } + + return achievementSections; + } + + private global::WotBlitzStatisticsPro.Blazor.GraphQl.State.AchievementSectionData DeserializeNonNullableIPlayer_AccountMedals_Sections(global::StrawberryShake.IEntityStoreUpdateSession session, global::System.Text.Json.JsonElement? obj, global::System.Collections.Generic.ISet entityIds) + { + if (!obj.HasValue) + { + throw new global::System.ArgumentNullException(); + } + + var typename = obj.Value.GetProperty("__typename").GetString(); + if (typename?.Equals("AchievementSection", global::System.StringComparison.Ordinal) ?? false) + { + return new global::WotBlitzStatisticsPro.Blazor.GraphQl.State.AchievementSectionData(typename, sectionId: DeserializeNonNullableString(global::StrawberryShake.Json.JsonElementExtensions.GetPropertyOrNull(obj, "sectionId")), order: DeserializeNonNullableInt32(global::StrawberryShake.Json.JsonElementExtensions.GetPropertyOrNull(obj, "order")), name: DeserializeNonNullableString(global::StrawberryShake.Json.JsonElementExtensions.GetPropertyOrNull(obj, "name")), medals: UpdateIPlayer_AccountMedals_Sections_MedalsEntityNonNullableArray(session, global::StrawberryShake.Json.JsonElementExtensions.GetPropertyOrNull(obj, "medals"), entityIds)); + } + + throw new global::System.NotSupportedException(); + } + + private global::System.Collections.Generic.IReadOnlyList? UpdateIPlayer_AccountMedals_Sections_MedalsEntityNonNullableArray(global::StrawberryShake.IEntityStoreUpdateSession session, global::System.Text.Json.JsonElement? obj, global::System.Collections.Generic.ISet entityIds) + { + if (!obj.HasValue) + { + return null; + } + + var achievements = new global::System.Collections.Generic.List(); + foreach (global::System.Text.Json.JsonElement child in obj.Value.EnumerateArray()) + { + achievements.Add(UpdateNonNullableIPlayer_AccountMedals_Sections_MedalsEntity(session, child, entityIds)); + } + + return achievements; + } + + private global::StrawberryShake.EntityId UpdateNonNullableIPlayer_AccountMedals_Sections_MedalsEntity(global::StrawberryShake.IEntityStoreUpdateSession session, global::System.Text.Json.JsonElement? obj, global::System.Collections.Generic.ISet entityIds) + { + if (!obj.HasValue) + { + throw new global::System.ArgumentNullException(); + } + + global::StrawberryShake.EntityId entityId = _idSerializer.Parse(obj.Value); + entityIds.Add(entityId); + if (entityId.Name.Equals("Achievement", global::System.StringComparison.Ordinal)) + { + if (session.CurrentSnapshot.TryGetEntity(entityId, out global::WotBlitzStatisticsPro.Blazor.GraphQl.State.AchievementEntity? entity)) + { + session.SetEntity(entityId, new global::WotBlitzStatisticsPro.Blazor.GraphQl.State.AchievementEntity(DeserializeNonNullableString(global::StrawberryShake.Json.JsonElementExtensions.GetPropertyOrNull(obj, "id")), DeserializeString(global::StrawberryShake.Json.JsonElementExtensions.GetPropertyOrNull(obj, "name")), DeserializeString(global::StrawberryShake.Json.JsonElementExtensions.GetPropertyOrNull(obj, "medalType")), DeserializeString(global::StrawberryShake.Json.JsonElementExtensions.GetPropertyOrNull(obj, "condition")), DeserializeString(global::StrawberryShake.Json.JsonElementExtensions.GetPropertyOrNull(obj, "description")), DeserializeNonNullableInt32(global::StrawberryShake.Json.JsonElementExtensions.GetPropertyOrNull(obj, "achievementValue")), DeserializeInt32(global::StrawberryShake.Json.JsonElementExtensions.GetPropertyOrNull(obj, "maxSeriesValue")), DeserializeString(global::StrawberryShake.Json.JsonElementExtensions.GetPropertyOrNull(obj, "image")), DeserializeString(global::StrawberryShake.Json.JsonElementExtensions.GetPropertyOrNull(obj, "imageBig")), DeserializeInt64(global::StrawberryShake.Json.JsonElementExtensions.GetPropertyOrNull(obj, "order")), DeserializeNonNullableString(global::StrawberryShake.Json.JsonElementExtensions.GetPropertyOrNull(obj, "sectionId")))); + } + else + { + session.SetEntity(entityId, new global::WotBlitzStatisticsPro.Blazor.GraphQl.State.AchievementEntity(DeserializeNonNullableString(global::StrawberryShake.Json.JsonElementExtensions.GetPropertyOrNull(obj, "id")), DeserializeString(global::StrawberryShake.Json.JsonElementExtensions.GetPropertyOrNull(obj, "name")), DeserializeString(global::StrawberryShake.Json.JsonElementExtensions.GetPropertyOrNull(obj, "medalType")), DeserializeString(global::StrawberryShake.Json.JsonElementExtensions.GetPropertyOrNull(obj, "condition")), DeserializeString(global::StrawberryShake.Json.JsonElementExtensions.GetPropertyOrNull(obj, "description")), DeserializeNonNullableInt32(global::StrawberryShake.Json.JsonElementExtensions.GetPropertyOrNull(obj, "achievementValue")), DeserializeInt32(global::StrawberryShake.Json.JsonElementExtensions.GetPropertyOrNull(obj, "maxSeriesValue")), DeserializeString(global::StrawberryShake.Json.JsonElementExtensions.GetPropertyOrNull(obj, "image")), DeserializeString(global::StrawberryShake.Json.JsonElementExtensions.GetPropertyOrNull(obj, "imageBig")), DeserializeInt64(global::StrawberryShake.Json.JsonElementExtensions.GetPropertyOrNull(obj, "order")), DeserializeNonNullableString(global::StrawberryShake.Json.JsonElementExtensions.GetPropertyOrNull(obj, "sectionId")))); + } + + return entityId; + } + + throw new global::System.NotSupportedException(); + } + + private global::System.Int32? DeserializeInt32(global::System.Text.Json.JsonElement? obj) + { + if (!obj.HasValue) + { + return null; + } + + return _intParser.Parse(obj.Value.GetInt32()!); + } } } diff --git a/WotBlitzStatisticsPro.Blazor/Generated/State/PlayerResultFactory.WotBlitzStatisticsProClient.StrawberryShake.cs b/WotBlitzStatisticsPro.Blazor/Generated/State/PlayerResultFactory.WotBlitzStatisticsProClient.StrawberryShake.cs index fa5ae8b..3c3ba80 100644 --- a/WotBlitzStatisticsPro.Blazor/Generated/State/PlayerResultFactory.WotBlitzStatisticsProClient.StrawberryShake.cs +++ b/WotBlitzStatisticsPro.Blazor/Generated/State/PlayerResultFactory.WotBlitzStatisticsProClient.StrawberryShake.cs @@ -7,9 +7,11 @@ namespace WotBlitzStatisticsPro.Blazor.GraphQl.State public partial class PlayerResultFactory : global::StrawberryShake.IOperationResultDataFactory { private readonly global::StrawberryShake.IEntityStore _entityStore; - public PlayerResultFactory(global::StrawberryShake.IEntityStore entityStore) + private readonly global::StrawberryShake.IEntityMapper _player_AccountMedals_Sections_Medals_AchievementFromAchievementEntityMapper; + public PlayerResultFactory(global::StrawberryShake.IEntityStore entityStore, global::StrawberryShake.IEntityMapper player_AccountMedals_Sections_Medals_AchievementFromAchievementEntityMapper) { _entityStore = entityStore ?? throw new global::System.ArgumentNullException(nameof(entityStore)); + _player_AccountMedals_Sections_Medals_AchievementFromAchievementEntityMapper = player_AccountMedals_Sections_Medals_AchievementFromAchievementEntityMapper ?? throw new global::System.ArgumentNullException(nameof(player_AccountMedals_Sections_Medals_AchievementFromAchievementEntityMapper)); } global::System.Type global::StrawberryShake.IOperationResultDataFactory.ResultType => typeof(global::WotBlitzStatisticsPro.Blazor.GraphQl.IPlayerResult); @@ -22,7 +24,7 @@ namespace WotBlitzStatisticsPro.Blazor.GraphQl.State if (dataInfo is PlayerResultInfo info) { - return new PlayerResult(MapNonNullableIPlayer_AccountInfo(info.AccountInfo, snapshot)); + return new PlayerResult(MapNonNullableIPlayer_AccountInfo(info.AccountInfo, snapshot), MapNonNullableIPlayer_AccountMedals(info.AccountMedals, snapshot)); } throw new global::System.ArgumentException("PlayerResultInfo expected."); @@ -94,6 +96,78 @@ namespace WotBlitzStatisticsPro.Blazor.GraphQl.State return returnValue; } + private global::WotBlitzStatisticsPro.Blazor.GraphQl.IPlayer_AccountMedals MapNonNullableIPlayer_AccountMedals(global::WotBlitzStatisticsPro.Blazor.GraphQl.State.AccountAchievementsResponseData data, global::StrawberryShake.IEntityStoreSnapshot snapshot) + { + IPlayer_AccountMedals returnValue = default !; + if (data.__typename.Equals("AccountAchievementsResponse", global::System.StringComparison.Ordinal)) + { + returnValue = new Player_AccountMedals_AccountAchievementsResponse(data.AccountId ?? throw new global::System.ArgumentNullException(), MapIPlayer_AccountMedals_SectionsNonNullableArray(data.Sections, snapshot)); + } + else + { + throw new global::System.NotSupportedException(); + } + + return returnValue; + } + + private global::System.Collections.Generic.IReadOnlyList? MapIPlayer_AccountMedals_SectionsNonNullableArray(global::System.Collections.Generic.IReadOnlyList? list, global::StrawberryShake.IEntityStoreSnapshot snapshot) + { + if (list is null) + { + return null; + } + + var achievementSections = new global::System.Collections.Generic.List(); + foreach (global::WotBlitzStatisticsPro.Blazor.GraphQl.State.AchievementSectionData child in list) + { + achievementSections.Add(MapNonNullableIPlayer_AccountMedals_Sections(child, snapshot)); + } + + return achievementSections; + } + + private global::WotBlitzStatisticsPro.Blazor.GraphQl.IPlayer_AccountMedals_Sections MapNonNullableIPlayer_AccountMedals_Sections(global::WotBlitzStatisticsPro.Blazor.GraphQl.State.AchievementSectionData data, global::StrawberryShake.IEntityStoreSnapshot snapshot) + { + IPlayer_AccountMedals_Sections returnValue = default !; + if (data.__typename.Equals("AchievementSection", global::System.StringComparison.Ordinal)) + { + returnValue = new Player_AccountMedals_Sections_AchievementSection(data.SectionId ?? throw new global::System.ArgumentNullException(), data.Order ?? throw new global::System.ArgumentNullException(), data.Name ?? throw new global::System.ArgumentNullException(), MapIPlayer_AccountMedals_Sections_MedalsNonNullableArray(data.Medals, snapshot)); + } + else + { + throw new global::System.NotSupportedException(); + } + + return returnValue; + } + + private global::System.Collections.Generic.IReadOnlyList? MapIPlayer_AccountMedals_Sections_MedalsNonNullableArray(global::System.Collections.Generic.IReadOnlyList? list, global::StrawberryShake.IEntityStoreSnapshot snapshot) + { + if (list is null) + { + return null; + } + + var achievements = new global::System.Collections.Generic.List(); + foreach (global::StrawberryShake.EntityId child in list) + { + achievements.Add(MapNonNullableIPlayer_AccountMedals_Sections_Medals(child, snapshot)); + } + + return achievements; + } + + private global::WotBlitzStatisticsPro.Blazor.GraphQl.IPlayer_AccountMedals_Sections_Medals MapNonNullableIPlayer_AccountMedals_Sections_Medals(global::StrawberryShake.EntityId entityId, global::StrawberryShake.IEntityStoreSnapshot snapshot) + { + if (entityId.Name.Equals("Achievement", global::System.StringComparison.Ordinal)) + { + return _player_AccountMedals_Sections_Medals_AchievementFromAchievementEntityMapper.Map(snapshot.GetEntity(entityId) ?? throw new global::StrawberryShake.GraphQLClientException()); + } + + throw new global::System.NotSupportedException(); + } + global::System.Object global::StrawberryShake.IOperationResultDataFactory.Create(global::StrawberryShake.IOperationResultDataInfo dataInfo, global::StrawberryShake.IEntityStoreSnapshot? snapshot) { return Create(dataInfo, snapshot); diff --git a/WotBlitzStatisticsPro.Blazor/Generated/State/PlayerResultInfo.WotBlitzStatisticsProClient.StrawberryShake.cs b/WotBlitzStatisticsPro.Blazor/Generated/State/PlayerResultInfo.WotBlitzStatisticsProClient.StrawberryShake.cs index 4066081..bcb822f 100644 --- a/WotBlitzStatisticsPro.Blazor/Generated/State/PlayerResultInfo.WotBlitzStatisticsProClient.StrawberryShake.cs +++ b/WotBlitzStatisticsPro.Blazor/Generated/State/PlayerResultInfo.WotBlitzStatisticsProClient.StrawberryShake.cs @@ -8,9 +8,10 @@ namespace WotBlitzStatisticsPro.Blazor.GraphQl.State { private readonly global::System.Collections.Generic.IReadOnlyCollection _entityIds; private readonly global::System.UInt64 _version; - public PlayerResultInfo(global::WotBlitzStatisticsPro.Blazor.GraphQl.State.AccountInfoResponseData accountInfo, global::System.Collections.Generic.IReadOnlyCollection entityIds, global::System.UInt64 version) + public PlayerResultInfo(global::WotBlitzStatisticsPro.Blazor.GraphQl.State.AccountInfoResponseData accountInfo, global::WotBlitzStatisticsPro.Blazor.GraphQl.State.AccountAchievementsResponseData accountMedals, global::System.Collections.Generic.IReadOnlyCollection entityIds, global::System.UInt64 version) { AccountInfo = accountInfo; + AccountMedals = accountMedals; _entityIds = entityIds ?? throw new global::System.ArgumentNullException(nameof(entityIds)); _version = version; } @@ -20,11 +21,16 @@ namespace WotBlitzStatisticsPro.Blazor.GraphQl.State /// public global::WotBlitzStatisticsPro.Blazor.GraphQl.State.AccountInfoResponseData AccountInfo { get; } + /// + /// Returns information about player's achievements + /// + public global::WotBlitzStatisticsPro.Blazor.GraphQl.State.AccountAchievementsResponseData AccountMedals { get; } + public global::System.Collections.Generic.IReadOnlyCollection EntityIds => _entityIds; public global::System.UInt64 Version => _version; public global::StrawberryShake.IOperationResultDataInfo WithVersion(global::System.UInt64 version) { - return new PlayerResultInfo(AccountInfo, _entityIds, version); + return new PlayerResultInfo(AccountInfo, AccountMedals, _entityIds, version); } } } diff --git a/WotBlitzStatisticsPro.Blazor/Generated/State/Player_AccountMedals_Sections_Medals_AchievementFromAchievementEntityMapper.WotBlitzStatisticsProClient.StrawberryShake.cs b/WotBlitzStatisticsPro.Blazor/Generated/State/Player_AccountMedals_Sections_Medals_AchievementFromAchievementEntityMapper.WotBlitzStatisticsProClient.StrawberryShake.cs new file mode 100644 index 0000000..8b6bb9d --- /dev/null +++ b/WotBlitzStatisticsPro.Blazor/Generated/State/Player_AccountMedals_Sections_Medals_AchievementFromAchievementEntityMapper.WotBlitzStatisticsProClient.StrawberryShake.cs @@ -0,0 +1,25 @@ +// +#nullable enable + +namespace WotBlitzStatisticsPro.Blazor.GraphQl.State +{ + [global::System.CodeDom.Compiler.GeneratedCode("StrawberryShake", "11.2.2.0")] + public partial class Player_AccountMedals_Sections_Medals_AchievementFromAchievementEntityMapper : global::StrawberryShake.IEntityMapper + { + private readonly global::StrawberryShake.IEntityStore _entityStore; + public Player_AccountMedals_Sections_Medals_AchievementFromAchievementEntityMapper(global::StrawberryShake.IEntityStore entityStore) + { + _entityStore = entityStore ?? throw new global::System.ArgumentNullException(nameof(entityStore)); + } + + public Player_AccountMedals_Sections_Medals_Achievement Map(global::WotBlitzStatisticsPro.Blazor.GraphQl.State.AchievementEntity entity, global::StrawberryShake.IEntityStoreSnapshot? snapshot = null) + { + if (snapshot is null) + { + snapshot = _entityStore.CurrentSnapshot; + } + + return new Player_AccountMedals_Sections_Medals_Achievement(entity.Id, entity.Name, entity.MedalType, entity.Condition, entity.Description, entity.AchievementValue, entity.MaxSeriesValue, entity.Image, entity.ImageBig, entity.Order, entity.SectionId); + } + } +} diff --git a/WotBlitzStatisticsPro.Blazor/Generated/State/WotBlitzStatisticsProClientEntityIdFactory.WotBlitzStatisticsProClient.StrawberryShake.cs b/WotBlitzStatisticsPro.Blazor/Generated/State/WotBlitzStatisticsProClientEntityIdFactory.WotBlitzStatisticsProClient.StrawberryShake.cs index f699ac4..b8e7786 100644 --- a/WotBlitzStatisticsPro.Blazor/Generated/State/WotBlitzStatisticsProClientEntityIdFactory.WotBlitzStatisticsProClient.StrawberryShake.cs +++ b/WotBlitzStatisticsPro.Blazor/Generated/State/WotBlitzStatisticsProClientEntityIdFactory.WotBlitzStatisticsProClient.StrawberryShake.cs @@ -13,7 +13,7 @@ namespace WotBlitzStatisticsPro.Blazor.GraphQl.State global::System.String __typename = obj.GetProperty("__typename").GetString()!; return __typename switch { - _ => throw new global::System.NotSupportedException()} + "Achievement" => ParseAchievementEntityId(obj, __typename), _ => throw new global::System.NotSupportedException()} ; } @@ -22,9 +22,26 @@ namespace WotBlitzStatisticsPro.Blazor.GraphQl.State { return entityId.Name switch { - _ => throw new global::System.NotSupportedException()} + "Achievement" => FormatAchievementEntityId(entityId), _ => throw new global::System.NotSupportedException()} ; } + + private global::StrawberryShake.EntityId ParseAchievementEntityId(global::System.Text.Json.JsonElement obj, global::System.String type) + { + return new global::StrawberryShake.EntityId(type, obj.GetProperty("id").GetString()!); + } + + private global::System.String FormatAchievementEntityId(global::StrawberryShake.EntityId entityId) + { + using var writer = new global::StrawberryShake.Internal.ArrayWriter(); + using var jsonWriter = new global::System.Text.Json.Utf8JsonWriter(writer, _options); + jsonWriter.WriteStartObject(); + jsonWriter.WriteString("__typename", entityId.Name); + jsonWriter.WriteString("id", (global::System.String)entityId.Value); + jsonWriter.WriteEndObject(); + jsonWriter.Flush(); + return global::System.Text.Encoding.UTF8.GetString(writer.GetInternalBuffer(), 0, writer.Length); + } } } diff --git a/WotBlitzStatisticsPro.Blazor/Pages/PlayerInfoLayoutBase.cs b/WotBlitzStatisticsPro.Blazor/Pages/PlayerInfoLayoutBase.cs index f14bdca..b0195ef 100644 --- a/WotBlitzStatisticsPro.Blazor/Pages/PlayerInfoLayoutBase.cs +++ b/WotBlitzStatisticsPro.Blazor/Pages/PlayerInfoLayoutBase.cs @@ -1,4 +1,5 @@ -using System.Threading.Tasks; +using System.Collections.Generic; +using System.Threading.Tasks; using Microsoft.AspNetCore.Components; using WotBlitzStatisticsPro.Blazor.GraphQl; using WotBlitzStatisticsPro.Blazor.Services; @@ -20,12 +21,14 @@ namespace WotBlitzStatisticsPro.Blazor.Pages public IPlayer_AccountInfo AccountInfo { get; set; } + public IReadOnlyList AchievementsBySection { get; set; } + protected override async Task OnInitializedAsync() { var settings = await LocalStorageService.ReadSettings(); CurrentRealmType = settings.RealmType; - AccountInfo = await GraphQlBackendService.GetPlayerInfo(AccountId, CurrentRealmType); + (AccountInfo, AchievementsBySection) = await GraphQlBackendService.GetPlayerInfo(AccountId, CurrentRealmType); await base.OnInitializedAsync(); diff --git a/WotBlitzStatisticsPro.Blazor/Services/GraphQlBackendService.cs b/WotBlitzStatisticsPro.Blazor/Services/GraphQlBackendService.cs index f677d8c..15ecce4 100644 --- a/WotBlitzStatisticsPro.Blazor/Services/GraphQlBackendService.cs +++ b/WotBlitzStatisticsPro.Blazor/Services/GraphQlBackendService.cs @@ -38,12 +38,12 @@ namespace WotBlitzStatisticsPro.Blazor.Services return clans.Data?.Clans; } - public async Task GetPlayerInfo(long accountId, RealmType realmType) + public async Task<(IPlayer_AccountInfo accountInfo, IReadOnlyList achievementsBySection)> GetPlayerInfo(long accountId, RealmType realmType) { var playerInfo = await _client.Player.ExecuteAsync(accountId, realmType, GetLanguage()); CheckErrors(playerInfo.Errors); - return playerInfo.Data?.AccountInfo; + return (playerInfo.Data?.AccountInfo, playerInfo.Data?.AccountMedals?.Sections); } private RequestLanguage GetLanguage() diff --git a/WotBlitzStatisticsPro.Blazor/Services/IGraphQlBackendService.cs b/WotBlitzStatisticsPro.Blazor/Services/IGraphQlBackendService.cs index 4f555fb..7eac108 100644 --- a/WotBlitzStatisticsPro.Blazor/Services/IGraphQlBackendService.cs +++ b/WotBlitzStatisticsPro.Blazor/Services/IGraphQlBackendService.cs @@ -14,7 +14,7 @@ namespace WotBlitzStatisticsPro.Blazor.Services string clanNameOrTag, RealmType realmType); - Task GetPlayerInfo( + Task<(IPlayer_AccountInfo accountInfo, IReadOnlyList achievementsBySection)> GetPlayerInfo( long accountId, RealmType realmType); } diff --git a/WotBlitzStatisticsPro.Blazor/Services/Mock/AchievementsMockData.cs b/WotBlitzStatisticsPro.Blazor/Services/Mock/AchievementsMockData.cs index 15a7e1b..55e7c2b 100644 --- a/WotBlitzStatisticsPro.Blazor/Services/Mock/AchievementsMockData.cs +++ b/WotBlitzStatisticsPro.Blazor/Services/Mock/AchievementsMockData.cs @@ -1,757 +1,859 @@ -namespace WotBlitzStatisticsPro.Blazor.Services.Mock +using System; +using System.Collections.Generic; +using System.Text.Json; +using Newtonsoft.Json.Linq; +using WotBlitzStatisticsPro.Blazor.GraphQl; + +namespace WotBlitzStatisticsPro.Blazor.Services.Mock { - public class AchievementsMockData + public static class AchievementsMockData { + public static Player_AccountMedals_AccountAchievementsResponse GetStaticAchievements() + { + var jObject = JObject.Parse(_json); + var accountId = jObject["accountId"]?.Value(); + var sectionTokens = jObject["sections"]; + var sections = new List(); + if (sectionTokens != null) + { + foreach (var sectionToken in sectionTokens) + { + var medalTokens = sectionToken?["medals"]; + var medals = new List(); + if (medalTokens != null) + { + foreach (var medalToken in medalTokens) + { + medals.Add(new Player_AccountMedals_Sections_Medals_Achievement( + medalToken["id"].Value(), + medalToken["name"]?.Value(), + medalToken["medalType"]?.Value(), + medalToken["condition"]?.Value(), + medalToken["description"]?.Value(), + medalToken["achievementValue"].Value(), + medalToken["maxSeriesValue"]?.Value(), + medalToken["image"]?.Value(), + medalToken["imageBig"]?.Value(), + medalToken["order"]?.Value(), + medalToken["sectionId"]?.Value() + )); + } + sections.Add(new Player_AccountMedals_Sections_AchievementSection( + sectionToken["sectionId"].Value(), + sectionToken["order"].Value(), + sectionToken["name"].Value(), + medals + )); + } + } + } - private string _json = @" + return new Player_AccountMedals_AccountAchievementsResponse(accountId!.Value, sections); + } + + private static string _json = @" { - ""data"": { - ""accountAchievements"": { - ""accountId"": 90277267, - ""achievementSections"": [ - { - ""sectionId"": ""platoon"", - ""name"": ""ВЗВОДНЫЕ НАГРАДЫ"", - ""order"": 5, - ""achievements"": [ - { - ""id"": ""punisher"", - ""sectionId"": ""platoon"", - ""name"": ""«Мститель»"", - ""condition"": ""• IV степени – 1\n• III степени – 10\n• II степени – 100\n• I степени – 1 000"", - ""description"": ""Ликвидировать противника, уничтожившего игрока вашего взвода."", - ""achievementValue"": 4, - ""maxSeriesValue"": 1, - ""image"": null, - ""imageBig"": null, - ""order"": 1057 - }, - { - ""id"": ""jointVictory"", - ""sectionId"": ""platoon"", - ""name"": ""«Совместная победа»"", - ""condition"": ""• IV степени – 1\n• III степени – 10\n• II степени – 100\n• I степени – 1 000"", - ""description"": ""За количество победных боёв в составе взвода."", - ""achievementValue"": 3, - ""maxSeriesValue"": 23, - ""image"": ""http://glossary-eu-static.gcdn.co/icons/wotb/current/achievements/jointVictory3.png"", - ""imageBig"": ""http://glossary-eu-static.gcdn.co/icons/wotb/current/achievements/big/jointVictory3.png"", - ""order"": 1055 - }, - { - ""id"": ""medalCrucialContribution"", - ""sectionId"": ""platoon"", - ""name"": ""«Решающий вклад» (medalCrucialContribution)"", - ""condition"": ""• Выдаётся обоим игрокам взвода."", - ""description"": ""Взвод должен уничтожить не менее 6 танков противника."", - ""achievementValue"": 1, - ""maxSeriesValue"": null, - ""image"": ""http://glossary-eu-static.gcdn.co/icons/wotb/current/achievements/medalCrucialContribution.png"", - ""imageBig"": ""http://glossary-eu-static.gcdn.co/icons/wotb/current/achievements/big/medalCrucialContribution.png"", - ""order"": 400 - }, - { - ""id"": ""medalBrothersInArms"", - ""sectionId"": ""platoon"", - ""name"": ""«Братья по оружию» (medalBrothersInArms)"", - ""condition"": ""• Взвод должен выжить в бою.\n• Выдаётся обоим игрокам взвода."", - ""description"": ""Каждый игрок взвода должен уничтожить не менее 2 танков противника."", - ""achievementValue"": 1, - ""maxSeriesValue"": null, - ""image"": ""http://glossary-eu-static.gcdn.co/icons/wotb/current/achievements/medalBrothersInArms.png"", - ""imageBig"": ""http://glossary-eu-static.gcdn.co/icons/wotb/current/achievements/big/medalBrothersInArms.png"", - ""order"": 401 - } - ] - }, - { - ""sectionId"": ""title"", - ""name"": ""ПОЧЁТНЫЕ ЗВАНИЯ"", - ""order"": 1, - ""achievements"": [ - { - ""id"": ""armorPiercer"", - ""sectionId"": ""title"", - ""name"": ""«Бронебойщик» (armorPiercer)"", - ""condition"": ""• Серия прерывается непробитием, рикошетом или промахом.\n• Серия ведётся для каждого танка отдельно и может продолжиться в следующем бою на этом же танке.\n• В общий зачёт идёт максимальная серия."", - ""description"": ""Пробить броню противника не менее 10 раз подряд."", - ""achievementValue"": 1, - ""maxSeriesValue"": 61, - ""image"": ""http://glossary-eu-static.gcdn.co/icons/wotb/current/achievements/armorPiercer.png"", - ""imageBig"": ""http://glossary-eu-static.gcdn.co/icons/wotb/current/achievements/big/armorPiercer.png"", - ""order"": 1014 - }, - { - ""id"": ""mechanicEngineer6"", - ""sectionId"": ""title"", - ""name"": ""«Инженер-механик: Япония» (mechanicEngineer6)"", - ""condition"": ""• Неисследованные модули не являются препятствием."", - ""description"": ""Исследовать все танки в Дереве танков Японии."", - ""achievementValue"": 1, - ""maxSeriesValue"": null, - ""image"": ""http://glossary-eu-static.gcdn.co/icons/wotb/current/achievements/mechanicEngineer6.png"", - ""imageBig"": ""http://glossary-eu-static.gcdn.co/icons/wotb/current/achievements/big/mechanicEngineer6.png"", - ""order"": 1206 - }, - { - ""id"": ""kamikaze"", - ""sectionId"": ""title"", - ""name"": ""«Камикадзе» (kamikaze)"", - ""condition"": ""• Танк противника должен быть выше уровнем.\n• Не более одной награды на игрока за бой."", - ""description"": ""Уничтожить противника тараном."", - ""achievementValue"": 24, - ""maxSeriesValue"": null, - ""image"": ""http://glossary-eu-static.gcdn.co/icons/wotb/current/achievements/kamikaze.png"", - ""imageBig"": ""http://glossary-eu-static.gcdn.co/icons/wotb/current/achievements/big/kamikaze.png"", - ""order"": 703 - }, - { - ""id"": ""sinai"", - ""sectionId"": ""title"", - ""name"": ""«Лев Синая» (sinai)"", - ""condition"": ""\t• ИС\n\t• ИС-3\n\t• ИС-3 Защитник\n\t• ИС-4\n\t• ИС-6\n\t• ИС-6 Бесстрашный\n\t• ИС-7\n\t• ИС-8\n\t• ИСУ-152\n\t• Объект 252У\n\t• Объект 263\n\t• Объект 268\n\t• Объект 704\n\t• ИСУ-122С\n\t• ИС-2 (1945)\n\t• ИС-2Ш\n\t• ИС-5\n\t• ИСУ-130\n\t• IS-2 Pravda SP\n\t• IS-2\n\n• Засчитывается сумма результатов по всем танкам.\n• В общем зачёте повторно полученные награды суммируются."", - ""description"": ""Уничтожить 100 танков ИС или танков на их базе.\nЗасчитываются:"", - ""achievementValue"": 11, - ""maxSeriesValue"": 1188, - ""image"": ""http://glossary-eu-static.gcdn.co/icons/wotb/current/achievements/sinai.png"", - ""imageBig"": ""http://glossary-eu-static.gcdn.co/icons/wotb/current/achievements/big/sinai.png"", - ""order"": 1013 - }, - { - ""id"": ""titleSniper"", - ""sectionId"": ""title"", - ""name"": ""«Стрелок» (titleSniper)"", - ""condition"": ""• Серия прерывается промахом.\n• Серия ведётся для каждого танка отдельно и может продолжиться в следующем бою на этом же танке.\n• В общий зачёт идёт максимальная серия."", - ""description"": ""Попасть в противника не менее 10 раз подряд."", - ""achievementValue"": 1, - ""maxSeriesValue"": 96, - ""image"": ""http://glossary-eu-static.gcdn.co/icons/wotb/current/achievements/titleSniper.png"", - ""imageBig"": ""http://glossary-eu-static.gcdn.co/icons/wotb/current/achievements/big/titleSniper.png"", - ""order"": 1015 - }, - { - ""id"": ""beasthunter"", - ""sectionId"": ""title"", - ""name"": ""«Зверобой» (beasthunter)"", - ""condition"": ""\t• Tiger II\n\t• Panther\n\t• Panther II\n\t• Panther/M10\n\t• Panther 8,8\n\t• Jagdpanther\n\t• Jagdpanther II\n\t• Tiger (P)\n\t• Tiger I\n\t• Jagdtiger\n\t• Jagdtiger 8,8\n\t• Новогодний Jagdtiger 8,8\n\t• Leopard Prototyp A\n\t• Leopard 1\n\t• Löwe\n\t• Tiger Kuromorimine SP\n\t• VK 16.02 Leopard\n\t• Tiger 131\n\n• Засчитывается сумма результатов по всем танкам.\n• В общем зачёте повторно полученные награды суммируются."", - ""description"": ""Уничтожить 100 танков «семейства кошачьих».\nЗасчитываются:"", - ""achievementValue"": 7, - ""maxSeriesValue"": 781, - ""image"": ""http://glossary-eu-static.gcdn.co/icons/wotb/current/achievements/beasthunter.png"", - ""imageBig"": ""http://glossary-eu-static.gcdn.co/icons/wotb/current/achievements/big/beasthunter.png"", - ""order"": 1012 - }, - { - ""id"": ""tankExpert3"", - ""sectionId"": ""title"", - ""name"": ""«Эксперт: Китай» (tankExpert3)"", - ""condition"": null, - ""description"": ""Уничтожить все танки из Дерева танков Китая, исключая премиум и коллекционные."", - ""achievementValue"": 1, - ""maxSeriesValue"": null, - ""image"": ""http://glossary-eu-static.gcdn.co/icons/wotb/current/achievements/tankExpert3.png"", - ""imageBig"": ""http://glossary-eu-static.gcdn.co/icons/wotb/current/achievements/big/tankExpert3.png"", - ""order"": 1303 - }, - { - ""id"": ""tankExpert2"", - ""sectionId"": ""title"", - ""name"": ""«Эксперт: США» (tankExpert2)"", - ""condition"": null, - ""description"": ""Уничтожить все танки из Дерева танков США, исключая премиум и коллекционные."", - ""achievementValue"": 1, - ""maxSeriesValue"": null, - ""image"": ""http://glossary-eu-static.gcdn.co/icons/wotb/current/achievements/tankExpert2.png"", - ""imageBig"": ""http://glossary-eu-static.gcdn.co/icons/wotb/current/achievements/big/tankExpert2.png"", - ""order"": 1302 - }, - { - ""id"": ""tankExpert1"", - ""sectionId"": ""title"", - ""name"": ""«Эксперт: Германия» (tankExpert1)"", - ""condition"": null, - ""description"": ""Уничтожить все танки из Дерева танков Германии, исключая премиум и коллекционные."", - ""achievementValue"": 1, - ""maxSeriesValue"": null, - ""image"": ""http://glossary-eu-static.gcdn.co/icons/wotb/current/achievements/tankExpert1.png"", - ""imageBig"": ""http://glossary-eu-static.gcdn.co/icons/wotb/current/achievements/big/tankExpert1.png"", - ""order"": 1301 - }, - { - ""id"": ""tankExpert0"", - ""sectionId"": ""title"", - ""name"": ""«Эксперт: СССР» (tankExpert0)"", - ""condition"": null, - ""description"": ""Уничтожить все танки из Дерева танков СССР, исключая премиум и коллекционные."", - ""achievementValue"": 1, - ""maxSeriesValue"": null, - ""image"": ""http://glossary-eu-static.gcdn.co/icons/wotb/current/achievements/tankExpert0.png"", - ""imageBig"": ""http://glossary-eu-static.gcdn.co/icons/wotb/current/achievements/big/tankExpert0.png"", - ""order"": 1300 - }, - { - ""id"": ""tankExpert6"", - ""sectionId"": ""title"", - ""name"": ""«Эксперт: Япония» (tankExpert6)"", - ""condition"": null, - ""description"": ""Уничтожить все танки из Дерева танков Японии, исключая премиум и коллекционные."", - ""achievementValue"": 1, - ""maxSeriesValue"": null, - ""image"": ""http://glossary-eu-static.gcdn.co/icons/wotb/current/achievements/tankExpert6.png"", - ""imageBig"": ""http://glossary-eu-static.gcdn.co/icons/wotb/current/achievements/big/tankExpert6.png"", - ""order"": 1306 - }, - { - ""id"": ""tankExpert5"", - ""sectionId"": ""title"", - ""name"": ""«Эксперт: Великобритания» (tankExpert5)"", - ""condition"": null, - ""description"": ""Уничтожить все танки из Дерева танков Великобритании, исключая премиум и коллекционные."", - ""achievementValue"": 1, - ""maxSeriesValue"": null, - ""image"": ""http://glossary-eu-static.gcdn.co/icons/wotb/current/achievements/tankExpert5.png"", - ""imageBig"": ""http://glossary-eu-static.gcdn.co/icons/wotb/current/achievements/big/tankExpert5.png"", - ""order"": 1305 - }, - { - ""id"": ""tankExpert4"", - ""sectionId"": ""title"", - ""name"": ""«Эксперт: Франция» (tankExpert4)"", - ""condition"": null, - ""description"": ""Уничтожить все танки из Дерева танков Франции, исключая премиум и коллекционные."", - ""achievementValue"": 1, - ""maxSeriesValue"": null, - ""image"": ""http://glossary-eu-static.gcdn.co/icons/wotb/current/achievements/tankExpert4.png"", - ""imageBig"": ""http://glossary-eu-static.gcdn.co/icons/wotb/current/achievements/big/tankExpert4.png"", - ""order"": 1304 - }, - { - ""id"": ""handOfDeath"", - ""sectionId"": ""title"", - ""name"": ""«Коса Смерти» (handOfDeath)"", - ""condition"": ""• Серия ведётся для каждого танка отдельно и может продолжиться в следующем бою на этом же танке.\n• В общий зачёт идёт максимальная серия.\n• Выдаётся в момент окончания очередной рекордной серии."", - ""description"": ""Уничтожить подряд не менее 3 танков противника, затратив на вторую и последующие по одному снаряду."", - ""achievementValue"": 1, - ""maxSeriesValue"": 5, - ""image"": ""http://glossary-eu-static.gcdn.co/icons/wotb/current/achievements/handOfDeath.png"", - ""imageBig"": ""http://glossary-eu-static.gcdn.co/icons/wotb/current/achievements/big/handOfDeath.png"", - ""order"": 1002 - }, - { - ""id"": ""invincible"", - ""sectionId"": ""title"", - ""name"": ""«Неуязвимый» (invincible)"", - ""condition"": ""• Серия ведётся для каждого танка отдельно и может продолжиться в следующем бою на этом же танке.\n• В общий зачёт идёт максимальная серия."", - ""description"": ""Не получить урона в 5 боях подряд."", - ""achievementValue"": 0, - ""maxSeriesValue"": 4, - ""image"": ""http://glossary-eu-static.gcdn.co/icons/wotb/current/achievements/invincible.png"", - ""imageBig"": ""http://glossary-eu-static.gcdn.co/icons/wotb/current/achievements/big/invincible.png"", - ""order"": 702 - }, - { - ""id"": ""tankExpert"", - ""sectionId"": ""title"", - ""name"": ""«Эксперт» (tankExpert)"", - ""condition"": null, - ""description"": ""Уничтожить все танки из Дерева танков каждой нации, исключая премиум и коллекционные."", - ""achievementValue"": 0, - ""maxSeriesValue"": 255, - ""image"": ""http://glossary-eu-static.gcdn.co/icons/wotb/current/achievements/tankExpert.png"", - ""imageBig"": ""http://glossary-eu-static.gcdn.co/icons/wotb/current/achievements/big/tankExpert.png"", - ""order"": 1101 - }, - { - ""id"": ""diehard"", - ""sectionId"": ""title"", - ""name"": ""«Живучий» (diehard)"", - ""condition"": ""• Серия ведётся для каждого танка отдельно и может продолжиться в следующем бою на этом же танке.\n• В общий зачёт идёт максимальная серия."", - ""description"": ""Выжить в 10 боях подряд на одном танке."", - ""achievementValue"": 0, - ""maxSeriesValue"": 8, - ""image"": ""http://glossary-eu-static.gcdn.co/icons/wotb/current/achievements/diehard.png"", - ""imageBig"": ""http://glossary-eu-static.gcdn.co/icons/wotb/current/achievements/big/diehard.png"", - ""order"": 106 - }, - { - ""id"": ""pattonValley"", - ""sectionId"": ""title"", - ""name"": ""«Долина Паттонов» (pattonValley)"", - ""condition"": ""\t• M46 Patton\n\t• M48 Patton\n\t• M60\n\n• Засчитывается сумма результатов по всем танкам.\n• В общем зачёте повторно полученные награды суммируются."", - ""description"": ""Уничтожить 100 танков Patton.\nЗасчитываются:"", - ""achievementValue"": 0, - ""maxSeriesValue"": 25, - ""image"": ""http://glossary-eu-static.gcdn.co/icons/wotb/current/achievements/pattonValley.png"", - ""imageBig"": ""http://glossary-eu-static.gcdn.co/icons/wotb/current/achievements/big/pattonValley.png"", - ""order"": 1011 - } - ] - }, - { - ""sectionId"": ""commemorative"", - ""name"": ""ПАМЯТНЫЕ ЗНАКИ"", - ""order"": 3, - ""achievements"": [ - { - ""id"": ""cadet"", - ""sectionId"": ""commemorative"", - ""name"": ""«Кадет» (cadet)"", - ""condition"": null, - ""description"": ""Пройти боевое обучение."", - ""achievementValue"": 1, - ""maxSeriesValue"": null, - ""image"": ""http://glossary-eu-static.gcdn.co/icons/wotb/current/achievements/cadet.png"", - ""imageBig"": ""http://glossary-eu-static.gcdn.co/icons/wotb/current/achievements/big/cadet.png"", - ""order"": 1051 - }, - { - ""id"": ""firstBlood"", - ""sectionId"": ""commemorative"", - ""name"": ""«Первая кровь» (firstBlood)"", - ""condition"": null, - ""description"": ""Уничтожить 1 танк противника."", - ""achievementValue"": 1, - ""maxSeriesValue"": null, - ""image"": ""http://glossary-eu-static.gcdn.co/icons/wotb/current/achievements/firstBlood.png"", - ""imageBig"": ""http://glossary-eu-static.gcdn.co/icons/wotb/current/achievements/big/firstBlood.png"", - ""order"": 1052 - }, - { - ""id"": ""firstVictory"", - ""sectionId"": ""commemorative"", - ""name"": ""«Первая победа» (firstVictory)"", - ""condition"": null, - ""description"": ""Победить в первом обычном бою с другими игроками."", - ""achievementValue"": 1, - ""maxSeriesValue"": null, - ""image"": ""http://glossary-eu-static.gcdn.co/icons/wotb/current/achievements/firstVictory.png"", - ""imageBig"": ""http://glossary-eu-static.gcdn.co/icons/wotb/current/achievements/big/firstVictory.png"", - ""order"": 1053 - }, - { - ""id"": ""huntsman"", - ""sectionId"": ""commemorative"", - ""name"": ""«Егерь» (huntsman)"", - ""condition"": null, - ""description"": ""Уничтожить все лёгкие танки противника в одном бою, но не менее 3."", - ""achievementValue"": 4, - ""maxSeriesValue"": null, - ""image"": ""http://glossary-eu-static.gcdn.co/icons/wotb/current/achievements/huntsman.png"", - ""imageBig"": ""http://glossary-eu-static.gcdn.co/icons/wotb/current/achievements/big/huntsman.png"", - ""order"": 300 - }, - { - ""id"": ""ironMan"", - ""sectionId"": ""commemorative"", - ""name"": ""«Невозмутимый» (ironMan)"", - ""condition"": null, - ""description"": ""Получить подряд не менее 10 рикошетов и непробитий от противника."", - ""achievementValue"": 24, - ""maxSeriesValue"": null, - ""image"": ""http://glossary-eu-static.gcdn.co/icons/wotb/current/achievements/ironMan.png"", - ""imageBig"": ""http://glossary-eu-static.gcdn.co/icons/wotb/current/achievements/big/ironMan.png"", - ""order"": 1007 - }, - { - ""id"": ""sturdy"", - ""sectionId"": ""commemorative"", - ""name"": ""«Спартанец» (sturdy)"", - ""condition"": ""• Выжить в бою."", - ""description"": ""Получить рикошет или непробитие от противника при прочности танка менее 10%."", - ""achievementValue"": 82, - ""maxSeriesValue"": null, - ""image"": ""http://glossary-eu-static.gcdn.co/icons/wotb/current/achievements/sturdy.png"", - ""imageBig"": ""http://glossary-eu-static.gcdn.co/icons/wotb/current/achievements/big/sturdy.png"", - ""order"": 1008 - } - ] - }, - { - ""sectionId"": ""step"", - ""name"": ""ЭТАПНЫЕ НАГРАДЫ"", - ""order"": 4, - ""achievements"": [ - { - ""id"": ""medalCarius"", - ""sectionId"": ""step"", - ""name"": ""Медаль Кариуса"", - ""condition"": ""• IV степени – 10\n• III степени – 100\n• II степени – 1 000\n• I степени – 10 000"", - ""description"": ""За количество уничтоженных танков противника."", - ""achievementValue"": 2, - ""maxSeriesValue"": null, - ""image"": ""http://glossary-eu-static.gcdn.co/icons/wotb/current/achievements/medalCarius2.png"", - ""imageBig"": ""http://glossary-eu-static.gcdn.co/icons/wotb/current/achievements/big/medalCarius2.png"", - ""order"": 1401 - }, - { - ""id"": ""medalEkins"", - ""sectionId"": ""step"", - ""name"": ""Медаль Экинса"", - ""condition"": ""• IV степени – 3\n• III степени – 30\n• II степени – 300\n• I степени – 3 000"", - ""description"": ""За количество уничтоженных танков противника VIII–X уровней."", - ""achievementValue"": 1, - ""maxSeriesValue"": null, - ""image"": ""http://glossary-eu-static.gcdn.co/icons/wotb/current/achievements/medalEkins1.png"", - ""imageBig"": ""http://glossary-eu-static.gcdn.co/icons/wotb/current/achievements/big/medalEkins1.png"", - ""order"": 1402 - }, - { - ""id"": ""medalKay"", - ""sectionId"": ""step"", - ""name"": ""Медаль Кея"", - ""condition"": ""• IV степени – 1\n• III степени – 10\n• II степени – 100\n• I степени – 1 000"", - ""description"": ""За получение статуса «Герой битвы»."", - ""achievementValue"": 1, - ""maxSeriesValue"": 1700, - ""image"": ""http://glossary-eu-static.gcdn.co/icons/wotb/current/achievements/medalKay1.png"", - ""imageBig"": ""http://glossary-eu-static.gcdn.co/icons/wotb/current/achievements/big/medalKay1.png"", - ""order"": 1400 - }, - { - ""id"": ""medalLeClerc"", - ""sectionId"": ""step"", - ""name"": ""Медаль Леклерка"", - ""condition"": ""• Победить в бою.\n• Засчитываются все очки захвата, набранные за один бой, за исключением очков захвата, полученных в Превосходстве.\n\n• IV степени – 30\n• III степени – 300\n• II степени – 3 000\n• I степени – 30 000"", - ""description"": ""За суммарное количество очков захвата базы."", - ""achievementValue"": 2, - ""maxSeriesValue"": null, - ""image"": ""http://glossary-eu-static.gcdn.co/icons/wotb/current/achievements/medalLeClerc2.png"", - ""imageBig"": ""http://glossary-eu-static.gcdn.co/icons/wotb/current/achievements/big/medalLeClerc2.png"", - ""order"": 1406 - }, - { - ""id"": ""medalAbrams"", - ""sectionId"": ""step"", - ""name"": ""Медаль Абрамса"", - ""condition"": ""• IV степени – 10\n• III степени – 100\n• II степени – 1 000\n• I степени – 10 000"", - ""description"": ""За количество победных боёв, в которых игрок остался жив."", - ""achievementValue"": 2, - ""maxSeriesValue"": null, - ""image"": ""http://glossary-eu-static.gcdn.co/icons/wotb/current/achievements/medalAbrams2.png"", - ""imageBig"": ""http://glossary-eu-static.gcdn.co/icons/wotb/current/achievements/big/medalAbrams2.png"", - ""order"": 1405 - }, - { - ""id"": ""medalPoppel"", - ""sectionId"": ""step"", - ""name"": ""Медаль Попеля"", - ""condition"": ""• IV степени – 20\n• III степени – 200\n• II степени – 2 000\n• I степени – 20 000"", - ""description"": ""За количество обнаруженных танков противника."", - ""achievementValue"": 2, - ""maxSeriesValue"": null, - ""image"": ""http://glossary-eu-static.gcdn.co/icons/wotb/current/achievements/medalPoppel2.png"", - ""imageBig"": ""http://glossary-eu-static.gcdn.co/icons/wotb/current/achievements/big/medalPoppel2.png"", - ""order"": 1404 - }, - { - ""id"": ""medalSupremacy"", - ""sectionId"": ""step"", - ""name"": ""Медаль Превосходство"", - ""condition"": ""• Накопительная медаль.\n• Засчитываются все очки победы, набранные в Превосходстве.\n\n• IV степени – 10 000\n• III степени – 100 000\n• II степени – 1 000 000\n• I степени – 10 000 000"", - ""description"": ""За очки победы в Превосходстве."", - ""achievementValue"": 3, - ""maxSeriesValue"": null, - ""image"": ""http://glossary-eu-static.gcdn.co/icons/wotb/current/achievements/medalSupremacy3.png"", - ""imageBig"": ""http://glossary-eu-static.gcdn.co/icons/wotb/current/achievements/big/medalSupremacy3.png"", - ""order"": 1408 - }, - { - ""id"": ""medalLavrinenko"", - ""sectionId"": ""step"", - ""name"": ""Медаль Лавриненко"", - ""condition"": ""• Засчитывается не более 100 очков за бой.\n• Не засчитываются сбитые очки захвата точек, заработанные в Превосходстве\n\n• IV степени – 30\n• III степени – 300\n• II степени – 3 000\n• I степени – 30 000"", - ""description"": ""За суммарное количество сбитых очков захвата базы."", - ""achievementValue"": 2, - ""maxSeriesValue"": null, - ""image"": ""http://glossary-eu-static.gcdn.co/icons/wotb/current/achievements/medalLavrinenko2.png"", - ""imageBig"": ""http://glossary-eu-static.gcdn.co/icons/wotb/current/achievements/big/medalLavrinenko2.png"", - ""order"": 1407 - }, - { - ""id"": ""medalKnispel"", - ""sectionId"": ""step"", - ""name"": ""Медаль Книспеля"", - ""condition"": ""• IV степени – 10 000\n• III степени – 100 000\n• II степени – 1 000 000\n• I степени – 10 000 000"", - ""description"": ""За суммарное количество нанесённого и полученного урона."", - ""achievementValue"": 1, - ""maxSeriesValue"": null, - ""image"": ""http://glossary-eu-static.gcdn.co/icons/wotb/current/achievements/medalKnispel1.png"", - ""imageBig"": ""http://glossary-eu-static.gcdn.co/icons/wotb/current/achievements/big/medalKnispel1.png"", - ""order"": 1403 - } - ] - }, - { - ""sectionId"": ""battle"", - ""name"": ""«ГЕРОЙ БИТВЫ»"", - ""order"": 0, - ""achievements"": [ - { - ""id"": ""invader"", - ""sectionId"": ""battle"", - ""name"": ""«Захватчик» (invader)"", - ""condition"": ""• Выиграть бой захватом базы.\n• Засчитываются только очки, обеспечившие захват.\n• Не засчитываются очки захвата точек, полученные в Превосходстве."", - ""description"": ""Получить наибольшее количество очков захвата базы, но не менее 80."", - ""achievementValue"": 6, - ""maxSeriesValue"": null, - ""image"": ""http://glossary-eu-static.gcdn.co/icons/wotb/current/achievements/invader.png"", - ""imageBig"": ""http://glossary-eu-static.gcdn.co/icons/wotb/current/achievements/big/invader.png"", - ""order"": 203 - }, - { - ""id"": ""markOfMasteryII"", - ""sectionId"": ""battle"", - ""name"": ""Знак классности \n«2 степень» (markOfMasteryII)"", - ""condition"": null, - ""description"": ""Присваивается игроку за мастерство владения танком. Для получения награды необходимо заработать больше опыта за бой, чем средний максимальный опыт за неделю у 80% игроков на данном танке."", - ""achievementValue"": 853, - ""maxSeriesValue"": null, - ""image"": ""http://glossary-eu-static.gcdn.co/icons/wotb/current/achievements/markOfMasteryII.png"", - ""imageBig"": ""http://glossary-eu-static.gcdn.co/icons/wotb/current/achievements/big/markOfMasteryII.png"", - ""order"": 2 - }, - { - ""id"": ""markOfMasteryI"", - ""sectionId"": ""battle"", - ""name"": ""Знак классности \n«1 степень» (markOfMasteryI)"", - ""condition"": null, - ""description"": ""Присваивается игроку за мастерство владения танком. Для получения награды необходимо заработать больше опыта за бой, чем средний максимальный опыт за неделю у 95% игроков на данном танке."", - ""achievementValue"": 203, - ""maxSeriesValue"": null, - ""image"": ""http://glossary-eu-static.gcdn.co/icons/wotb/current/achievements/markOfMasteryI.png"", - ""imageBig"": ""http://glossary-eu-static.gcdn.co/icons/wotb/current/achievements/big/markOfMasteryI.png"", - ""order"": 1 - }, - { - ""id"": ""defender"", - ""sectionId"": ""battle"", - ""name"": ""«Защитник» (defender)"", - ""condition"": ""• При равном количестве сбитых очков награждается игрок, получивший наибольшее количество очков опыта за бой.\n• Выдаётся только одна награда за бой.\n• Не засчитываются очки захвата точек, полученные в Превосходстве."", - ""description"": ""Защитить базу, сбив наибольшее количество очков захвата, но не менее 70."", - ""achievementValue"": 23, - ""maxSeriesValue"": null, - ""image"": ""http://glossary-eu-static.gcdn.co/icons/wotb/current/achievements/defender.png"", - ""imageBig"": ""http://glossary-eu-static.gcdn.co/icons/wotb/current/achievements/big/defender.png"", - ""order"": 202 - }, - { - ""id"": ""markOfMasteryIII"", - ""sectionId"": ""battle"", - ""name"": ""Знак классности \n«3 степень» (markOfMasteryIII)"", - ""condition"": null, - ""description"": ""Присваивается игроку за мастерство владения танком. Для получения награды необходимо заработать больше опыта за бой, чем средний максимальный опыт за неделю у 50% игроков на данном танке."", - ""achievementValue"": 1783, - ""maxSeriesValue"": null, - ""image"": ""http://glossary-eu-static.gcdn.co/icons/wotb/current/achievements/markOfMasteryIII.png"", - ""imageBig"": ""http://glossary-eu-static.gcdn.co/icons/wotb/current/achievements/big/markOfMasteryIII.png"", - ""order"": 3 - }, - { - ""id"": ""supporter"", - ""sectionId"": ""battle"", - ""name"": ""«Поддержка» (supporter)"", - ""condition"": ""• Засчитываются цели, которые впоследствии были уничтожены другими игроками или самоуничтожились.\n• Рикошеты и непробития не учитываются.\n• При равном количестве повреждённых танков награждается игрок, получивший наибольшее количество очков опыта за бой.\n• Выдаётся только одна награда за бой."", - ""description"": ""Нанести урон или сбить гусеницу наибольшему количеству танков противника, но не менее чем 4."", - ""achievementValue"": 823, - ""maxSeriesValue"": null, - ""image"": ""http://glossary-eu-static.gcdn.co/icons/wotb/current/achievements/supporter.png"", - ""imageBig"": ""http://glossary-eu-static.gcdn.co/icons/wotb/current/achievements/big/supporter.png"", - ""order"": 6 - }, - { - ""id"": ""steelwall"", - ""sectionId"": ""battle"", - ""name"": ""«Стальная cтена» (steelwall)"", - ""condition"": ""• Выжить в бою.\n• При равном количестве полученного потенциального урона награждается игрок, получивший больше попаданий.\n• При равном количестве полученного потенциального урона и попаданий награждается игрок, получивший наибольшее количество очков опыта за бой.\n• Выдаётся только одна награда за бой."", - ""description"": ""Получить не менее 1 000 единиц потенциального урона и не менее 11 попаданий."", - ""achievementValue"": 129, - ""maxSeriesValue"": null, - ""image"": ""http://glossary-eu-static.gcdn.co/icons/wotb/current/achievements/steelwall.png"", - ""imageBig"": ""http://glossary-eu-static.gcdn.co/icons/wotb/current/achievements/big/steelwall.png"", - ""order"": 201 - }, - { - ""id"": ""mainGun"", - ""sectionId"": ""battle"", - ""name"": ""«Основной калибр» (mainGun)"", - ""condition"": ""• Нанесённый урон должен составлять не менее 35% от суммарной прочности танков противника и не менее 1000 единиц.\n• При равном количестве нанесённого урона награждается игрок, получивший наибольшее количество очков опыта за бой.\n• Выдаётся только одна награда за бой."", - ""description"": ""Нанести наибольшее количество урона за бой."", - ""achievementValue"": 255, - ""maxSeriesValue"": null, - ""image"": ""http://glossary-eu-static.gcdn.co/icons/wotb/current/achievements/mainGun.png"", - ""imageBig"": ""http://glossary-eu-static.gcdn.co/icons/wotb/current/achievements/big/mainGun.png"", - ""order"": 5 - }, - { - ""id"": ""warrior"", - ""sectionId"": ""battle"", - ""name"": ""«Воин» (warrior)"", - ""condition"": ""• При равном счёте награждается игрок, получивший наибольшее количество очков опыта за бой.\n• Выдаётся только одна награда за бой."", - ""description"": ""Уничтожить наибольшее количество танков противника, но не менее 4."", - ""achievementValue"": 236, - ""maxSeriesValue"": null, - ""image"": ""http://glossary-eu-static.gcdn.co/icons/wotb/current/achievements/warrior.png"", - ""imageBig"": ""http://glossary-eu-static.gcdn.co/icons/wotb/current/achievements/big/warrior.png"", - ""order"": 4 - }, - { - ""id"": ""camper"", - ""sectionId"": ""battle"", - ""name"": ""«Танкист-снайпер» (camper)"", - ""condition"": ""• Произвести не менее 8 выстрелов.\n• Не менее 80% попаданий должны быть с нанесением урона.\n• Учитывается урон танкам противника и повреждения модулей.\n• Общая точность стрельбы за бой должна быть не менее 85%.\n• Нанесённый урон должен превышать количество очков прочности танка игрока и быть не менее 1000 единиц.\n• При равном количестве нанесённого урона награждается игрок, получивший наибольшее количество очков опыта за бой.\n• Выдаётся только одна награда за бой."", - ""description"": ""Нанести наибольшее количество урона за бой с дистанции не менее 250 м."", - ""achievementValue"": 7, - ""maxSeriesValue"": null, - ""image"": ""http://glossary-eu-static.gcdn.co/icons/wotb/current/achievements/camper.png"", - ""imageBig"": ""http://glossary-eu-static.gcdn.co/icons/wotb/current/achievements/big/camper.png"", - ""order"": 7 - }, - { - ""id"": ""markOfMastery"", - ""sectionId"": ""battle"", - ""name"": ""Знак классности \n«Мастер» (markOfMastery)"", - ""condition"": null, - ""description"": ""Присваивается игроку за мастерство владения танком. Для получения награды необходимо заработать больше опыта за бой, чем средний максимальный опыт за неделю у 99% игроков на данном танке."", - ""achievementValue"": 76, - ""maxSeriesValue"": null, - ""image"": ""http://glossary-eu-static.gcdn.co/icons/wotb/current/achievements/markOfMastery.png"", - ""imageBig"": ""http://glossary-eu-static.gcdn.co/icons/wotb/current/achievements/big/markOfMastery.png"", - ""order"": 0 - }, - { - ""id"": ""scout"", - ""sectionId"": ""battle"", - ""name"": ""«Разведчик» (scout)"", - ""condition"": ""• Победить в бою.\n• Выдаётся только одна награда за бой."", - ""description"": ""Обнаружить наибольшее количество танков противника, но не менее 5."", - ""achievementValue"": 151, - ""maxSeriesValue"": null, - ""image"": ""http://glossary-eu-static.gcdn.co/icons/wotb/current/achievements/scout.png"", - ""imageBig"": ""http://glossary-eu-static.gcdn.co/icons/wotb/current/achievements/big/scout.png"", - ""order"": 204 - }, - { - ""id"": ""evileye"", - ""sectionId"": ""battle"", - ""name"": ""«Дозорный» (evileye)"", - ""condition"": ""• Засчитываются цели, разведданные по которым в момент их повреждения передавал только один игрок.\n• При равном количестве повреждённых танков награждается игрок, получивший наибольшее количество очков опыта за бой.\n• Выдаётся только одна награда за бой."", - ""description"": ""Предоставить разведданные, по которым союзники повредят не менее 3 танков противника."", - ""achievementValue"": 70, - ""maxSeriesValue"": null, - ""image"": ""http://glossary-eu-static.gcdn.co/icons/wotb/current/achievements/evileye.png"", - ""imageBig"": ""http://glossary-eu-static.gcdn.co/icons/wotb/current/achievements/big/evileye.png"", - ""order"": 200 - } - ] - }, - { - ""sectionId"": ""epic"", - ""name"": ""ЭПИЧЕСКИЕ МЕДАЛИ"", - ""order"": 2, - ""achievements"": [ - { - ""id"": ""medalHalonen"", - ""sectionId"": ""epic"", - ""name"": ""Медаль Халонена (medalHalonen)"", - ""condition"": ""• Уничтоженные танки должны превосходить ПТ-САУ игрока как минимум на 1 уровень."", - ""description"": ""Уничтожить не менее 3 танков противника в одном бою, управляя ПТ-САУ."", - ""achievementValue"": 3, - ""maxSeriesValue"": null, - ""image"": ""http://glossary-eu-static.gcdn.co/icons/wotb/current/achievements/medalHalonen.png"", - ""imageBig"": ""http://glossary-eu-static.gcdn.co/icons/wotb/current/achievements/big/medalHalonen.png"", - ""order"": 606 - }, - { - ""id"": ""medalOskin"", - ""sectionId"": ""epic"", - ""name"": ""Медаль Оськина (medalOskin)"", - ""condition"": ""• Уничтоженные танки должны превосходить танк игрока как минимум на 1 уровень."", - ""description"": ""Уничтожить 3 танка противника в одном бою, управляя средним танком."", - ""achievementValue"": 6, - ""maxSeriesValue"": null, - ""image"": ""http://glossary-eu-static.gcdn.co/icons/wotb/current/achievements/medalOskin.png"", - ""imageBig"": ""http://glossary-eu-static.gcdn.co/icons/wotb/current/achievements/big/medalOskin.png"", - ""order"": 603 - }, - { - ""id"": ""medalRadleyWalters"", - ""sectionId"": ""epic"", - ""name"": ""Медаль Рэдли-Уолтерса (medalRadleyWalters)"", - ""condition"": ""• Управлять танком V уровня и выше."", - ""description"": ""Уничтожить 5 танков противника в одном бою."", - ""achievementValue"": 35, - ""maxSeriesValue"": null, - ""image"": ""http://glossary-eu-static.gcdn.co/icons/wotb/current/achievements/medalRadleyWalters.png"", - ""imageBig"": ""http://glossary-eu-static.gcdn.co/icons/wotb/current/achievements/big/medalRadleyWalters.png"", - ""order"": 102 - }, - { - ""id"": ""medalLehvaslaiho"", - ""sectionId"": ""epic"", - ""name"": ""Медаль Лехвеслайхо (medalLehvaslaiho)"", - ""condition"": ""• Уничтоженные танки должны превосходить танк игрока как минимум на 1 уровень."", - ""description"": ""Уничтожить 2 танка противника в одном бою, управляя средним танком."", - ""achievementValue"": 50, - ""maxSeriesValue"": null, - ""image"": ""http://glossary-eu-static.gcdn.co/icons/wotb/current/achievements/medalLehvaslaiho.png"", - ""imageBig"": ""http://glossary-eu-static.gcdn.co/icons/wotb/current/achievements/big/medalLehvaslaiho.png"", - ""order"": 604 - }, - { - ""id"": ""medalOrlik"", - ""sectionId"": ""epic"", - ""name"": ""Медаль Орлика (medalOrlik)"", - ""condition"": ""• Уничтоженные танки должны превосходить танк игрока как минимум на 1 уровень."", - ""description"": ""Уничтожить не менее 3 танков противника в одном бою, управляя лёгким танком."", - ""achievementValue"": 4, - ""maxSeriesValue"": null, - ""image"": ""http://glossary-eu-static.gcdn.co/icons/wotb/current/achievements/medalOrlik.png"", - ""imageBig"": ""http://glossary-eu-static.gcdn.co/icons/wotb/current/achievements/big/medalOrlik.png"", - ""order"": 605 - }, - { - ""id"": ""medalNikolas"", - ""sectionId"": ""epic"", - ""name"": ""Медаль Николса (medalNikolas)"", - ""condition"": ""• Уничтоженные танки должны превосходить танк игрока как минимум на 1 уровень."", - ""description"": ""Уничтожить не менее 4 танков противника в одном бою, управляя средним танком."", - ""achievementValue"": 1, - ""maxSeriesValue"": null, - ""image"": ""http://glossary-eu-static.gcdn.co/icons/wotb/current/achievements/medalNikolas.png"", - ""imageBig"": ""http://glossary-eu-static.gcdn.co/icons/wotb/current/achievements/big/medalNikolas.png"", - ""order"": 602 - }, - { - ""id"": ""medalKolobanov"", - ""sectionId"": ""epic"", - ""name"": ""Медаль Колобанова (medalKolobanov)"", - ""condition"": ""• Выжить в бою."", - ""description"": ""Победить в бою, оставшись в одиночку против 3 и более танков."", - ""achievementValue"": 7, - ""maxSeriesValue"": null, - ""image"": ""http://glossary-eu-static.gcdn.co/icons/wotb/current/achievements/medalKolobanov.png"", - ""imageBig"": ""http://glossary-eu-static.gcdn.co/icons/wotb/current/achievements/big/medalKolobanov.png"", - ""order"": 600 - }, - { - ""id"": ""medalLafayettePool"", - ""sectionId"": ""epic"", - ""name"": ""Медаль Пула (medalLafayettePool)"", - ""condition"": ""• Управлять танком V уровня и выше."", - ""description"": ""Уничтожить 6 танков противника в одном бою."", - ""achievementValue"": 7, - ""maxSeriesValue"": null, - ""image"": ""http://glossary-eu-static.gcdn.co/icons/wotb/current/achievements/medalLafayettePool.png"", - ""imageBig"": ""http://glossary-eu-static.gcdn.co/icons/wotb/current/achievements/big/medalLafayettePool.png"", - ""order"": 101 - } - ] - } - ] - } +""accountId"": 90277267, +""sections"": [ + { + ""sectionId"": ""platoon"", + ""order"": 5, + ""name"": ""ВЗВОДНЫЕ НАГРАДЫ"", + ""medals"": [ + { + ""id"": ""punisher"", + ""name"": ""«Мститель»"", + ""medalType"": null, + ""condition"": ""• IV степени – 1\n• III степени – 10\n• II степени – 100\n• I степени – 1 000"", + ""description"": ""Ликвидировать противника, уничтожившего игрока вашего взвода."", + ""achievementValue"": 4, + ""maxSeriesValue"": 1, + ""image"": null, + ""imageBig"": null, + ""order"": 1057, + ""sectionId"": ""platoon"" + }, + { + ""id"": ""jointVictory"", + ""name"": ""«Совместная победа»"", + ""medalType"": null, + ""condition"": ""• IV степени – 1\n• III степени – 10\n• II степени – 100\n• I степени – 1 000"", + ""description"": ""За количество победных боёв в составе взвода."", + ""achievementValue"": 3, + ""maxSeriesValue"": 23, + ""image"": ""http://glossary-eu-static.gcdn.co/icons/wotb/current/achievements/jointVictory3.png"", + ""imageBig"": ""http://glossary-eu-static.gcdn.co/icons/wotb/current/achievements/big/jointVictory3.png"", + ""order"": 1055, + ""sectionId"": ""platoon"" + }, + { + ""id"": ""medalCrucialContribution"", + ""name"": ""«Решающий вклад» (medalCrucialContribution)"", + ""medalType"": null, + ""condition"": ""• Выдаётся обоим игрокам взвода."", + ""description"": ""Взвод должен уничтожить не менее 6 танков противника."", + ""achievementValue"": 1, + ""maxSeriesValue"": null, + ""image"": ""http://glossary-eu-static.gcdn.co/icons/wotb/current/achievements/medalCrucialContribution.png"", + ""imageBig"": ""http://glossary-eu-static.gcdn.co/icons/wotb/current/achievements/big/medalCrucialContribution.png"", + ""order"": 400, + ""sectionId"": ""platoon"" + }, + { + ""id"": ""medalBrothersInArms"", + ""name"": ""«Братья по оружию» (medalBrothersInArms)"", + ""medalType"": null, + ""condition"": ""• Взвод должен выжить в бою.\n• Выдаётся обоим игрокам взвода."", + ""description"": ""Каждый игрок взвода должен уничтожить не менее 2 танков противника."", + ""achievementValue"": 1, + ""maxSeriesValue"": null, + ""image"": ""http://glossary-eu-static.gcdn.co/icons/wotb/current/achievements/medalBrothersInArms.png"", + ""imageBig"": ""http://glossary-eu-static.gcdn.co/icons/wotb/current/achievements/big/medalBrothersInArms.png"", + ""order"": 401, + ""sectionId"": ""platoon"" + } + ] + }, + { + ""sectionId"": ""title"", + ""order"": 1, + ""name"": ""ПОЧЁТНЫЕ ЗВАНИЯ"", + ""medals"": [ + { + ""id"": ""armorPiercer"", + ""name"": ""«Бронебойщик» (armorPiercer)"", + ""medalType"": null, + ""condition"": ""• Серия прерывается непробитием, рикошетом или промахом.\n• Серия ведётся для каждого танка отдельно и может продолжиться в следующем бою на этом же танке.\n• В общий зачёт идёт максимальная серия."", + ""description"": ""Пробить броню противника не менее 10 раз подряд."", + ""achievementValue"": 1, + ""maxSeriesValue"": 61, + ""image"": ""http://glossary-eu-static.gcdn.co/icons/wotb/current/achievements/armorPiercer.png"", + ""imageBig"": ""http://glossary-eu-static.gcdn.co/icons/wotb/current/achievements/big/armorPiercer.png"", + ""order"": 1014, + ""sectionId"": ""title"" + }, + { + ""id"": ""mechanicEngineer6"", + ""name"": ""«Инженер-механик: Япония» (mechanicEngineer6)"", + ""medalType"": null, + ""condition"": ""• Неисследованные модули не являются препятствием."", + ""description"": ""Исследовать все танки в Дереве танков Японии."", + ""achievementValue"": 1, + ""maxSeriesValue"": null, + ""image"": ""http://glossary-eu-static.gcdn.co/icons/wotb/current/achievements/mechanicEngineer6.png"", + ""imageBig"": ""http://glossary-eu-static.gcdn.co/icons/wotb/current/achievements/big/mechanicEngineer6.png"", + ""order"": 1206, + ""sectionId"": ""title"" + }, + { + ""id"": ""kamikaze"", + ""name"": ""«Камикадзе» (kamikaze)"", + ""medalType"": null, + ""condition"": ""• Танк противника должен быть выше уровнем.\n• Не более одной награды на игрока за бой."", + ""description"": ""Уничтожить противника тараном."", + ""achievementValue"": 24, + ""maxSeriesValue"": null, + ""image"": ""http://glossary-eu-static.gcdn.co/icons/wotb/current/achievements/kamikaze.png"", + ""imageBig"": ""http://glossary-eu-static.gcdn.co/icons/wotb/current/achievements/big/kamikaze.png"", + ""order"": 703, + ""sectionId"": ""title"" + }, + { + ""id"": ""sinai"", + ""name"": ""«Лев Синая» (sinai)"", + ""medalType"": null, + ""condition"": ""\t• ИС\n\t• ИС-3\n\t• ИС-3 Защитник\n\t• ИС-4\n\t• ИС-6\n\t• ИС-6 Бесстрашный\n\t• ИС-7\n\t• ИС-8\n\t• ИСУ-152\n\t• Объект 252У\n\t• Объект 263\n\t• Объект 268\n\t• Объект 704\n\t• ИСУ-122С\n\t• ИС-2 (1945)\n\t• ИС-2Ш\n\t• ИС-5\n\t• ИСУ-130\n\t• IS-2 Pravda SP\n\t• IS-2\n\n• Засчитывается сумма результатов по всем танкам.\n• В общем зачёте повторно полученные награды суммируются."", + ""description"": ""Уничтожить 100 танков ИС или танков на их базе.\nЗасчитываются:"", + ""achievementValue"": 11, + ""maxSeriesValue"": 1188, + ""image"": ""http://glossary-eu-static.gcdn.co/icons/wotb/current/achievements/sinai.png"", + ""imageBig"": ""http://glossary-eu-static.gcdn.co/icons/wotb/current/achievements/big/sinai.png"", + ""order"": 1013, + ""sectionId"": ""title"" + }, + { + ""id"": ""titleSniper"", + ""name"": ""«Стрелок» (titleSniper)"", + ""medalType"": null, + ""condition"": ""• Серия прерывается промахом.\n• Серия ведётся для каждого танка отдельно и может продолжиться в следующем бою на этом же танке.\n• В общий зачёт идёт максимальная серия."", + ""description"": ""Попасть в противника не менее 10 раз подряд."", + ""achievementValue"": 1, + ""maxSeriesValue"": 96, + ""image"": ""http://glossary-eu-static.gcdn.co/icons/wotb/current/achievements/titleSniper.png"", + ""imageBig"": ""http://glossary-eu-static.gcdn.co/icons/wotb/current/achievements/big/titleSniper.png"", + ""order"": 1015, + ""sectionId"": ""title"" + }, + { + ""id"": ""beasthunter"", + ""name"": ""«Зверобой» (beasthunter)"", + ""medalType"": null, + ""condition"": ""\t• Tiger II\n\t• Panther\n\t• Panther II\n\t• Panther/M10\n\t• Panther 8,8\n\t• Jagdpanther\n\t• Jagdpanther II\n\t• Tiger (P)\n\t• Tiger I\n\t• Jagdtiger\n\t• Jagdtiger 8,8\n\t• Новогодний Jagdtiger 8,8\n\t• Leopard Prototyp A\n\t• Leopard 1\n\t• Löwe\n\t• Tiger Kuromorimine SP\n\t• VK 16.02 Leopard\n\t• Tiger 131\n\n• Засчитывается сумма результатов по всем танкам.\n• В общем зачёте повторно полученные награды суммируются."", + ""description"": ""Уничтожить 100 танков «семейства кошачьих».\nЗасчитываются:"", + ""achievementValue"": 7, + ""maxSeriesValue"": 781, + ""image"": ""http://glossary-eu-static.gcdn.co/icons/wotb/current/achievements/beasthunter.png"", + ""imageBig"": ""http://glossary-eu-static.gcdn.co/icons/wotb/current/achievements/big/beasthunter.png"", + ""order"": 1012, + ""sectionId"": ""title"" + }, + { + ""id"": ""tankExpert3"", + ""name"": ""«Эксперт: Китай» (tankExpert3)"", + ""medalType"": null, + ""condition"": null, + ""description"": ""Уничтожить все танки из Дерева танков Китая, исключая премиум и коллекционные."", + ""achievementValue"": 1, + ""maxSeriesValue"": null, + ""image"": ""http://glossary-eu-static.gcdn.co/icons/wotb/current/achievements/tankExpert3.png"", + ""imageBig"": ""http://glossary-eu-static.gcdn.co/icons/wotb/current/achievements/big/tankExpert3.png"", + ""order"": 1303, + ""sectionId"": ""title"" + }, + { + ""id"": ""tankExpert2"", + ""name"": ""«Эксперт: США» (tankExpert2)"", + ""medalType"": null, + ""condition"": null, + ""description"": ""Уничтожить все танки из Дерева танков США, исключая премиум и коллекционные."", + ""achievementValue"": 1, + ""maxSeriesValue"": null, + ""image"": ""http://glossary-eu-static.gcdn.co/icons/wotb/current/achievements/tankExpert2.png"", + ""imageBig"": ""http://glossary-eu-static.gcdn.co/icons/wotb/current/achievements/big/tankExpert2.png"", + ""order"": 1302, + ""sectionId"": ""title"" + }, + { + ""id"": ""tankExpert1"", + ""name"": ""«Эксперт: Германия» (tankExpert1)"", + ""medalType"": null, + ""condition"": null, + ""description"": ""Уничтожить все танки из Дерева танков Германии, исключая премиум и коллекционные."", + ""achievementValue"": 1, + ""maxSeriesValue"": null, + ""image"": ""http://glossary-eu-static.gcdn.co/icons/wotb/current/achievements/tankExpert1.png"", + ""imageBig"": ""http://glossary-eu-static.gcdn.co/icons/wotb/current/achievements/big/tankExpert1.png"", + ""order"": 1301, + ""sectionId"": ""title"" + }, + { + ""id"": ""tankExpert0"", + ""name"": ""«Эксперт: СССР» (tankExpert0)"", + ""medalType"": null, + ""condition"": null, + ""description"": ""Уничтожить все танки из Дерева танков СССР, исключая премиум и коллекционные."", + ""achievementValue"": 1, + ""maxSeriesValue"": null, + ""image"": ""http://glossary-eu-static.gcdn.co/icons/wotb/current/achievements/tankExpert0.png"", + ""imageBig"": ""http://glossary-eu-static.gcdn.co/icons/wotb/current/achievements/big/tankExpert0.png"", + ""order"": 1300, + ""sectionId"": ""title"" + }, + { + ""id"": ""tankExpert6"", + ""name"": ""«Эксперт: Япония» (tankExpert6)"", + ""medalType"": null, + ""condition"": null, + ""description"": ""Уничтожить все танки из Дерева танков Японии, исключая премиум и коллекционные."", + ""achievementValue"": 1, + ""maxSeriesValue"": null, + ""image"": ""http://glossary-eu-static.gcdn.co/icons/wotb/current/achievements/tankExpert6.png"", + ""imageBig"": ""http://glossary-eu-static.gcdn.co/icons/wotb/current/achievements/big/tankExpert6.png"", + ""order"": 1306, + ""sectionId"": ""title"" + }, + { + ""id"": ""tankExpert5"", + ""name"": ""«Эксперт: Великобритания» (tankExpert5)"", + ""medalType"": null, + ""condition"": null, + ""description"": ""Уничтожить все танки из Дерева танков Великобритании, исключая премиум и коллекционные."", + ""achievementValue"": 1, + ""maxSeriesValue"": null, + ""image"": ""http://glossary-eu-static.gcdn.co/icons/wotb/current/achievements/tankExpert5.png"", + ""imageBig"": ""http://glossary-eu-static.gcdn.co/icons/wotb/current/achievements/big/tankExpert5.png"", + ""order"": 1305, + ""sectionId"": ""title"" + }, + { + ""id"": ""tankExpert4"", + ""name"": ""«Эксперт: Франция» (tankExpert4)"", + ""medalType"": null, + ""condition"": null, + ""description"": ""Уничтожить все танки из Дерева танков Франции, исключая премиум и коллекционные."", + ""achievementValue"": 1, + ""maxSeriesValue"": null, + ""image"": ""http://glossary-eu-static.gcdn.co/icons/wotb/current/achievements/tankExpert4.png"", + ""imageBig"": ""http://glossary-eu-static.gcdn.co/icons/wotb/current/achievements/big/tankExpert4.png"", + ""order"": 1304, + ""sectionId"": ""title"" + }, + { + ""id"": ""handOfDeath"", + ""name"": ""«Коса Смерти» (handOfDeath)"", + ""medalType"": null, + ""condition"": ""• Серия ведётся для каждого танка отдельно и может продолжиться в следующем бою на этом же танке.\n• В общий зачёт идёт максимальная серия.\n• Выдаётся в момент окончания очередной рекордной серии."", + ""description"": ""Уничтожить подряд не менее 3 танков противника, затратив на вторую и последующие по одному снаряду."", + ""achievementValue"": 1, + ""maxSeriesValue"": 5, + ""image"": ""http://glossary-eu-static.gcdn.co/icons/wotb/current/achievements/handOfDeath.png"", + ""imageBig"": ""http://glossary-eu-static.gcdn.co/icons/wotb/current/achievements/big/handOfDeath.png"", + ""order"": 1002, + ""sectionId"": ""title"" + }, + { + ""id"": ""invincible"", + ""name"": ""«Неуязвимый» (invincible)"", + ""medalType"": null, + ""condition"": ""• Серия ведётся для каждого танка отдельно и может продолжиться в следующем бою на этом же танке.\n• В общий зачёт идёт максимальная серия."", + ""description"": ""Не получить урона в 5 боях подряд."", + ""achievementValue"": 0, + ""maxSeriesValue"": 4, + ""image"": ""http://glossary-eu-static.gcdn.co/icons/wotb/current/achievements/invincible.png"", + ""imageBig"": ""http://glossary-eu-static.gcdn.co/icons/wotb/current/achievements/big/invincible.png"", + ""order"": 702, + ""sectionId"": ""title"" + }, + { + ""id"": ""tankExpert"", + ""name"": ""«Эксперт» (tankExpert)"", + ""medalType"": null, + ""condition"": null, + ""description"": ""Уничтожить все танки из Дерева танков каждой нации, исключая премиум и коллекционные."", + ""achievementValue"": 0, + ""maxSeriesValue"": 255, + ""image"": ""http://glossary-eu-static.gcdn.co/icons/wotb/current/achievements/tankExpert.png"", + ""imageBig"": ""http://glossary-eu-static.gcdn.co/icons/wotb/current/achievements/big/tankExpert.png"", + ""order"": 1101, + ""sectionId"": ""title"" + }, + { + ""id"": ""diehard"", + ""name"": ""«Живучий» (diehard)"", + ""medalType"": null, + ""condition"": ""• Серия ведётся для каждого танка отдельно и может продолжиться в следующем бою на этом же танке.\n• В общий зачёт идёт максимальная серия."", + ""description"": ""Выжить в 10 боях подряд на одном танке."", + ""achievementValue"": 0, + ""maxSeriesValue"": 8, + ""image"": ""http://glossary-eu-static.gcdn.co/icons/wotb/current/achievements/diehard.png"", + ""imageBig"": ""http://glossary-eu-static.gcdn.co/icons/wotb/current/achievements/big/diehard.png"", + ""order"": 106, + ""sectionId"": ""title"" + }, + { + ""id"": ""pattonValley"", + ""name"": ""«Долина Паттонов» (pattonValley)"", + ""medalType"": null, + ""condition"": ""\t• M46 Patton\n\t• M48 Patton\n\t• M60\n\n• Засчитывается сумма результатов по всем танкам.\n• В общем зачёте повторно полученные награды суммируются."", + ""description"": ""Уничтожить 100 танков Patton.\nЗасчитываются:"", + ""achievementValue"": 0, + ""maxSeriesValue"": 25, + ""image"": ""http://glossary-eu-static.gcdn.co/icons/wotb/current/achievements/pattonValley.png"", + ""imageBig"": ""http://glossary-eu-static.gcdn.co/icons/wotb/current/achievements/big/pattonValley.png"", + ""order"": 1011, + ""sectionId"": ""title"" + } + ] + }, + { + ""sectionId"": ""commemorative"", + ""order"": 3, + ""name"": ""ПАМЯТНЫЕ ЗНАКИ"", + ""medals"": [ + { + ""id"": ""cadet"", + ""name"": ""«Кадет» (cadet)"", + ""medalType"": null, + ""condition"": null, + ""description"": ""Пройти боевое обучение."", + ""achievementValue"": 1, + ""maxSeriesValue"": null, + ""image"": ""http://glossary-eu-static.gcdn.co/icons/wotb/current/achievements/cadet.png"", + ""imageBig"": ""http://glossary-eu-static.gcdn.co/icons/wotb/current/achievements/big/cadet.png"", + ""order"": 1051, + ""sectionId"": ""commemorative"" + }, + { + ""id"": ""firstBlood"", + ""name"": ""«Первая кровь» (firstBlood)"", + ""medalType"": null, + ""condition"": null, + ""description"": ""Уничтожить 1 танк противника."", + ""achievementValue"": 1, + ""maxSeriesValue"": null, + ""image"": ""http://glossary-eu-static.gcdn.co/icons/wotb/current/achievements/firstBlood.png"", + ""imageBig"": ""http://glossary-eu-static.gcdn.co/icons/wotb/current/achievements/big/firstBlood.png"", + ""order"": 1052, + ""sectionId"": ""commemorative"" + }, + { + ""id"": ""firstVictory"", + ""name"": ""«Первая победа» (firstVictory)"", + ""medalType"": null, + ""condition"": null, + ""description"": ""Победить в первом обычном бою с другими игроками."", + ""achievementValue"": 1, + ""maxSeriesValue"": null, + ""image"": ""http://glossary-eu-static.gcdn.co/icons/wotb/current/achievements/firstVictory.png"", + ""imageBig"": ""http://glossary-eu-static.gcdn.co/icons/wotb/current/achievements/big/firstVictory.png"", + ""order"": 1053, + ""sectionId"": ""commemorative"" + }, + { + ""id"": ""huntsman"", + ""name"": ""«Егерь» (huntsman)"", + ""medalType"": null, + ""condition"": null, + ""description"": ""Уничтожить все лёгкие танки противника в одном бою, но не менее 3."", + ""achievementValue"": 4, + ""maxSeriesValue"": null, + ""image"": ""http://glossary-eu-static.gcdn.co/icons/wotb/current/achievements/huntsman.png"", + ""imageBig"": ""http://glossary-eu-static.gcdn.co/icons/wotb/current/achievements/big/huntsman.png"", + ""order"": 300, + ""sectionId"": ""commemorative"" + }, + { + ""id"": ""ironMan"", + ""name"": ""«Невозмутимый» (ironMan)"", + ""medalType"": null, + ""condition"": null, + ""description"": ""Получить подряд не менее 10 рикошетов и непробитий от противника."", + ""achievementValue"": 24, + ""maxSeriesValue"": null, + ""image"": ""http://glossary-eu-static.gcdn.co/icons/wotb/current/achievements/ironMan.png"", + ""imageBig"": ""http://glossary-eu-static.gcdn.co/icons/wotb/current/achievements/big/ironMan.png"", + ""order"": 1007, + ""sectionId"": ""commemorative"" + }, + { + ""id"": ""sturdy"", + ""name"": ""«Спартанец» (sturdy)"", + ""medalType"": null, + ""condition"": ""• Выжить в бою."", + ""description"": ""Получить рикошет или непробитие от противника при прочности танка менее 10%."", + ""achievementValue"": 82, + ""maxSeriesValue"": null, + ""image"": ""http://glossary-eu-static.gcdn.co/icons/wotb/current/achievements/sturdy.png"", + ""imageBig"": ""http://glossary-eu-static.gcdn.co/icons/wotb/current/achievements/big/sturdy.png"", + ""order"": 1008, + ""sectionId"": ""commemorative"" + } + ] + }, + { + ""sectionId"": ""step"", + ""order"": 4, + ""name"": ""ЭТАПНЫЕ НАГРАДЫ"", + ""medals"": [ + { + ""id"": ""medalCarius"", + ""name"": ""Медаль Кариуса"", + ""medalType"": null, + ""condition"": ""• IV степени – 10\n• III степени – 100\n• II степени – 1 000\n• I степени – 10 000"", + ""description"": ""За количество уничтоженных танков противника."", + ""achievementValue"": 2, + ""maxSeriesValue"": null, + ""image"": ""http://glossary-eu-static.gcdn.co/icons/wotb/current/achievements/medalCarius2.png"", + ""imageBig"": ""http://glossary-eu-static.gcdn.co/icons/wotb/current/achievements/big/medalCarius2.png"", + ""order"": 1401, + ""sectionId"": ""step"" + }, + { + ""id"": ""medalEkins"", + ""name"": ""Медаль Экинса"", + ""medalType"": null, + ""condition"": ""• IV степени – 3\n• III степени – 30\n• II степени – 300\n• I степени – 3 000"", + ""description"": ""За количество уничтоженных танков противника VIII–X уровней."", + ""achievementValue"": 1, + ""maxSeriesValue"": null, + ""image"": ""http://glossary-eu-static.gcdn.co/icons/wotb/current/achievements/medalEkins1.png"", + ""imageBig"": ""http://glossary-eu-static.gcdn.co/icons/wotb/current/achievements/big/medalEkins1.png"", + ""order"": 1402, + ""sectionId"": ""step"" + }, + { + ""id"": ""medalKay"", + ""name"": ""Медаль Кея"", + ""medalType"": null, + ""condition"": ""• IV степени – 1\n• III степени – 10\n• II степени – 100\n• I степени – 1 000"", + ""description"": ""За получение статуса «Герой битвы»."", + ""achievementValue"": 1, + ""maxSeriesValue"": 1700, + ""image"": ""http://glossary-eu-static.gcdn.co/icons/wotb/current/achievements/medalKay1.png"", + ""imageBig"": ""http://glossary-eu-static.gcdn.co/icons/wotb/current/achievements/big/medalKay1.png"", + ""order"": 1400, + ""sectionId"": ""step"" + }, + { + ""id"": ""medalLeClerc"", + ""name"": ""Медаль Леклерка"", + ""medalType"": null, + ""condition"": ""• Победить в бою.\n• Засчитываются все очки захвата, набранные за один бой, за исключением очков захвата, полученных в Превосходстве.\n\n• IV степени – 30\n• III степени – 300\n• II степени – 3 000\n• I степени – 30 000"", + ""description"": ""За суммарное количество очков захвата базы."", + ""achievementValue"": 2, + ""maxSeriesValue"": null, + ""image"": ""http://glossary-eu-static.gcdn.co/icons/wotb/current/achievements/medalLeClerc2.png"", + ""imageBig"": ""http://glossary-eu-static.gcdn.co/icons/wotb/current/achievements/big/medalLeClerc2.png"", + ""order"": 1406, + ""sectionId"": ""step"" + }, + { + ""id"": ""medalAbrams"", + ""name"": ""Медаль Абрамса"", + ""medalType"": null, + ""condition"": ""• IV степени – 10\n• III степени – 100\n• II степени – 1 000\n• I степени – 10 000"", + ""description"": ""За количество победных боёв, в которых игрок остался жив."", + ""achievementValue"": 2, + ""maxSeriesValue"": null, + ""image"": ""http://glossary-eu-static.gcdn.co/icons/wotb/current/achievements/medalAbrams2.png"", + ""imageBig"": ""http://glossary-eu-static.gcdn.co/icons/wotb/current/achievements/big/medalAbrams2.png"", + ""order"": 1405, + ""sectionId"": ""step"" + }, + { + ""id"": ""medalPoppel"", + ""name"": ""Медаль Попеля"", + ""medalType"": null, + ""condition"": ""• IV степени – 20\n• III степени – 200\n• II степени – 2 000\n• I степени – 20 000"", + ""description"": ""За количество обнаруженных танков противника."", + ""achievementValue"": 2, + ""maxSeriesValue"": null, + ""image"": ""http://glossary-eu-static.gcdn.co/icons/wotb/current/achievements/medalPoppel2.png"", + ""imageBig"": ""http://glossary-eu-static.gcdn.co/icons/wotb/current/achievements/big/medalPoppel2.png"", + ""order"": 1404, + ""sectionId"": ""step"" + }, + { + ""id"": ""medalSupremacy"", + ""name"": ""Медаль Превосходство"", + ""medalType"": null, + ""condition"": ""• Накопительная медаль.\n• Засчитываются все очки победы, набранные в Превосходстве.\n\n• IV степени – 10 000\n• III степени – 100 000\n• II степени – 1 000 000\n• I степени – 10 000 000"", + ""description"": ""За очки победы в Превосходстве."", + ""achievementValue"": 3, + ""maxSeriesValue"": null, + ""image"": ""http://glossary-eu-static.gcdn.co/icons/wotb/current/achievements/medalSupremacy3.png"", + ""imageBig"": ""http://glossary-eu-static.gcdn.co/icons/wotb/current/achievements/big/medalSupremacy3.png"", + ""order"": 1408, + ""sectionId"": ""step"" + }, + { + ""id"": ""medalLavrinenko"", + ""name"": ""Медаль Лавриненко"", + ""medalType"": null, + ""condition"": ""• Засчитывается не более 100 очков за бой.\n• Не засчитываются сбитые очки захвата точек, заработанные в Превосходстве\n\n• IV степени – 30\n• III степени – 300\n• II степени – 3 000\n• I степени – 30 000"", + ""description"": ""За суммарное количество сбитых очков захвата базы."", + ""achievementValue"": 2, + ""maxSeriesValue"": null, + ""image"": ""http://glossary-eu-static.gcdn.co/icons/wotb/current/achievements/medalLavrinenko2.png"", + ""imageBig"": ""http://glossary-eu-static.gcdn.co/icons/wotb/current/achievements/big/medalLavrinenko2.png"", + ""order"": 1407, + ""sectionId"": ""step"" + }, + { + ""id"": ""medalKnispel"", + ""name"": ""Медаль Книспеля"", + ""medalType"": null, + ""condition"": ""• IV степени – 10 000\n• III степени – 100 000\n• II степени – 1 000 000\n• I степени – 10 000 000"", + ""description"": ""За суммарное количество нанесённого и полученного урона."", + ""achievementValue"": 1, + ""maxSeriesValue"": null, + ""image"": ""http://glossary-eu-static.gcdn.co/icons/wotb/current/achievements/medalKnispel1.png"", + ""imageBig"": ""http://glossary-eu-static.gcdn.co/icons/wotb/current/achievements/big/medalKnispel1.png"", + ""order"": 1403, + ""sectionId"": ""step"" + } + ] + }, + { + ""sectionId"": ""battle"", + ""order"": 0, + ""name"": ""«ГЕРОЙ БИТВЫ»"", + ""medals"": [ + { + ""id"": ""invader"", + ""name"": ""«Захватчик» (invader)"", + ""medalType"": null, + ""condition"": ""• Выиграть бой захватом базы.\n• Засчитываются только очки, обеспечившие захват.\n• Не засчитываются очки захвата точек, полученные в Превосходстве."", + ""description"": ""Получить наибольшее количество очков захвата базы, но не менее 80."", + ""achievementValue"": 6, + ""maxSeriesValue"": null, + ""image"": ""http://glossary-eu-static.gcdn.co/icons/wotb/current/achievements/invader.png"", + ""imageBig"": ""http://glossary-eu-static.gcdn.co/icons/wotb/current/achievements/big/invader.png"", + ""order"": 203, + ""sectionId"": ""battle"" + }, + { + ""id"": ""markOfMasteryII"", + ""name"": ""Знак классности \n«2 степень» (markOfMasteryII)"", + ""medalType"": null, + ""condition"": null, + ""description"": ""Присваивается игроку за мастерство владения танком. Для получения награды необходимо заработать больше опыта за бой, чем средний максимальный опыт за неделю у 80% игроков на данном танке."", + ""achievementValue"": 853, + ""maxSeriesValue"": null, + ""image"": ""http://glossary-eu-static.gcdn.co/icons/wotb/current/achievements/markOfMasteryII.png"", + ""imageBig"": ""http://glossary-eu-static.gcdn.co/icons/wotb/current/achievements/big/markOfMasteryII.png"", + ""order"": 2, + ""sectionId"": ""battle"" + }, + { + ""id"": ""markOfMasteryI"", + ""name"": ""Знак классности \n«1 степень» (markOfMasteryI)"", + ""medalType"": null, + ""condition"": null, + ""description"": ""Присваивается игроку за мастерство владения танком. Для получения награды необходимо заработать больше опыта за бой, чем средний максимальный опыт за неделю у 95% игроков на данном танке."", + ""achievementValue"": 203, + ""maxSeriesValue"": null, + ""image"": ""http://glossary-eu-static.gcdn.co/icons/wotb/current/achievements/markOfMasteryI.png"", + ""imageBig"": ""http://glossary-eu-static.gcdn.co/icons/wotb/current/achievements/big/markOfMasteryI.png"", + ""order"": 1, + ""sectionId"": ""battle"" + }, + { + ""id"": ""defender"", + ""name"": ""«Защитник» (defender)"", + ""medalType"": null, + ""condition"": ""• При равном количестве сбитых очков награждается игрок, получивший наибольшее количество очков опыта за бой.\n• Выдаётся только одна награда за бой.\n• Не засчитываются очки захвата точек, полученные в Превосходстве."", + ""description"": ""Защитить базу, сбив наибольшее количество очков захвата, но не менее 70."", + ""achievementValue"": 23, + ""maxSeriesValue"": null, + ""image"": ""http://glossary-eu-static.gcdn.co/icons/wotb/current/achievements/defender.png"", + ""imageBig"": ""http://glossary-eu-static.gcdn.co/icons/wotb/current/achievements/big/defender.png"", + ""order"": 202, + ""sectionId"": ""battle"" + }, + { + ""id"": ""markOfMasteryIII"", + ""name"": ""Знак классности \n«3 степень» (markOfMasteryIII)"", + ""medalType"": null, + ""condition"": null, + ""description"": ""Присваивается игроку за мастерство владения танком. Для получения награды необходимо заработать больше опыта за бой, чем средний максимальный опыт за неделю у 50% игроков на данном танке."", + ""achievementValue"": 1783, + ""maxSeriesValue"": null, + ""image"": ""http://glossary-eu-static.gcdn.co/icons/wotb/current/achievements/markOfMasteryIII.png"", + ""imageBig"": ""http://glossary-eu-static.gcdn.co/icons/wotb/current/achievements/big/markOfMasteryIII.png"", + ""order"": 3, + ""sectionId"": ""battle"" + }, + { + ""id"": ""supporter"", + ""name"": ""«Поддержка» (supporter)"", + ""medalType"": null, + ""condition"": ""• Засчитываются цели, которые впоследствии были уничтожены другими игроками или самоуничтожились.\n• Рикошеты и непробития не учитываются.\n• При равном количестве повреждённых танков награждается игрок, получивший наибольшее количество очков опыта за бой.\n• Выдаётся только одна награда за бой."", + ""description"": ""Нанести урон или сбить гусеницу наибольшему количеству танков противника, но не менее чем 4."", + ""achievementValue"": 823, + ""maxSeriesValue"": null, + ""image"": ""http://glossary-eu-static.gcdn.co/icons/wotb/current/achievements/supporter.png"", + ""imageBig"": ""http://glossary-eu-static.gcdn.co/icons/wotb/current/achievements/big/supporter.png"", + ""order"": 6, + ""sectionId"": ""battle"" + }, + { + ""id"": ""steelwall"", + ""name"": ""«Стальная cтена» (steelwall)"", + ""medalType"": null, + ""condition"": ""• Выжить в бою.\n• При равном количестве полученного потенциального урона награждается игрок, получивший больше попаданий.\n• При равном количестве полученного потенциального урона и попаданий награждается игрок, получивший наибольшее количество очков опыта за бой.\n• Выдаётся только одна награда за бой."", + ""description"": ""Получить не менее 1 000 единиц потенциального урона и не менее 11 попаданий."", + ""achievementValue"": 129, + ""maxSeriesValue"": null, + ""image"": ""http://glossary-eu-static.gcdn.co/icons/wotb/current/achievements/steelwall.png"", + ""imageBig"": ""http://glossary-eu-static.gcdn.co/icons/wotb/current/achievements/big/steelwall.png"", + ""order"": 201, + ""sectionId"": ""battle"" + }, + { + ""id"": ""mainGun"", + ""name"": ""«Основной калибр» (mainGun)"", + ""medalType"": null, + ""condition"": ""• Нанесённый урон должен составлять не менее 35% от суммарной прочности танков противника и не менее 1000 единиц.\n• При равном количестве нанесённого урона награждается игрок, получивший наибольшее количество очков опыта за бой.\n• Выдаётся только одна награда за бой."", + ""description"": ""Нанести наибольшее количество урона за бой."", + ""achievementValue"": 255, + ""maxSeriesValue"": null, + ""image"": ""http://glossary-eu-static.gcdn.co/icons/wotb/current/achievements/mainGun.png"", + ""imageBig"": ""http://glossary-eu-static.gcdn.co/icons/wotb/current/achievements/big/mainGun.png"", + ""order"": 5, + ""sectionId"": ""battle"" + }, + { + ""id"": ""warrior"", + ""name"": ""«Воин» (warrior)"", + ""medalType"": null, + ""condition"": ""• При равном счёте награждается игрок, получивший наибольшее количество очков опыта за бой.\n• Выдаётся только одна награда за бой."", + ""description"": ""Уничтожить наибольшее количество танков противника, но не менее 4."", + ""achievementValue"": 236, + ""maxSeriesValue"": null, + ""image"": ""http://glossary-eu-static.gcdn.co/icons/wotb/current/achievements/warrior.png"", + ""imageBig"": ""http://glossary-eu-static.gcdn.co/icons/wotb/current/achievements/big/warrior.png"", + ""order"": 4, + ""sectionId"": ""battle"" + }, + { + ""id"": ""camper"", + ""name"": ""«Танкист-снайпер» (camper)"", + ""medalType"": null, + ""condition"": ""• Произвести не менее 8 выстрелов.\n• Не менее 80% попаданий должны быть с нанесением урона.\n• Учитывается урон танкам противника и повреждения модулей.\n• Общая точность стрельбы за бой должна быть не менее 85%.\n• Нанесённый урон должен превышать количество очков прочности танка игрока и быть не менее 1000 единиц.\n• При равном количестве нанесённого урона награждается игрок, получивший наибольшее количество очков опыта за бой.\n• Выдаётся только одна награда за бой."", + ""description"": ""Нанести наибольшее количество урона за бой с дистанции не менее 250 м."", + ""achievementValue"": 7, + ""maxSeriesValue"": null, + ""image"": ""http://glossary-eu-static.gcdn.co/icons/wotb/current/achievements/camper.png"", + ""imageBig"": ""http://glossary-eu-static.gcdn.co/icons/wotb/current/achievements/big/camper.png"", + ""order"": 7, + ""sectionId"": ""battle"" + }, + { + ""id"": ""markOfMastery"", + ""name"": ""Знак классности \n«Мастер» (markOfMastery)"", + ""medalType"": null, + ""condition"": null, + ""description"": ""Присваивается игроку за мастерство владения танком. Для получения награды необходимо заработать больше опыта за бой, чем средний максимальный опыт за неделю у 99% игроков на данном танке."", + ""achievementValue"": 76, + ""maxSeriesValue"": null, + ""image"": ""http://glossary-eu-static.gcdn.co/icons/wotb/current/achievements/markOfMastery.png"", + ""imageBig"": ""http://glossary-eu-static.gcdn.co/icons/wotb/current/achievements/big/markOfMastery.png"", + ""order"": 0, + ""sectionId"": ""battle"" + }, + { + ""id"": ""scout"", + ""name"": ""«Разведчик» (scout)"", + ""medalType"": null, + ""condition"": ""• Победить в бою.\n• Выдаётся только одна награда за бой."", + ""description"": ""Обнаружить наибольшее количество танков противника, но не менее 5."", + ""achievementValue"": 151, + ""maxSeriesValue"": null, + ""image"": ""http://glossary-eu-static.gcdn.co/icons/wotb/current/achievements/scout.png"", + ""imageBig"": ""http://glossary-eu-static.gcdn.co/icons/wotb/current/achievements/big/scout.png"", + ""order"": 204, + ""sectionId"": ""battle"" + }, + { + ""id"": ""evileye"", + ""name"": ""«Дозорный» (evileye)"", + ""medalType"": null, + ""condition"": ""• Засчитываются цели, разведданные по которым в момент их повреждения передавал только один игрок.\n• При равном количестве повреждённых танков награждается игрок, получивший наибольшее количество очков опыта за бой.\n• Выдаётся только одна награда за бой."", + ""description"": ""Предоставить разведданные, по которым союзники повредят не менее 3 танков противника."", + ""achievementValue"": 70, + ""maxSeriesValue"": null, + ""image"": ""http://glossary-eu-static.gcdn.co/icons/wotb/current/achievements/evileye.png"", + ""imageBig"": ""http://glossary-eu-static.gcdn.co/icons/wotb/current/achievements/big/evileye.png"", + ""order"": 200, + ""sectionId"": ""battle"" + } + ] + }, + { + ""sectionId"": ""epic"", + ""order"": 2, + ""name"": ""ЭПИЧЕСКИЕ МЕДАЛИ"", + ""medals"": [ + { + ""id"": ""medalHalonen"", + ""name"": ""Медаль Халонена (medalHalonen)"", + ""medalType"": null, + ""condition"": ""• Уничтоженные танки должны превосходить ПТ-САУ игрока как минимум на 1 уровень."", + ""description"": ""Уничтожить не менее 3 танков противника в одном бою, управляя ПТ-САУ."", + ""achievementValue"": 3, + ""maxSeriesValue"": null, + ""image"": ""http://glossary-eu-static.gcdn.co/icons/wotb/current/achievements/medalHalonen.png"", + ""imageBig"": ""http://glossary-eu-static.gcdn.co/icons/wotb/current/achievements/big/medalHalonen.png"", + ""order"": 606, + ""sectionId"": ""epic"" + }, + { + ""id"": ""medalOskin"", + ""name"": ""Медаль Оськина (medalOskin)"", + ""medalType"": null, + ""condition"": ""• Уничтоженные танки должны превосходить танк игрока как минимум на 1 уровень."", + ""description"": ""Уничтожить 3 танка противника в одном бою, управляя средним танком."", + ""achievementValue"": 6, + ""maxSeriesValue"": null, + ""image"": ""http://glossary-eu-static.gcdn.co/icons/wotb/current/achievements/medalOskin.png"", + ""imageBig"": ""http://glossary-eu-static.gcdn.co/icons/wotb/current/achievements/big/medalOskin.png"", + ""order"": 603, + ""sectionId"": ""epic"" + }, + { + ""id"": ""medalRadleyWalters"", + ""name"": ""Медаль Рэдли-Уолтерса (medalRadleyWalters)"", + ""medalType"": null, + ""condition"": ""• Управлять танком V уровня и выше."", + ""description"": ""Уничтожить 5 танков противника в одном бою."", + ""achievementValue"": 35, + ""maxSeriesValue"": null, + ""image"": ""http://glossary-eu-static.gcdn.co/icons/wotb/current/achievements/medalRadleyWalters.png"", + ""imageBig"": ""http://glossary-eu-static.gcdn.co/icons/wotb/current/achievements/big/medalRadleyWalters.png"", + ""order"": 102, + ""sectionId"": ""epic"" + }, + { + ""id"": ""medalLehvaslaiho"", + ""name"": ""Медаль Лехвеслайхо (medalLehvaslaiho)"", + ""medalType"": null, + ""condition"": ""• Уничтоженные танки должны превосходить танк игрока как минимум на 1 уровень."", + ""description"": ""Уничтожить 2 танка противника в одном бою, управляя средним танком."", + ""achievementValue"": 50, + ""maxSeriesValue"": null, + ""image"": ""http://glossary-eu-static.gcdn.co/icons/wotb/current/achievements/medalLehvaslaiho.png"", + ""imageBig"": ""http://glossary-eu-static.gcdn.co/icons/wotb/current/achievements/big/medalLehvaslaiho.png"", + ""order"": 604, + ""sectionId"": ""epic"" + }, + { + ""id"": ""medalOrlik"", + ""name"": ""Медаль Орлика (medalOrlik)"", + ""medalType"": null, + ""condition"": ""• Уничтоженные танки должны превосходить танк игрока как минимум на 1 уровень."", + ""description"": ""Уничтожить не менее 3 танков противника в одном бою, управляя лёгким танком."", + ""achievementValue"": 4, + ""maxSeriesValue"": null, + ""image"": ""http://glossary-eu-static.gcdn.co/icons/wotb/current/achievements/medalOrlik.png"", + ""imageBig"": ""http://glossary-eu-static.gcdn.co/icons/wotb/current/achievements/big/medalOrlik.png"", + ""order"": 605, + ""sectionId"": ""epic"" + }, + { + ""id"": ""medalNikolas"", + ""name"": ""Медаль Николса (medalNikolas)"", + ""medalType"": null, + ""condition"": ""• Уничтоженные танки должны превосходить танк игрока как минимум на 1 уровень."", + ""description"": ""Уничтожить не менее 4 танков противника в одном бою, управляя средним танком."", + ""achievementValue"": 1, + ""maxSeriesValue"": null, + ""image"": ""http://glossary-eu-static.gcdn.co/icons/wotb/current/achievements/medalNikolas.png"", + ""imageBig"": ""http://glossary-eu-static.gcdn.co/icons/wotb/current/achievements/big/medalNikolas.png"", + ""order"": 602, + ""sectionId"": ""epic"" + }, + { + ""id"": ""medalKolobanov"", + ""name"": ""Медаль Колобанова (medalKolobanov)"", + ""medalType"": null, + ""condition"": ""• Выжить в бою."", + ""description"": ""Победить в бою, оставшись в одиночку против 3 и более танков."", + ""achievementValue"": 7, + ""maxSeriesValue"": null, + ""image"": ""http://glossary-eu-static.gcdn.co/icons/wotb/current/achievements/medalKolobanov.png"", + ""imageBig"": ""http://glossary-eu-static.gcdn.co/icons/wotb/current/achievements/big/medalKolobanov.png"", + ""order"": 600, + ""sectionId"": ""epic"" + }, + { + ""id"": ""medalLafayettePool"", + ""name"": ""Медаль Пула (medalLafayettePool)"", + ""medalType"": null, + ""condition"": ""• Управлять танком V уровня и выше."", + ""description"": ""Уничтожить 6 танков противника в одном бою."", + ""achievementValue"": 7, + ""maxSeriesValue"": null, + ""image"": ""http://glossary-eu-static.gcdn.co/icons/wotb/current/achievements/medalLafayettePool.png"", + ""imageBig"": ""http://glossary-eu-static.gcdn.co/icons/wotb/current/achievements/big/medalLafayettePool.png"", + ""order"": 101, + ""sectionId"": ""epic"" + } + ] } - } + ] +} "; } } \ No newline at end of file diff --git a/WotBlitzStatisticsPro.Blazor/Services/Mock/GraphQlBackendMockService.cs b/WotBlitzStatisticsPro.Blazor/Services/Mock/GraphQlBackendMockService.cs index c16ddc1..d079e46 100644 --- a/WotBlitzStatisticsPro.Blazor/Services/Mock/GraphQlBackendMockService.cs +++ b/WotBlitzStatisticsPro.Blazor/Services/Mock/GraphQlBackendMockService.cs @@ -74,7 +74,7 @@ namespace WotBlitzStatisticsPro.Blazor.Services.Mock return result; } - public async Task GetPlayerInfo(long accountId, RealmType realmType) + public async Task<(IPlayer_AccountInfo accountInfo, IReadOnlyList achievementsBySection)> GetPlayerInfo(long accountId, RealmType realmType) { var faker = new Faker(FakerLanguage(GetLanguage())); var tanksCount = faker.Random.Number(10, 280); @@ -156,13 +156,13 @@ namespace WotBlitzStatisticsPro.Blazor.Services.Mock await Task.Delay(1000); } - return new Player_AccountInfo_AccountInfoResponse( + var player = new Player_AccountInfo_AccountInfoResponse( accountId, faker.Date.Past(), faker.Date.Past(), faker.Internet.UserName(), - tanks[faker.Random.Number(1, tanks.Count)].TankId, - tanks[faker.Random.Number(1, tanks.Count)].TankId, + tanks[faker.Random.Number(1, tanks.Count-1)].TankId, + tanks[faker.Random.Number(1, tanks.Count-1)].TankId, faker.Random.Long(1, 100000), faker.Random.Long(1, 9999), faker.Random.Long(1, 9999), @@ -190,6 +190,10 @@ namespace WotBlitzStatisticsPro.Blazor.Services.Mock clanInfo, tanks ); + + var achievements = AchievementsMockData.GetStaticAchievements(); + + return (player, achievements?.Sections); } private string FakerLanguage(RequestLanguage language) diff --git a/WotBlitzStatisticsPro.Blazor/graphql/PlayerInfo.graphql b/WotBlitzStatisticsPro.Blazor/graphql/PlayerInfo.graphql index 7349e6d..2abcd57 100644 --- a/WotBlitzStatisticsPro.Blazor/graphql/PlayerInfo.graphql +++ b/WotBlitzStatisticsPro.Blazor/graphql/PlayerInfo.graphql @@ -94,4 +94,29 @@ query player( normalImage } } + accountMedals( + accountId: $accountId, + realmType: $realmType, + requestLanguage: $requestLanguage + ) { + accountId + sections { + sectionId + order + name + medals { + id + name + medalType + condition + description + achievementValue + maxSeriesValue + image + imageBig + order + sectionId + } + } + } } \ No newline at end of file diff --git a/WotBlitzStatisticsPro.Blazor/graphql/schema.graphql b/WotBlitzStatisticsPro.Blazor/graphql/schema.graphql index 360dc17..596db15 100644 --- a/WotBlitzStatisticsPro.Blazor/graphql/schema.graphql +++ b/WotBlitzStatisticsPro.Blazor/graphql/schema.graphql @@ -15,9 +15,9 @@ type Query { "Tank statistics history for period since \"startDate\"" tankInfoHistory("AccountId" accountId: Long! "TankId" tankId: Long! "Date from history started" startDate: DateTime! "Account region" realmType: RealmType "Request language" requestLanguage: RequestLanguage): TankInfoHistoryResponse! "Returns information about player's achievements" - accountAchievements("AccountId" accountId: Long! "Account region" realmType: RealmType "Request language" requestLanguage: RequestLanguage): AccountAchievementsResponse! + accountMedals("AccountId" accountId: Long! "Account region" realmType: RealmType "Request language" requestLanguage: RequestLanguage): AccountAchievementsResponse! "Returns information about player's tank achievements" - tankAchievements("AccountId" accountId: Long! "Account tank Id" tankId: Long! "Account region" realmType: RealmType "Request language" requestLanguage: RequestLanguage): AccountAchievementsResponse! + tankMedals("AccountId" accountId: Long! "Account tank Id" tankId: Long! "Account region" realmType: RealmType "Request language" requestLanguage: RequestLanguage): AccountAchievementsResponse! } type Mutation { @@ -131,6 +131,8 @@ type AccountInfoResponse { survivalRate: Decimal! "All player's tanks" tanks: [TankInfoResponse!] + "Account Region and request language" + regionAndLanguage: RealmAndLanguage! } "Account search result item" @@ -285,6 +287,12 @@ type TankInfoResponse { normalImage: String } +"Represents pair of realm type a nd requested language" +type RealmAndLanguage { + realm: RealmType! + language: RequestLanguage! +} + "Request for update dictionaries mutation" input UpdateDictionariesRequestInput { "Determines what dictionaries should be updated. Usage: StaticDictionaries | Achievements | Vehicles" @@ -304,7 +312,7 @@ type AccountAchievementsResponse { "Player Id" accountId: Long! "Player Achievements by sections" - achievementSections: [AchievementSection!] + sections: [AchievementSection!] } "Information about tank statistics history" @@ -420,7 +428,7 @@ type AchievementSection { "Section Name" name: String! "Achievements in the section" - achievements: [Achievement!] + medals: [Achievement!] } "List of dictionaries" @@ -460,7 +468,7 @@ type Achievement { "Section Id" sectionId: String! "Achievement type" - type: String! + medalType: String } type StatisticsDifferenceItemOfDecimal { diff --git a/WotBlitzStatisticsPro.Common/Model/AccountAchievementsResponse.cs b/WotBlitzStatisticsPro.Common/Model/AccountAchievementsResponse.cs index f1155cd..ab3788b 100644 --- a/WotBlitzStatisticsPro.Common/Model/AccountAchievementsResponse.cs +++ b/WotBlitzStatisticsPro.Common/Model/AccountAchievementsResponse.cs @@ -16,6 +16,6 @@ namespace WotBlitzStatisticsPro.Common.Model /// /// Player Achievements by sections /// - public List? AchievementSections { get; set; } + public List? Sections { get; set; } } } \ No newline at end of file diff --git a/WotBlitzStatisticsPro.Common/Model/Achievements/Achievement.cs b/WotBlitzStatisticsPro.Common/Model/Achievements/Achievement.cs index 9ee7b5b..d5573bd 100644 --- a/WotBlitzStatisticsPro.Common/Model/Achievements/Achievement.cs +++ b/WotBlitzStatisticsPro.Common/Model/Achievements/Achievement.cs @@ -58,7 +58,7 @@ /// /// Achievement type /// - public string Type { get; set; } = string.Empty; + public string? MedalType { get; set; } } } \ No newline at end of file diff --git a/WotBlitzStatisticsPro.Common/Model/Achievements/AchievementSection.cs b/WotBlitzStatisticsPro.Common/Model/Achievements/AchievementSection.cs index 4a0dd66..37d1493 100644 --- a/WotBlitzStatisticsPro.Common/Model/Achievements/AchievementSection.cs +++ b/WotBlitzStatisticsPro.Common/Model/Achievements/AchievementSection.cs @@ -25,6 +25,6 @@ namespace WotBlitzStatisticsPro.Common.Model.Achievements /// /// Achievements in the section /// - public List? Achievements { get; set; } + public List? Medals { get; set; } } } \ No newline at end of file diff --git a/WotBlitzStatisticsPro.GraphQl/Query/WotBlitzAchievementsQuery.cs b/WotBlitzStatisticsPro.GraphQl/Query/WotBlitzAchievementsQuery.cs index b666794..f284d53 100644 --- a/WotBlitzStatisticsPro.GraphQl/Query/WotBlitzAchievementsQuery.cs +++ b/WotBlitzStatisticsPro.GraphQl/Query/WotBlitzAchievementsQuery.cs @@ -21,7 +21,7 @@ namespace WotBlitzStatisticsPro.GraphQl.Query /// Account region /// AccountId /// Request language - public Task GetAccountAchievements( + public Task AccountMedals( long accountId, RealmType? realmType, RequestLanguage? requestLanguage) @@ -36,7 +36,7 @@ namespace WotBlitzStatisticsPro.GraphQl.Query /// Account region /// AccountId /// Request language - public Task GetTankAchievements( + public Task TankMedals( long accountId, long tankId, RealmType? realmType, diff --git a/WotBlitzStatisticsPro.Logic/Mappers/AchievementsProfile.cs b/WotBlitzStatisticsPro.Logic/Mappers/AchievementsProfile.cs index 6844a6d..c0f420b 100644 --- a/WotBlitzStatisticsPro.Logic/Mappers/AchievementsProfile.cs +++ b/WotBlitzStatisticsPro.Logic/Mappers/AchievementsProfile.cs @@ -54,6 +54,8 @@ namespace WotBlitzStatisticsPro.Logic.Mappers .ForMember(d => d.Id, o => o.Ignore()) .ForMember(d => d.AchievementValue, o => o.Ignore()) .ForMember(d => d.MaxSeriesValue, s => s.Ignore()) + .ForMember(d => d.MedalType, + o => o.MapFrom(s => s.Type)) ; } } diff --git a/WotBlitzStatisticsPro.Logic/WargamingAchievements.cs b/WotBlitzStatisticsPro.Logic/WargamingAchievements.cs index a92883b..5c7bd00 100644 --- a/WotBlitzStatisticsPro.Logic/WargamingAchievements.cs +++ b/WotBlitzStatisticsPro.Logic/WargamingAchievements.cs @@ -81,7 +81,7 @@ namespace WotBlitzStatisticsPro.Logic var response = new AccountAchievementsResponse { AccountId = accountId, - AchievementSections = sections + Sections = sections }; if (wgAchievements?.Achievements == null) @@ -138,9 +138,9 @@ namespace WotBlitzStatisticsPro.Logic } // Sort achievements by sections - foreach (var section in response.AchievementSections) + foreach (var section in response.Sections) { - section.Achievements = achievements.Where(a => a.SectionId == section.SectionId).ToList(); + section.Medals = achievements.Where(a => a.SectionId == section.SectionId).ToList(); } return response;