public async Task <IRanksMap> GetRanksMapAsync(int year, Gender gender, AgeGroup ageGroup, CancellationToken cancellationToken) { string key = CreateKey(year, gender, ageGroup); if (rankMaps.TryGetValue(key, out IRanksMap value)) { return(value); } IRanksMap newRankMap = await RanksMap.CreateAsync(year, gender, ageGroup, cancellationToken); rankMaps.Add(key, newRankMap); return(newRankMap); }
public async Task <List <Player> > GetPlayersAsync(string tournamentId, int categoryId, string categoryName, CancellationToken cancellationToken) { List <HtmlNode> htmlPlayers = await GetTournamentPlayersNodes(categoryId, tournamentId, cancellationToken); IRanksMap ranks = null; IRanksMap previousYearRanks = null; if (htmlPlayers.Any()) { Gender gender = GetGender(categoryName); AgeGroup ageGroup = GetAgeGroup(categoryName); ranks = await this.rankDb.GetRanksMapAsync(DateTime.UtcNow.Year, gender, ageGroup, cancellationToken); previousYearRanks = await this.rankDb.GetRanksMapAsync(2018, gender, ageGroup, cancellationToken); } List <Player> players = new List <Player>(); for (int i = 0; i < htmlPlayers.Count; i++) { HtmlNode playerRowNode = htmlPlayers[i]; HtmlNode playerNameNode = playerRowNode.Descendants("a").FirstOrDefault(); if (playerNameNode == null) { continue; } string name = HttpUtility.HtmlDecode(playerNameNode.InnerText); string playerId = playerNameNode.Attributes["href"].Value.Split('(')[1].Split(')')[0]; int associationIndex = i % 2 == 0 ? 2 : 1; var columnDes = playerRowNode.Descendants("td").ToList(); string association = HttpUtility.HtmlDecode(columnDes[associationIndex].InnerText); int age = int.Parse(HttpUtility.HtmlDecode(columnDes[associationIndex + 1].InnerText)); double rank = ranks.GetRank(name, association, age); double previousYearRank = previousYearRanks.GetRank(name, association, age); Player player = new Player(name, playerId, rank, previousYearRank, association, age); players.Add(player); } return(players); }