Ejemplo n.º 1
0
        private async Task AddChampionSummonerSpellsStatistics(ChampionPageDto championPageDto)
        {
            var championSummonerSpells = new ChampionSummonerSpells
            {
                ChampionId            = championPageDto.Key,
                WinRate               = championPageDto.SummonerSpellsWinRate,
                TotalMatches          = championPageDto.SummonerSpellsTotalMatches,
                SummonerSpellPriority = string.Join(", ", championPageDto.SummonerSpells),
            };

            await this.championSummonerSpellsRepository.AddAsync(championSummonerSpells);

            await this.championSummonerSpellsRepository.SaveChangesAsync();

            var championSummonerSpellsId = this.championSummonerSpellsRepository
                                           .AllAsNoTracking()
                                           .FirstOrDefault(x => x.ChampionId == championPageDto.Key &&
                                                           x.WinRate == championPageDto.SummonerSpellsWinRate &&
                                                           x.TotalMatches == championPageDto.SummonerSpellsTotalMatches).Id;

            var dbChampionSummonerSpells = this.championSummonerSpellsRepository.All().FirstOrDefault(x => x.Id == championSummonerSpellsId);

            foreach (var spellDto in championPageDto.SummonerSpells)
            {
                var summonerSpellId = this.summonerSpellsRepository
                                      .AllAsNoTracking()
                                      .FirstOrDefault(s => s.Name == spellDto).Id;

                var spellToAdd = await this.summonerSpellsRepository.GetByIdWithDeletedAsync(summonerSpellId);

                dbChampionSummonerSpells.SummonerSpells.Add(spellToAdd);

                var championSummonerSpellsSummonerSpell = new ChampionSummonerSpellsSummonerSpell
                {
                    ChampionSummonerSpellsId = championSummonerSpellsId,
                    SummonerSpellId          = summonerSpellId,
                };

                await this.championSummonerSpellsSummonerSpellRepository.AddAsync(championSummonerSpellsSummonerSpell);
            }

            this.championSummonerSpellsRepository.Update(dbChampionSummonerSpells);

            await this.championSummonerSpellsSummonerSpellRepository.SaveChangesAsync();

            this.championsRepository.GetByIdWithDeletedAsync(championPageDto.Key).Result.BestSummonerSpells.Add(championSummonerSpells);
        }
Ejemplo n.º 2
0
        private async Task AddChampionAbilitiesStatistics(ChampionPageDto championPageDto)
        {
            var championAbilities = new ChampionAbilities
            {
                ChampionId    = championPageDto.Key,
                WinRate       = championPageDto.SkillsWinRate,
                TotalMatches  = championPageDto.SkillsMatchesCount,
                SkillPriority = string.Join(", ", championPageDto.SkillsPriority),
            };

            await this.championAbilitiesRepository.AddAsync(championAbilities);

            await this.championAbilitiesRepository.SaveChangesAsync();

            var championAbilitiesId = this.championAbilitiesRepository
                                      .AllAsNoTracking()
                                      .FirstOrDefault(x => x.ChampionId == championPageDto.Key &&
                                                      x.TotalMatches == championPageDto.SkillsMatchesCount && x.WinRate == championPageDto.SkillsWinRate).Id;

            var dbChampionAbilities = this.championAbilitiesRepository.All().FirstOrDefault(x => x.Id == championAbilitiesId);

            foreach (var abilityTypeDto in championPageDto.SkillsPriority)
            {
                var abilityId = this.baseChampionAbilitiesRepository
                                .AllAsNoTracking()
                                .FirstOrDefault(a => a.Id == championPageDto.Key + abilityTypeDto).Id;

                var spellToAdd = await this.baseChampionAbilitiesRepository.GetByIdWithDeletedAsync(abilityId);

                dbChampionAbilities.Abilities.Add(spellToAdd);

                var championAbilitiesAbility = new ChampionAbilitiesAbility
                {
                    BaseAbilityId       = abilityId,
                    ChampionAbilitiesId = championAbilitiesId,
                };

                await this.championAbilitiesAbilitiesRepository.AddAsync(championAbilitiesAbility);
            }

            this.championAbilitiesRepository.Update(dbChampionAbilities);

            await this.championAbilitiesAbilitiesRepository.SaveChangesAsync();

            this.championsRepository.GetByIdWithDeletedAsync(championPageDto.Key).Result.BestAbilities.Add(championAbilities);
        }
