Пример #1
0
        private Func <Task <CacheResult <StoredGuild> > > GetFromSource(string guildName, int profileId, StoredRealm realm)
        {
            return(async() =>
            {
                var json = await this.blizzardService.GetGuildAsync(
                    guildName,
                    realm.Name,
                    BlizzardUtilities.GetBlizzardRegionFromEfRegion((EfEnums.GameRegionEnum)realm.Region.Id));

                if (BlizzardService.DidGetFail(json))
                {
                    return null;
                }

                var guild = ExternalServices.Blizzard.JsonParsing.GuildParsing.GetGuild(json);

                return new CacheResult <StoredGuild>()
                {
                    Found = true,
                    Result = new StoredGuild()
                    {
                        Name = guild.Name,
                        ProfileId = profileId,
                        RealmId = realm.Id
                    }
                };
            });
        }
        private async Task SendStatsCompleteNotifications(IServiceProvider serviceProvider, string key, BlizzardRegion region, string realm, string guild)
        {
            using (var serviceScope = serviceProvider.CreateScope())
            {
                var repo = serviceScope.ServiceProvider.GetService <IDataRepository>();

                var notifications = await repo.GetAndClearNotifications(NotificationRequestTypeEnum.RaiderIoStatsRequestComplete, key);

                string url = $"raideriostats/{region.ToString()}/{BlizzardService.FormatGuildName(guild)}/{BlizzardService.FormatRealmName(realm)}";

                List <Task> mailTasks = new List <Task>();

                var generatedEmail = this.mailGenerator.GenerateStatsCompleteEmail(url);

                foreach (var notification in notifications)
                {
                    mailTasks.Add(this.mailSender.SendMailAsync(
                                      notification.Email,
                                      this.commonValues.AdminEmail,
                                      generatedEmail.Subject,
                                      generatedEmail.TextContent,
                                      generatedEmail.HtmlContent));
                }

                await Task.WhenAll(mailTasks);
            }
        }
Пример #3
0
        public async Task TestRealmsGetter()
        {
            const string         connectionString = "Data Source=(LocalDb)\\MSSQLLocalDB;Initial Catalog=GuildTools;Integrated Security=True";
            KeyedResourceManager manager          = new KeyedResourceManager();

            BlizzardApiSecrets blizzardSecrets = new BlizzardApiSecrets()
            {
                ClientId     = this.config.GetValue <string>("BlizzardApiSecrets:ClientId"),
                ClientSecret = this.config.GetValue <string>("BlizzardApiSecrets:ClientSecret")
            };

            HttpClient        client      = new HttpClient();
            IMemoryCache      memoryCache = new MemoryCache(new MemoryCacheOptions());
            GuildToolsContext context     = new GuildToolsContext(SqlServerDbContextOptionsExtensions.UseSqlServer(new DbContextOptionsBuilder(), connectionString).Options as DbContextOptions);
            IDatabaseCache    dbCache     = new DatabaseCache(context) as IDatabaseCache;

            IDataRepository  repo            = new DataRepository(context);
            IBlizzardService blizzardService = new BlizzardService(repo, this.config, client);

            RealmsCache cache = new RealmsCache(blizzardService, memoryCache, dbCache, manager);

            DateTime initial = DateTime.Now;

            var realms = await cache.GetRealms(EF.Models.Enums.GameRegionEnum.US);

            DateTime second       = DateTime.Now;
            TimeSpan sinceInitial = second - initial;

            var realms2 = await cache.GetRealms(EF.Models.Enums.GameRegionEnum.US);

            DateTime third       = DateTime.Now;
            TimeSpan sinceSecond = third - second;

            int x = 42;
        }
Пример #4
0
        public async Task <FriendGuild> AddFriendGuild([FromBody] AddFriendGuild input)
        {
            InputValidators.ValidateGuildName(input.GuildName);
            InputValidators.ValidateRealmName(input.RealmName);

            input.GuildName = BlizzardService.FormatGuildName(input.GuildName);
            input.RealmName = BlizzardService.FormatRealmName(input.RealmName);
            var regionEnum = GameRegionUtilities.GetGameRegionFromString(input.RegionName);

            var user = await this.userManager.GetUserAsync(HttpContext.User);

            if (!(await this.UserCanAddRemoveFriendGuilds(input.ProfileId, user)))
            {
                throw new UserReportableError($"This user does not have permission to add friend guilds for profile '{input.ProfileId}'.",
                                              (int)HttpStatusCode.Unauthorized);
            }

            var storedRealm = await this.realmStoreByValues.GetRealmAsync(input.RealmName, regionEnum);

            if (storedRealm == null)
            {
                throw new UserReportableError($"Could not locate realm '{input.RealmName}'.", (int)HttpStatusCode.BadRequest);
            }

            var storedGuild = await this.guildStore.GetGuildAsync(input.GuildName, storedRealm, input.ProfileId);

            if (storedGuild == null)
            {
                throw new UserReportableError($"Could not locate guild '{input.GuildName}'.", (int)HttpStatusCode.BadRequest);
            }

            var efFriendGuild = await this.dataRepo.AddFriendGuild(input.ProfileId, storedGuild);

            return(this.mapper.Map <FriendGuild>(efFriendGuild));
        }
