Esempio n. 1
0
        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);
        }
Esempio n. 2
0
        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);
        }