Ejemplo n.º 3
0
        private async Task AddChampionStarterItemsStatistics(ChampionPageDto championPageDto)
        {
            var championStarterItems = new ChampionStarterItems
            {
                ChampionId   = championPageDto.Key,
                WinRate      = championPageDto.StartingItemsWinRate,
                PickRate     = championPageDto.StartingItemsPickRate,
                ItemPriority = string.Join(", ", championPageDto.StartingItems.Where(x => x != string.Empty)),
            };

            await this.championStarterItemsRepository.AddAsync(championStarterItems);

            await this.championStarterItemsRepository.SaveChangesAsync();

            var championStarterItemsId = this.championStarterItemsRepository
                                         .AllAsNoTracking()
                                         .FirstOrDefault(x => x.ChampionId == championPageDto.Key &&
                                                         x.PickRate == championPageDto.StartingItemsPickRate && x.WinRate == championPageDto.StartingItemsWinRate).Id;

            var dbChampionItems = this.championStarterItemsRepository.All().FirstOrDefault(x => x.Id == championStarterItemsId);

            foreach (var itemDto in championPageDto.StartingItems.Where(i => i != string.Empty))
            {
                var itemId = this.itemsRepository
                             .AllAsNoTracking()
                             .FirstOrDefault(x => x.Name.Contains(itemDto)).Id;

                var itemToAdd = await this.itemsRepository.GetByIdWithDeletedAsync(itemId);

                dbChampionItems.Items.Add(itemToAdd);

                var championStarterItemsItem = new ChampionStarterItemsItem
                {
                    ItemId = itemId,
                    ChampionStarterItemsId = championStarterItemsId,
                };

                await this.championStarterItemsItemRepository.AddAsync(championStarterItemsItem);
            }

            this.championStarterItemsRepository.Update(dbChampionItems);

            await this.championStarterItemsItemRepository.SaveChangesAsync();

            this.championsRepository.GetByIdWithDeletedAsync(championPageDto.Key).Result.BestStartingItems.Add(championStarterItems);
        }
Ejemplo n.º 4
0
        private async Task AddChampionRoleStatistics(ChampionPageDto championPageDto)
        {
            var championRole = new ChampionRole
            {
                ChampionId   = championPageDto.Key,
                Role         = championPageDto.Role,
                WinRate      = championPageDto.ChampionWinRate,
                PickRate     = championPageDto.ChampionPickRate,
                BanRate      = championPageDto.ChampionBanRate,
                TotalMatches = championPageDto.ChampionTotalMatches,
                Tier         = championPageDto.ChampionTier,
            };

            await this.championRolesRepository.AddAsync(championRole);

            await this.championRolesRepository.SaveChangesAsync();

            this.championsRepository.GetByIdWithDeletedAsync(championPageDto.Key).Result.ChampionRoles.Add(championRole);
        }
Ejemplo n.º 5
0
        // Statistics
        private async Task AddCounterChampionsStatistics(ChampionPageDto championPageDto)
        {
            foreach (var champion in championPageDto.CounterChampions)
            {
                var counterChampion = this.championsRepository
                                      .AllAsNoTracking()
                                      .FirstOrDefault(c => c.Name.Contains(champion));

                var championCounter = new ChampionCounter
                {
                    ChampionId          = championPageDto.Key,
                    CounterChampionName = counterChampion.Name,
                    CounterChapmionKey  = counterChampion.Id,
                    ImageUrl            = counterChampion.ImageUrl,
                };

                await this.championCountersRepository.AddAsync(championCounter);

                this.championsRepository.GetByIdWithDeletedAsync(championPageDto.Key).Result.ChampionCounters.Add(championCounter);
            }

            await this.championCountersRepository.SaveChangesAsync();
        }