Пример #5
0
        private string GetKey(string realm, string guild)
        {
            realm = BlizzardService.FormatRealmName(realm);
            guild = BlizzardService.FormatRealmName(guild);

            return($"{realm}:{guild}");
        }
Пример #6
0
        public async Task <int> CreateGuildProfile([FromBody] CreateNewGuildProfile input)
        {
            InputValidators.ValidateProfileName(input.ProfileName);
            InputValidators.ValidateGuildName(input.GuildName);
            InputValidators.ValidateRealmName(input.GuildRealmName);

            input.GuildName      = BlizzardService.FormatGuildName(input.GuildName);
            input.GuildRealmName = BlizzardService.FormatRealmName(input.GuildRealmName);
            var regionEnum = GameRegionUtilities.GetGameRegionFromString(input.RegionName);

            var user = await this.userManager.GetUserAsync(HttpContext.User);

            if (user == null && !input.IsPublic)
            {
                throw new UserReportableError("Must be authenticated to create a private profile.", (int)HttpStatusCode.Unauthorized);
            }

            var locatedRealm = await this.realmStoreByValues.GetRealmAsync(input.GuildRealmName, regionEnum);

            if (locatedRealm == null)
            {
                throw new UserReportableError($"Couldn't locate realm '{input.GuildRealmName}'.", 404);
            }

            var locatedGuild = await this.guildCache.GetGuild(regionEnum, input.GuildName, input.GuildRealmName);

            if (locatedGuild == null)
            {
                throw new UserReportableError("Could not locate this guild.", 404);
            }

            return(await this.dataRepo.CreateGuildProfileAsync(user?.Id, input.ProfileName, locatedGuild, locatedRealm, regionEnum, input.IsPublic));
        }
Пример #7
0
        public async Task <GuildFound> GuildExists(string region, string guild, string realm)
        {
            InputValidators.ValidateGuildName(guild);
            InputValidators.ValidateRealmName(realm);

            guild = BlizzardService.FormatGuildName(guild);
            realm = BlizzardService.FormatRealmName(realm);
            var regionEnum = GameRegionUtilities.GetGameRegionFromString(region);

            var locatedGuild = await this.guildCache.GetGuild(regionEnum, guild, realm);

            if (locatedGuild == null)
            {
                return(new GuildFound()
                {
                    Found = false
                });
            }

            return(new GuildFound()
            {
                Found = true,
                RealmName = locatedGuild.Realm,
                GuildName = locatedGuild.Name
            });
        }
Пример #8
0
        public async Task <RaiderIoStatsResponse> GetRaiderIoStats(string region, string guild, string realm)
        {
            guild = BlizzardService.FormatGuildName(guild);
            realm = BlizzardService.FormatRealmName(realm);
            BlizzardRegion regionEnum = BlizzardService.GetRegionFromString(region);

            return(await this.GetRaiderIoResponse(regionEnum, realm, guild));
        }
Пример #9
0
        public async Task <string> GetMythicPlusDungeonData(BlizzardRegion region, string playerName, string realm)
        {
            string url = $"https://raider.io/api/v1/characters/profile?region={region.ToString().ToLower()}&"
                         + $"realm={BlizzardService.FormatRealmName(realm)}&name={playerName}&fields=mythic_plus_scores";

            var result = await this.throttler.Throttle(async() => { return(await client.GetAsync(url)); });

            return(await result.Content.ReadAsStringAsync());
        }
Пример #10
0
 private Func <Task <StoredRealm> > GetFromDatabase(string name, EfEnums.GameRegionEnum region)
 {
     return(async() =>
     {
         return await this.context.StoredRealms
         .Include(r => r.Region)
         .SingleOrDefaultAsync(x => x.Slug == BlizzardService.BuildRealmSlug(name) &&
                               x.RegionId == (int)region);
     });
 }
Пример #11
0
        public async Task <Realm> GetRealmAsync(string realmName, BlizzardRegion region)
        {
            var result = await this.blizzardService.GetRealmAsync(realmName, region);

            if (BlizzardService.DidGetFail(result))
            {
                return(null);
            }

            return(RealmParsing.GetSingleRealm(result));
        }
