diff --git a/WotBlitzStatisticsPro.Logic/Dictionaries/AchievementsDictionaryUpdater.cs b/WotBlitzStatisticsPro.Logic/Dictionaries/AchievementsDictionaryUpdater.cs new file mode 100644 index 0000000..cea7109 --- /dev/null +++ b/WotBlitzStatisticsPro.Logic/Dictionaries/AchievementsDictionaryUpdater.cs @@ -0,0 +1,13 @@ +using System.Threading.Tasks; +using WotBlitzStatisticsPro.Common.Model; + +namespace WotBlitzStatisticsPro.Logic.Dictionaries +{ + public class AchievementsDictionaryUpdater : IDictionaryUpdater + { + public Task Update() + { + throw new System.NotImplementedException(); + } + } +} \ No newline at end of file diff --git a/WotBlitzStatisticsPro.Logic/Dictionaries/DictionariesUpdaterResolver.cs b/WotBlitzStatisticsPro.Logic/Dictionaries/DictionariesUpdaterResolver.cs new file mode 100644 index 0000000..70d3db1 --- /dev/null +++ b/WotBlitzStatisticsPro.Logic/Dictionaries/DictionariesUpdaterResolver.cs @@ -0,0 +1,12 @@ +using WotBlitzStatisticsPro.Common.Model; + +namespace WotBlitzStatisticsPro.Logic.Dictionaries +{ + /// + /// Dictionaries updater factory method. + /// + /// Dictionary type for resolving service. + /// Updater service. + public delegate IDictionaryUpdater DictionariesUpdaterResolver(DictionaryType dictionaryType); + +} \ No newline at end of file diff --git a/WotBlitzStatisticsPro.Logic/Dictionaries/IDictionaryUpdater.cs b/WotBlitzStatisticsPro.Logic/Dictionaries/IDictionaryUpdater.cs new file mode 100644 index 0000000..cb48e58 --- /dev/null +++ b/WotBlitzStatisticsPro.Logic/Dictionaries/IDictionaryUpdater.cs @@ -0,0 +1,10 @@ +using System.Threading.Tasks; +using WotBlitzStatisticsPro.Common.Model; + +namespace WotBlitzStatisticsPro.Logic.Dictionaries +{ + public interface IDictionaryUpdater + { + Task Update(); + } +} \ No newline at end of file diff --git a/WotBlitzStatisticsPro.Logic/Dictionaries/StaticDictionariesUpdater.cs b/WotBlitzStatisticsPro.Logic/Dictionaries/StaticDictionariesUpdater.cs new file mode 100644 index 0000000..983da5e --- /dev/null +++ b/WotBlitzStatisticsPro.Logic/Dictionaries/StaticDictionariesUpdater.cs @@ -0,0 +1,32 @@ +using System; +using System.Threading.Tasks; +using WotBlitzStatisticsPro.Common.Model; +using WotBlitzStatisticsPro.WgApiClient; + +namespace WotBlitzStatisticsPro.Logic.Dictionaries +{ + public class StaticDictionariesUpdater : IDictionaryUpdater + { + private readonly IWargamingDictionariesApiClient _wargamingDictionariesApiClient; + + public StaticDictionariesUpdater(IWargamingDictionariesApiClient wargamingDictionariesApiClient) + { + _wargamingDictionariesApiClient = wargamingDictionariesApiClient; + } + public async Task Update() + { + var defaultRealmType = RealmType.Eu; + foreach (var requestLanguage in (RequestLanguage[]) Enum.GetValues(typeof(RequestLanguage))) + { + var (WotEncyclopediaInfoResponse, WotClanMembersDictionaryResponse) = + await _wargamingDictionariesApiClient.GetStaticDictionariesAsync(defaultRealmType, requestLanguage); + // ToDo: map + // ToDo: add to dictionary + } + + // ToDo: Save dictionary to Mongo + + throw new System.NotImplementedException(); + } + } +} \ No newline at end of file diff --git a/WotBlitzStatisticsPro.Logic/Dictionaries/VehiclesDictionaryUpdater.cs b/WotBlitzStatisticsPro.Logic/Dictionaries/VehiclesDictionaryUpdater.cs new file mode 100644 index 0000000..dfef9d4 --- /dev/null +++ b/WotBlitzStatisticsPro.Logic/Dictionaries/VehiclesDictionaryUpdater.cs @@ -0,0 +1,13 @@ +using System.Threading.Tasks; +using WotBlitzStatisticsPro.Common.Model; + +namespace WotBlitzStatisticsPro.Logic.Dictionaries +{ + public class VehiclesDictionaryUpdater : IDictionaryUpdater + { + public Task Update() + { + throw new System.NotImplementedException(); + } + } +} \ No newline at end of file diff --git a/WotBlitzStatisticsPro.Logic/WargamingDictionaries.cs b/WotBlitzStatisticsPro.Logic/WargamingDictionaries.cs index 12bac50..940458b 100644 --- a/WotBlitzStatisticsPro.Logic/WargamingDictionaries.cs +++ b/WotBlitzStatisticsPro.Logic/WargamingDictionaries.cs @@ -1,29 +1,34 @@ -using System.Collections.Generic; +using System; +using System.Collections.Generic; using System.Threading.Tasks; using WotBlitzStatisticsPro.Common.Model; +using WotBlitzStatisticsPro.Logic.Dictionaries; namespace WotBlitzStatisticsPro.Logic { public class WargamingDictionaries: IWargamingDictionaries { - public Task UpdateDictionaries(UpdateDictionariesRequest updateDictionariesRequest) + private readonly DictionariesUpdaterResolver _dictionaryUpdaterFactoryMethod; + + public WargamingDictionaries(DictionariesUpdaterResolver dictionaryUpdaterFactoryMethod) + { + _dictionaryUpdaterFactoryMethod = dictionaryUpdaterFactoryMethod; + } + + public async Task UpdateDictionaries(UpdateDictionariesRequest updateDictionariesRequest) { var response = new List(); - // ToDo: Make factory - if ((updateDictionariesRequest.DictionaryTypes & DictionaryType.StaticDictionaries) != 0) + + foreach (var dictionaryType in (DictionaryType[])Enum.GetValues(typeof(DictionaryType))) { - // Update static - } - if ((updateDictionariesRequest.DictionaryTypes & DictionaryType.Achievements) != 0) - { - // Update achievements - } - if ((updateDictionariesRequest.DictionaryTypes & DictionaryType.Vehicles) != 0) - { - // Update vehicles + if ((updateDictionariesRequest.DictionaryTypes & dictionaryType) != 0) + { + var dictionaryUpdater = _dictionaryUpdaterFactoryMethod(dictionaryType); + response.Add(await dictionaryUpdater.Update()); + } } - return Task.FromResult(response.ToArray()); + return response.ToArray(); } } } \ No newline at end of file diff --git a/WotBlitzStatisticsPro.Logic/WotBlitzStatisticsLogicInstaller.cs b/WotBlitzStatisticsPro.Logic/WotBlitzStatisticsLogicInstaller.cs index 2d100c6..8e6c430 100644 --- a/WotBlitzStatisticsPro.Logic/WotBlitzStatisticsLogicInstaller.cs +++ b/WotBlitzStatisticsPro.Logic/WotBlitzStatisticsLogicInstaller.cs @@ -1,17 +1,47 @@ -using AutoMapper; +using System.Collections.Generic; +using AutoMapper; using Microsoft.Extensions.DependencyInjection; +using WotBlitzStatisticsPro.Common.Model; +using WotBlitzStatisticsPro.Logic.Dictionaries; using WotBlitzStatisticsPro.WgApiClient; namespace WotBlitzStatisticsPro.Logic { public static class WotBlitzStatisticsLogicInstaller { + + public static void ConfigureServices(IServiceCollection services) { + ConfigureDictionariesFactory(services); services.AddAutoMapper(typeof(WotBlitzStatisticsLogicInstaller)); services.AddHttpClient(); + services.AddHttpClient(); services.AddTransient(); services.AddTransient(); } + + private static void ConfigureDictionariesFactory(IServiceCollection services) + { + services.AddTransient(); + services.AddTransient(); + services.AddTransient(); + + services.AddTransient(serviceProvider => dictionaryType => + { + switch (dictionaryType) + { + case DictionaryType.StaticDictionaries: + return serviceProvider.GetService(); + case DictionaryType.Achievements: + return serviceProvider.GetService(); + case DictionaryType.Vehicles: + return serviceProvider.GetService(); + default: + throw new KeyNotFoundException( + $"Unable to find service for dictionary type '{dictionaryType}'"); + } + }); + } } } \ No newline at end of file diff --git a/WotBlitzStatisticsPro.WgApiClient/IWargamingDictionariesApiClient.cs b/WotBlitzStatisticsPro.WgApiClient/IWargamingDictionariesApiClient.cs new file mode 100644 index 0000000..17d47ee --- /dev/null +++ b/WotBlitzStatisticsPro.WgApiClient/IWargamingDictionariesApiClient.cs @@ -0,0 +1,15 @@ +using System.Threading.Tasks; +using WotBlitzStatisticsPro.Common.Model; +using WotBlitzStatisticsPro.WgApiClient.Model; + +namespace WotBlitzStatisticsPro.WgApiClient +{ + public interface IWargamingDictionariesApiClient + { + Task<( + WotEncyclopediaInfoResponse, + WotClanMembersDictionaryResponse)> GetStaticDictionariesAsync( + RealmType realmType = RealmType.Ru, + RequestLanguage language = RequestLanguage.En); + } +} \ No newline at end of file diff --git a/WotBlitzStatisticsPro.WgApiClient/Model/WotClanMembersDictionaryResponse.cs b/WotBlitzStatisticsPro.WgApiClient/Model/WotClanMembersDictionaryResponse.cs new file mode 100644 index 0000000..5d8cbaa --- /dev/null +++ b/WotBlitzStatisticsPro.WgApiClient/Model/WotClanMembersDictionaryResponse.cs @@ -0,0 +1,20 @@ +using System.Collections.Generic; +using Newtonsoft.Json; + +namespace WotBlitzStatisticsPro.WgApiClient.Model +{ + public class WotClanMembersDictionaryResponse + { + /// + /// Clan roles list + /// + [JsonProperty("clans_roles")] + public Dictionary ClanRoles { get; set; } + + /// + /// Clan settings list + /// + [JsonProperty("settings")] + public Dictionary Settings { get; set; } + } +} \ No newline at end of file diff --git a/WotBlitzStatisticsPro.WgApiClient/Model/WotEncyclopediaInfoResponse.cs b/WotBlitzStatisticsPro.WgApiClient/Model/WotEncyclopediaInfoResponse.cs new file mode 100644 index 0000000..39db1c9 --- /dev/null +++ b/WotBlitzStatisticsPro.WgApiClient/Model/WotEncyclopediaInfoResponse.cs @@ -0,0 +1,70 @@ +using System; +using System.Collections.Generic; +using Newtonsoft.Json; + +namespace WotBlitzStatisticsPro.WgApiClient.Model +{ + public class WotEncyclopediaInfoResponse + { + /// + /// Game client version + /// + [JsonProperty("game_version")] + public string GameVersion { get; set; } + + /// + /// List of supported languages + /// + [JsonProperty("languages")] + public Dictionary Languages { get; set; } + + /// + /// Encyclopedia last update time + /// + [JsonProperty("tanks_updated_at")] + public int? TanksUpdatedAt { get; set; } + + /// + /// Cru clan role + /// + [JsonProperty("vehicle_crew_roles")] + public Dictionary VehicleCrewRoles { get; set; } + + /// + /// Vehicle nations dictionary + /// + [JsonProperty("vehicle_nations")] + public Dictionary VehicleNations { get; set; } + + /// + /// Vehicle types dictionary + /// + [JsonProperty("vehicle_types")] + public Dictionary VehicleTypes { get; set; } + + /// + /// Achievements sections + /// + [JsonProperty("achievement_sections")] + public Dictionary AchievementSections { get; set; } + + } + + public class WotEncyclopediaInfoAchievementSection + { + + /// + /// Achievements section name + /// + [JsonProperty("name")] + public string Name { get; set; } + + /// + /// Achievement section order + /// + [JsonProperty("order")] + public long? Order { get; set; } + + } + +} \ No newline at end of file diff --git a/WotBlitzStatisticsPro.WgApiClient/WargamingApiClient.cs b/WotBlitzStatisticsPro.WgApiClient/WargamingApiClient.cs index 34dbcaa..7f6f38c 100644 --- a/WotBlitzStatisticsPro.WgApiClient/WargamingApiClient.cs +++ b/WotBlitzStatisticsPro.WgApiClient/WargamingApiClient.cs @@ -7,15 +7,18 @@ using WotBlitzStatisticsPro.WgApiClient.Model; namespace WotBlitzStatisticsPro.WgApiClient { - public class WargamingApiClient : WagramingApiClientBase, IWargamingApiClient - { + public class WargamingApiClient : WagramingApiClientBase, + IWargamingApiClient, + IWargamingDictionariesApiClient + { public WargamingApiClient( HttpClient httpClient, IWargamingApiSettings wargamingApiSettings) : base(httpClient, wargamingApiSettings) { } - public async Task> FindAccounts(string nickName, + #region Search methods + public async Task> FindAccounts(string nickName, RealmType realmType = RealmType.Ru, RequestLanguage language = RequestLanguage.En) { @@ -37,8 +40,40 @@ namespace WotBlitzStatisticsPro.WgApiClient $"search={searchString}").ConfigureAwait(false); } + #endregion - public async Task GetPlayerAccountInfo(long accountId, + #region Encyclopedia methods + + public async Task<( + WotEncyclopediaInfoResponse, + WotClanMembersDictionaryResponse)> GetStaticDictionariesAsync( + RealmType realmType = RealmType.Ru, + RequestLanguage language = RequestLanguage.En) + { + var encyclopedia = await GetFromBlitzApi( + realmType, + language, + "encyclopedia/info/" + ).ConfigureAwait(false); + + + var clanGlossaryResponse = await GetFromBlitzApi( + realmType, + language, + "clans/glossary/"); + + return (encyclopedia, clanGlossaryResponse); + } + + + #endregion + + + + + + + public async Task GetPlayerAccountInfo(long accountId, RealmType realmType = RealmType.Ru, RequestLanguage language = RequestLanguage.En) { @@ -83,7 +118,10 @@ namespace WotBlitzStatisticsPro.WgApiClient return null; } - // https://api.wotblitz.ru/wotb/encyclopedia/achievements/?application_id=adc1387489cf9fc8d9a1d85dbd27763d + // https://api.wotblitz.ru/wotb/encyclopedia/achievements/?application_id=adc1387489cf9fc8d9a1d85dbd27763d - } + + + + } }