private static List <RankingSnapshot> ScrapeRankingForTeam(int teamId, List <WeekEntry> weeks) { Console.WriteLine($"Scraping for team {teamId}"); List <RankingSnapshot> rankings = new List <RankingSnapshot>(); foreach (var week in weeks) { var rankingSnapshot = new RankingSnapshot(); rankingSnapshot.Week = week; Console.WriteLine($"Scraping week {week}"); var html = "http://sb.tournamentsoftware.com/ranking/category.aspx" .AddQueryParam("id", week.Id) .AddQueryParam("category", 2338) .AddQueryParam("C2338FOG", teamId) .GetStringFromUrl(); var doc = new HtmlDocument(); doc.LoadHtml(html); var rows = doc.QuerySelectorAll("tr"); for (int i = 2; i < rows.Count; ++i) { var row = rows[i].ChildNodes.Select(cn => cn.InnerText).ToList(); if (row.Count < 11) { continue; // first, 2nd alnd last has different row.Count... } var playerLink = rows[i].ChildNodes[4].ChildNodes[0].GetAttributeValue("href", string.Empty); var playerIdStartPos = playerLink.LastIndexOf("player="); var ranking = new PlayerRanking() { Id = int.Parse(playerLink.Substring(playerIdStartPos + 7 + 1)), // TODO int.Parse(System.Web.HttpUtility.ParseQueryString(rows[i].ChildNodes[4].ChildNodes[0].GetAttributeValue("href")).Get("player")), FullName = row[4], Points = int.Parse(row[6]), InterclubPoints = int.Parse(row[7]), TotalPoints = int.Parse(row[9]), Level = row[11], TournamentCount = int.Parse(row[10]) }; rankingSnapshot.PlayerRankings.Add(ranking); } rankings.Add(rankingSnapshot); } return(rankings); }
private async Task <Guid?> Persist(IEnumerable <RankingEntry> result) { RankingSnapshot newest = await _repository.GetNewestAsync(); if (!result.Any()) { return(null); } if (newest != null && newest.RankingEntries.OrderByDescending(r => r.Score).SequenceEqual(result.OrderByDescending(r => r.Score), new RankingEntryComparer())) { return(null); } RankingSnapshot snapshot = await _repository.AddAsync(rankingSnapshot => { rankingSnapshot.RankingEntries = result; rankingSnapshot.Timestamp = DateTimeOffset.UtcNow; }); return(snapshot.Id); }
public async Task ExecuteAsync(NewRankingSnapshotEvent @event) { RankingSnapshot rankingSnapshot = await _repository.GetAsync(@event.Id); List <RankingEntry> ordered = rankingSnapshot.RankingEntries.OrderByDescending(entry => entry.Score).ToList(); for (var i = 0; i < ordered.Count; i++) { RankingEntry entry = ordered[i]; // This could be batched if we assume that every user is in the ranking. IEnumerable <Profile> profiles = await _userManagementClient.ApiUserGetAsync(entry.UserId); Profile profile = profiles.Single(); entry.Rank = i + 1; entry.UserFirstName = profile.FirstName; entry.UserLastName = profile.LastName; entry.UserNickname = profile.Nickname; entry.UserGravatarHash = GravatarHashCreator.HashEmailForGravatar(profile.Email); } await _repository.UpdateAsync(@event.Id, snapshot => snapshot.RankingEntries = rankingSnapshot.RankingEntries); }