Пример #12
0
        public async Task PlayerStoreTest()
        {
            const string         connectionString = "Data Source=(LocalDb)\\MSSQLLocalDB;Initial Catalog=GuildTools;Integrated Security=True";
            KeyedResourceManager manager          = new KeyedResourceManager();

            BlizzardApiSecrets blizzardSecrets = new BlizzardApiSecrets()
            {
                ClientId     = this.config.GetValue <string>("BlizzardApiSecrets:ClientId"),
                ClientSecret = this.config.GetValue <string>("BlizzardApiSecrets:ClientSecret")
            };

            IMemoryCache      memoryCache = new MemoryCache(new MemoryCacheOptions());
            GuildToolsContext context     = new GuildToolsContext(SqlServerDbContextOptionsExtensions.UseSqlServer(new DbContextOptionsBuilder(), connectionString).Options as DbContextOptions);

            HttpClient              client          = new HttpClient();
            IDataRepository         repo            = new DataRepository(context);
            IBlizzardService        blizzardService = new BlizzardService(repo, this.config, client);
            PerRequestCallThrottler throttler       = new PerRequestCallThrottler(TimeSpan.FromSeconds(1));
            IGuildService           guildService    = new GuildService(blizzardService, throttler);

            int profileId = 1;

            GameRegion region = new GameRegion()
            {
                Id         = 1,
                RegionName = "US"
            };

            StoredRealm realm = context.StoredRealms.Include(a => a.Region).First();
            StoredGuild guild = context.StoredGuilds.First();

            PlayerStoreByValue playerStore = new PlayerStoreByValue(guildService, memoryCache, context, manager);

            DateTime initial = DateTime.Now;

            var realms = await playerStore.GetPlayerAsync("Kromp", realm, guild, profileId);

            DateTime second       = DateTime.Now;
            TimeSpan sinceInitial = second - initial;

            var realms2 = await playerStore.GetPlayerAsync("Kromp", realm, guild, profileId);

            DateTime third       = DateTime.Now;
            TimeSpan sinceSecond = third - second;

            var realms3 = await playerStore.GetPlayerAsync("Kromp", realm, guild, profileId);

            DateTime fourth     = DateTime.Now;
            TimeSpan sinceThird = fourth - third;

            int x = 42;
        }
Пример #13
0
        public async Task <GuildSlim> GetGuild(BlizzardRegion region, string realmName, string guildName)
        {
            guildName = BlizzardService.FormatGuildName(guildName);
            realmName = BlizzardService.FormatRealmName(realmName);

            var result = await this.blizzardService.GetGuildAsync(guildName, realmName, region);

            if (BlizzardService.DidGetFail(result))
            {
                return(null);
            }

            return(GuildParsing.GetGuild(result));
        }
Пример #14
0
        public async Task RequestStatsCompleteNotification([FromBody] RequestStatsCompleteNotification input)
        {
            input.Guild = BlizzardService.FormatGuildName(input.Guild);
            input.Realm = BlizzardService.FormatRealmName(input.Realm);
            BlizzardRegion regionEnum = BlizzardService.GetRegionFromString(input.Region);

            if (!RegexUtilities.IsValidEmail(input.Email))
            {
                throw new UserReportableError("Email is not in a valid format.", (int)HttpStatusCode.BadRequest);
            }

            var key = this.guildStatsRetriever.GetKey(regionEnum, input.Realm, input.Guild);

            await this.dataRepo.AddNotification(input.Email, key, (NotificationRequestTypeEnum)input.RequestType);
        }
Пример #15
0
        public async Task <IEnumerable <GuildMemberStats> > GetLargeGuildMembersDataAsync(BlizzardRegion region, string guild, string realm, IProgress <double> progress)
        {
            var guildDataJson = await this.blizzardService.GetGuildMembersAsync(guild, realm, region);

            var members = GuildMemberParsing.GetSlimPlayersFromGuildPlayerList(guildDataJson).ToList();

            foreach (var member in members)
            {
                member.RegionName = BlizzardService.GetRegionString(region);
                member.GuildName  = guild;
            }

            int totalCount = members.Count();

            int count = 0;

            var taskList = new List <Task <GuildMemberStats> >();

            foreach (var member in members)
            {
                taskList.Add(Task.Run(async() =>
                {
                    try
                    {
                        if (await this.PopulateMemberDataAsync(member, region))
                        {
                            return(member);
                        }

                        return(null);
                    }
                    catch (Exception e)
                    {
                        return(null);
                    }
                    finally
                    {
                        progress.Report((double)count++ / totalCount);
                    }
                }));
            }

            await Task.WhenAll(taskList);

            return(taskList.Select(x => x.Result).Where(x => x != null));
        }
