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); }
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); }
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); }
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); }
// 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(); }
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); }
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); }