Ejemplo n.º 6
0
        private ChampionPageDto GetChampionStatistics(string championName)
        {
            var uggDocument = this.context
                              .OpenAsync($"https://u.gg/lol/champions/{championName}/build")
                              .GetAwaiter()
                              .GetResult();

            if (uggDocument.StatusCode == System.Net.HttpStatusCode.NotFound || uggDocument.DocumentElement.TextContent.Contains("THIS PAGEDOESN'T EXIST"))
            {
                throw new InvalidOperationException();
            }

            var championPageDto = new ChampionPageDto();

            championPageDto.Key = championName;

            // U.GG Scraping
            // Lane
            var championHeaderElement = uggDocument.QuerySelector(SelectorConstants.ChampionHeader);

            string lanePattern = "(?<=for )[A-Za-z]+(?=,)";

            string lane = Regex.Match(championHeaderElement.TextContent, lanePattern).ToString();

            championPageDto.Role = (RoleType)Enum.Parse(typeof(RoleType), lane);

            // Tier
            championPageDto.ChampionTier = championHeaderElement.TextContent[0].ToString(); // TODO: Make work with S+ tier

            // Patch
            string patchPattern = "[0-9]+.[0-9]+";

            championPageDto.Patch = Regex.Match(championHeaderElement.TextContent, patchPattern).ToString();

            // WinRate
            var championRankingStatsElement = uggDocument.QuerySelector(SelectorConstants.ChampionRankingStatsSection);

            string winRatePattern = "[0-9.]+(?=%Win)";

            championPageDto.ChampionWinRate = double.TryParse(Regex.Match(championRankingStatsElement.TextContent, winRatePattern).ToString(), out double resultWinRate)
                ? double.Parse(Regex.Match(championRankingStatsElement.TextContent, winRatePattern).ToString()) : 0;

            // PickRate
            string pickRatePattern = "[0-9.]+(?=%Pick)";

            championPageDto.ChampionPickRate = double.TryParse(Regex.Match(championRankingStatsElement.TextContent, pickRatePattern).ToString(), out double resultPickRate)
                ? double.Parse(Regex.Match(championRankingStatsElement.TextContent, pickRatePattern).ToString()) : 0;

            // BanRate
            string banRatePattern = "[0-9.]+(?=%Ban)";

            championPageDto.ChampionBanRate = double.TryParse(Regex.Match(championRankingStatsElement.TextContent, banRatePattern).ToString(), out double resultBanRate)
                ? double.Parse(Regex.Match(championRankingStatsElement.TextContent, banRatePattern).ToString()) : 0;

            // MatchesCount
            string matchesCountPattern = "[0-9,]+(?=Matches)";

            championPageDto.ChampionTotalMatches = int.Parse(Regex.Match(championRankingStatsElement.TextContent, matchesCountPattern).ToString().Replace(",", string.Empty));

            // SummonerSpells
            var summonerSpellsElement = uggDocument.QuerySelector(SelectorConstants.SummonerSpellsSection);

            string summonerSpellsPattern = "(?<=Summoner Spell )[A-Za-z]+";

            var summonerSpells = Regex.Matches(summonerSpellsElement.InnerHtml, summonerSpellsPattern).ToArray();

            string summonerSpellD = summonerSpells[0].ToString();
            string summonerSpellF = summonerSpells[1].ToString();

            championPageDto.SummonerSpells.Add(summonerSpellD);
            championPageDto.SummonerSpells.Add(summonerSpellF);

            // SummonerSpellsWinRate
            string summonersWinRatePattern = "[0-9.]+(?=% WR)";

            championPageDto.SummonerSpellsWinRate = double.Parse(Regex.Match(summonerSpellsElement.TextContent, summonersWinRatePattern).ToString());

            // SummonerSpellsTotalMatches
            string summonersTotalMatchesPattern = "[0-9,]+(?= Matches)";

            championPageDto.SummonerSpellsTotalMatches = int.Parse(Regex.Match(summonerSpellsElement.TextContent, summonersTotalMatchesPattern).ToString().Replace(",", string.Empty));

            // RuneTrees
            var runesElement = uggDocument.QuerySelector(SelectorConstants.RunesSection);

            string mainRuneTreePattern = "(?<=The Rune Tree )[A-Z][a-z]+";

            var runeTrees = Regex.Matches(runesElement.InnerHtml, mainRuneTreePattern).ToArray();

            string mainRuneTree      = runeTrees[0].ToString();
            string secondaryRuneTree = runeTrees[1].ToString();

            championPageDto.MainRuneTree      = (RuneTreeType)Enum.Parse(typeof(RuneTreeType), mainRuneTree);
            championPageDto.SecondaryRuneTree = (RuneTreeType)Enum.Parse(typeof(RuneTreeType), secondaryRuneTree);

            // RunesWinRate
            string runeWinRatePattern = "(?<=Build)[0-9.]+";

            championPageDto.RunesWinRate = double.Parse(Regex.Match(runesElement.TextContent, runeWinRatePattern).ToString());

            // RunesMatchesCount
            string runeMatchesCountPattern = "[0-9,]+(?= Matches)";

            championPageDto.RunesMatchesCount = int.Parse(Regex.Matches(runesElement.TextContent, runeMatchesCountPattern)[0].ToString().Replace(",", string.Empty));

            // PrimaryRuneTreeRunes
            var primaryRuneTreeElements = uggDocument.QuerySelector(SelectorConstants.PrimaryRuneTreeSection).Children.ToList();

            primaryRuneTreeElements.RemoveAt(0);  // removes unnecesary div element

            string runeNamePattern = "(?<=The Rune |The Keystone )[A-Za-z :]+";

            foreach (var primaryRuneTreeElement in primaryRuneTreeElements)
            {
                foreach (var runeRowElement in primaryRuneTreeElement.Children)
                {
                    foreach (var activeRuneElement in runeRowElement.Children.Where(x => x.ClassName == "perk perk-active" || x.ClassName == "perk keystone perk-active"))
                    {
                        string runeName = Regex.Match(activeRuneElement.InnerHtml, runeNamePattern).ToString();
                        championPageDto.PrimaryRunes.Add(runeName);
                    }
                }
            }

            // SecondaryRuneTreeRunes
            var secondaryRuneTreeElements = uggDocument.QuerySelector(SelectorConstants.SecondaryRuneTreeSection).Children.ToList();

            secondaryRuneTreeElements.RemoveAt(0); // removes unnecesary div element

            foreach (var secondaryRuneTreeElement in secondaryRuneTreeElements)
            {
                foreach (var runeRowElement in secondaryRuneTreeElement.Children)
                {
                    foreach (var activeRuneElement in runeRowElement.Children.Where(x => x.ClassName == "perk perk-active"))
                    {
                        string runeName = Regex.Match(activeRuneElement.InnerHtml, runeNamePattern).ToString();
                        championPageDto.SecondaryRunes.Add(runeName);
                    }
                }
            }

            // StatRunes
            var statRunes = new List <string>();

            var    statRuneTreeElements = uggDocument.QuerySelector(SelectorConstants.StatsRuneSection).Children.ToList();
            string statRuneNamePatter   = "(?<=alt=\")[A-Za-z ]+";

            foreach (var statRuneElement in statRuneTreeElements)
            {
                foreach (var runeRowElement in statRuneElement.Children)
                {
                    foreach (var activeRuneElement in runeRowElement.Children.Where(x => x.ClassName == "shard shard-active"))
                    {
                        string[] statRuneValues = { "Adaptive", "Attack", "Armor", "Magic", "Health", "CDR" };

                        string runeDescription = Regex.Match(activeRuneElement.InnerHtml, statRuneNamePatter).ToString();

                        string[] descriptionWords = runeDescription.Split(" ");

                        for (int i = 0; i < statRuneValues.Length; i++)
                        {
                            string value = statRuneValues[i];

                            if (descriptionWords.Contains(value))
                            {
                                championPageDto.StatRunes.Add((StatRuneType)i);
                            }
                        }
                    }
                }
            }

            // SkillPriority
            var skills = new List <string>();

            var skillsSectionElement = uggDocument.QuerySelector(SelectorConstants.SkillsSection);

            string skillsPattern = "[A-Z]{1}(?=:)";

            var skillElements = Regex.Matches(skillsSectionElement.InnerHtml, skillsPattern).ToArray();

            foreach (var skill in skillElements)
            {
                championPageDto.SkillsPriority.Add(skill.ToString());
            }

            // SkillsWinRate
            string skillsWinRatioPattern = "[0-9.]+(?=%)";

            championPageDto.SkillsWinRate = double.Parse(Regex.Match(skillsSectionElement.InnerHtml, skillsWinRatioPattern).ToString());

            // SkillsMatchesCount
            string skillsMatchesCountPattern = "[0-9,]+(?= Matches)";

            championPageDto.SkillsMatchesCount = int.Parse(Regex.Match(skillsSectionElement.InnerHtml, skillsMatchesCountPattern).ToString().Replace(",", string.Empty));

            // CounterChampions
            List <string> counterChampions = new List <string>();

            var counterChampionsSectionElement = uggDocument.QuerySelector(SelectorConstants.CounterChampionsSection);

            string bestCounterChampionPattern = "[A-Za-z &.]+(?=[0-9])";

            string bestCounterChampion = Regex.Match(counterChampionsSectionElement.TextContent, bestCounterChampionPattern).ToString();

            counterChampions.Add(bestCounterChampion);

            string counterChampionsPattern = "(?<=Matches)[A-Za-z &.]+(?=[0-9])";

            var counterChampionElements = Regex.Matches(counterChampionsSectionElement.TextContent, counterChampionsPattern).ToArray();

            foreach (var counterChamp in counterChampionElements)
            {
                championPageDto.CounterChampions.Add(counterChamp.ToString());
            }

            // Meta.src Scraping
            // StartingItems
            var metaSrcDocument = this.context
                                  .OpenAsync($"https://www.metasrc.com/5v5/kr/champion/{championName}/{lane}")
                                  .GetAwaiter()
                                  .GetResult();

            // Invalid Champion Page
            if (metaSrcDocument.DocumentElement.TextContent.Contains("May the METAcat guide you!"))
            {
                throw new InvalidOperationException();
            }

            var startingItemElements = metaSrcDocument.QuerySelector(SelectorConstants.StartingItemsDiv).Children;

            string startingItemPattern = "(?<=alt=\")[A-Za-z ']+(?=\"><)";

            foreach (var itemElement in startingItemElements)
            {
                string item = Regex.Match(itemElement.InnerHtml, startingItemPattern).ToString();
                championPageDto.StartingItems.Add(item);
            }

            // StartingItemsWin&PickRate
            var startingItemsSectionElement = metaSrcDocument.QuerySelector(SelectorConstants.StartingItemsSection);

            string startingItemsRatesPattern = @"(?<=<span>)[0-9]+(?=%</span>)";

            var startingItemRates = Regex.Matches(startingItemsSectionElement.InnerHtml, startingItemsRatesPattern).ToArray();

            championPageDto.StartingItemsWinRate  = int.Parse(startingItemRates[0].ToString());
            championPageDto.StartingItemsPickRate = int.Parse(startingItemRates[1].ToString());

            // MainItems
            var mainItemsSectionElements = metaSrcDocument.QuerySelector(SelectorConstants.MainItemsSection).Children;

            string mainItemPattern        = "[A-Za-z ']+(?=[0-9]+ [0-9]+)";
            string mainItemWinRatePattern = @"(?<=>)[0-9]+(?=%<\/div>)";

            foreach (var itemElement in mainItemsSectionElements)
            {
                string item    = Regex.Match(itemElement.TextContent, mainItemPattern).ToString();
                string winRate = Regex.Match(itemElement.InnerHtml, mainItemWinRatePattern).ToString();

                championPageDto.ItemsWinRateKvp[item] = int.Parse(winRate);
            }

            return(championPageDto);
        }