Пример #16
0
        public async Task CachedStoredValueTest()
        {
            const string         connectionString = "Data Source=(LocalDb)\\MSSQLLocalDB;Initial Catalog=GuildTools;Integrated Security=True";
            KeyedResourceManager manager          = new KeyedResourceManager();

            BlizzardApiSecrets blizzardSecrets = new BlizzardApiSecrets()
            {
                ClientId     = this.config.GetValue <string>("BlizzardApiSecrets:ClientId"),
                ClientSecret = this.config.GetValue <string>("BlizzardApiSecrets:ClientSecret")
            };

            IMemoryCache      memoryCache = new MemoryCache(new MemoryCacheOptions());
            GuildToolsContext context     = new GuildToolsContext(SqlServerDbContextOptionsExtensions.UseSqlServer(new DbContextOptionsBuilder(), connectionString).Options as DbContextOptions);

            HttpClient              client          = new HttpClient();
            IDataRepository         repo            = new DataRepository(context);
            IBlizzardService        blizzardService = new BlizzardService(repo, this.config, client);
            PerRequestCallThrottler throttler       = new PerRequestCallThrottler(TimeSpan.FromSeconds(1));
            IGuildService           guildService    = new GuildService(blizzardService, throttler);

            RealmStoreByValues store = new RealmStoreByValues(guildService, memoryCache, context, manager);

            DateTime initial = DateTime.Now;

            var realms = await store.GetRealmAsync("Burning Blade", EF.Models.Enums.GameRegionEnum.US);

            DateTime second       = DateTime.Now;
            TimeSpan sinceInitial = second - initial;

            var realms2 = await store.GetRealmAsync("Burning Blade", EF.Models.Enums.GameRegionEnum.US);

            DateTime third       = DateTime.Now;
            TimeSpan sinceSecond = third - second;

            var realms3 = await store.GetRealmAsync("Akama", EF.Models.Enums.GameRegionEnum.US);

            DateTime fourth     = DateTime.Now;
            TimeSpan sinceThird = fourth - third;

            int x = 42;
        }
Пример #17
0
        public async Task <BlizzardPlayer> GetSinglePlayerAsync(BlizzardRegion region, string realmName, string playerName)
        {
            var playerJson = await this.blizzardService.GetPlayerAsync(playerName, realmName, region);

            if (BlizzardService.DidGetFail(playerJson))
            {
                return(null);
            }

            var player = PlayerParsing.GetSinglePlayerFromJson(playerJson);

            return(new BlizzardPlayer()
            {
                PlayerName = player.Name,
                Class = player.Class,
                Level = player.Level,
                GuildName = player.GuildName,
                GuildRealm = player.GuildRealm,
                PlayerRealmName = player.Realm
            });
        }
Пример #18
0
        public static PlayerItemDetails GetItemsDetailsFromJson(string json)
        {
            PlayerItemDetails itemDetails = new PlayerItemDetails();

            var jObject = JsonConvert.DeserializeObject(json) as JObject;

            var items = jObject.SelectToken("items");

            var lastModified = jObject.SelectToken("lastModified").ToString();

            itemDetails.LastModifiedDateTime = BlizzardService.FromUnixTime(long.Parse(lastModified));
            itemDetails.EquippedIlvl         = int.Parse(items["averageItemLevelEquipped"].ToString());
            itemDetails.MaximumIlvl          = int.Parse(items["averageItemLevel"].ToString());

            var neckNode = items.SelectToken("neck");

            if (neckNode["name"].ToString() == "Heart of Azeroth")
            {
                itemDetails.AzeriteLevel = int.Parse(neckNode.SelectToken("azeriteItem.azeriteLevel").ToString());
            }

            return(itemDetails);
        }
Пример #19
0
        public async Task <PlayerFound> PlayerExists(string region, string playerName, string realm)
        {
            InputValidators.ValidateRealmName(realm);
            InputValidators.ValidatePlayerName(playerName);

            realm = BlizzardService.FormatRealmName(realm);
            var regionEnum = GameRegionUtilities.GetGameRegionFromString(region);

            var locatedPlayer = await this.playerCache.GetPlayer(regionEnum, playerName, realm);

            if (locatedPlayer == null)
            {
                return(new PlayerFound()
                {
                    Found = false
                });
            }

            return(new PlayerFound()
            {
                Found = true,
                PlayerDetails = locatedPlayer
            });
        }
Пример #20
0
 private string GetKey(BlizzardRegion region, string realm, string guild)
 {
     return($"{BlizzardService.GetRegionString(region)}:{realm}:{guild}");
 }
Пример #21
0
 public static string GetRealmKey(string realmName)
 {
     return(BlizzardService.BuildRealmSlug(realmName));
 }