Ejemplo n.º 7
0
        private async Task AddChampionRunesStatistics(ChampionPageDto championPageDto)
        {
            var championRunes = new ChampionRunes
            {
                ChampionId        = championPageDto.Key,
                WinRate           = championPageDto.RunesWinRate,
                TotalMatches      = championPageDto.RunesMatchesCount,
                MainRuneTree      = championPageDto.MainRuneTree,
                SecondaryRuneTree = championPageDto.SecondaryRuneTree,
            };

            await this.championRunesRepository.AddAsync(championRunes);

            await this.championRunesRepository.SaveChangesAsync();

            var primaryRunesAsArray   = championPageDto.PrimaryRunes.ToArray();
            var secondaryRunesAsArray = championPageDto.SecondaryRunes.ToArray();

            var runeDtos = new string[primaryRunesAsArray.Length + secondaryRunesAsArray.Length];

            primaryRunesAsArray.CopyTo(runeDtos, 0);
            secondaryRunesAsArray.CopyTo(runeDtos, primaryRunesAsArray.Length);

            var championRunesId = this.championRunesRepository
                                  .AllAsNoTracking()
                                  .FirstOrDefault(x => x.ChampionId == championPageDto.Key &&
                                                  x.WinRate == championPageDto.RunesWinRate &&
                                                  x.TotalMatches == championPageDto.RunesMatchesCount).Id;

            var dbChampionRunes = this.championRunesRepository.All().FirstOrDefault(x => x.Id == championRunesId);

            foreach (var runeDto in runeDtos)
            {
                var runeId = this.runesRepository
                             .AllAsNoTracking()
                             .FirstOrDefault(r => r.Name.Contains(runeDto)).Id;

                var runeToAdd = await this.runesRepository.GetByIdWithDeletedAsync(runeId);

                dbChampionRunes.Runes.Add(runeToAdd);

                var championRunesRune = new ChampionRunesRune
                {
                    ChampionRunesId = championRunesId,
                    RuneId          = runeId,
                };

                await this.championRunesRuneRepository.AddAsync(championRunesRune);
            }

            await this.championRunesRuneRepository.SaveChangesAsync();

            var statRunesAsArray = championPageDto.StatRunes.ToArray();

            for (int j = 0; j < statRunesAsArray.Length; j++)
            {
                var statRuneDto = statRunesAsArray[j];

                var statRuneId = this.statRunesRepository
                                 .AllAsNoTracking()
                                 .FirstOrDefault(r => r.Row.Type == (StatRuneTreeType)j && r.RuneType == statRuneDto).Id;

                var statRuneToAdd = await this.statRunesRepository.GetByIdWithDeletedAsync(statRuneId);

                dbChampionRunes.StatRunes.Add(statRuneToAdd);

                var championRunesStatRune = new ChampionRunesStatRune
                {
                    ChampionRunesId = championRunesId,
                    StatRuneId      = statRuneId,
                };

                await this.championRunesStatRuneRepository.AddAsync(championRunesStatRune);
            }

            this.championRunesRepository.Update(dbChampionRunes);

            await this.championRunesStatRuneRepository.SaveChangesAsync();

            this.championsRepository.GetByIdWithDeletedAsync(championPageDto.Key).Result.BestRunes.Add(championRunes);
        }