private static void AppendMatchStatistics(MongoDb db)
        {
            var seasons = db.GetSeasons().ToList();
            //var roundUid = GetLastCompletedRoundUid(seasons);
            var roundUid = new RoundUid()
            {
                Year = StartingYear, Number = 0
            };

            Console.WriteLine("Appending from " + roundUid.Year + ", " + roundUid.Number);

            //add any new matches between last match and now
            var api = new FootyWireApi();

            foreach (var round in seasons.SelectMany(s => s.Rounds))
            {
                if (round.Year >= 2010)
                {
                    if (round.Matches.Where(m => m.HomeStats is null || m.AwayStats is null || m.HomeStats.Clearances == 0 || m.AwayStats.Clearances == 0).Count() > 0)
                    {
                        api.AppendMatchStatisticstoResults(round);
                    }
                }
                else
                {
                    if (round.Matches.Where(m => m.HomeStats.Kicks == 0 || m.AwayStats.Kicks == 0).Count() > 0)
                    {
                        api.AppendMatchStatisticstoResults(round);
                    }
                }
            }
            seasons.RemoveAll(s => s.Rounds.Count == 0);
            //update db
            db.UpdateSeasons(seasons);
        }
        //TODO: Might be less page hits to update by match (once we have their starting data)

        /*private static void UpdatePlayers(MongoDb db, int updateFromYear)
         * {
         *  Console.WriteLine("Beginning UpdatePlayers");
         *  var year = DateTime.Now.Year;
         *
         *  //What have I got?
         *  List<Player> players = db.ReadPlayerDocument() ?? new List<Player>();
         *  var api = new FinalSirenApi();
         *
         *  //Get histry for each player
         *  for (var i = year; i >= updateFromYear; i--)
         *  {
         *      var newplayers = api.GetPlayers(i);
         *
         *      foreach (var n in newplayers.Where(n => players.All(p => p.FinalSirenPlayerId != n.FinalSirenPlayerId)))
         *      {
         *          players.Add(n);
         *      }
         *
         *      foreach (var p in players)
         *      {
         *          if (p.History.Count == 0)
         *              p.History = api.GetPlayerMatchHistory(p.FinalSirenPlayerId);
         *      }
         *  }
         *
         *  //update db
         *  db.UpdatePlayerDocument(players.Select(p => p.Bsonify()).ToList());
         * }*/


        private static RoundUid GetLastCompletedRoundUid(List <Season> seasons)
        {
            //What have I got?
            seasons = seasons.OrderBy(s => s.Year).ToList();

            var lastCompletedRound =
                seasons.SelectMany(s => s.Rounds)
                .Where(
                    r => r.Matches.All(m => m.HomeScore().Total() > Tolerance ||
                                       m.AwayScore().Total() > Tolerance) &&
                    r.Matches.Count > 0)
                .OrderByDescending(r => r.Matches[0].Date)
                .FirstOrDefault();

            var roundUid = new RoundUid();

            roundUid.Year    = lastCompletedRound == null ? StartingYear : lastCompletedRound.Year;
            roundUid.Number  = lastCompletedRound == null ? 0 : lastCompletedRound.Number;
            roundUid.IsFinal = lastCompletedRound == null ? false : lastCompletedRound.IsFinal;
            return(roundUid);
        }
Exemple #3
0
        public List <Season> UpdateFrom(List <Season> seasons, RoundUid roundUid)
        {
            if (seasons.Count == 1)
            {
                seasons = new List <Season>();
            }
            var number = roundUid.Number;
            var year   = roundUid.Year;

            if (roundUid.IsFinal)
            {
                number = numHomeandAwayRounds[year];
            }

            var successful = true;

            while (successful)
            {
                try
                {
                    if (seasons.All(s => s.Year != year))
                    {
                        seasons.Add(new Season(year, new List <Round>()));
                    }

                    var numRounds = GetNumRounds(year);

                    if (numRounds == 0)
                    {
                        successful = false;
                    }
                    for (var i = number; i <= numRounds; i++)
                    {
                        var round = GetRoundResultsHomeAndAway(year, i);
                        if (seasons.First(s => s.Year == year).Rounds.Count >= i)
                        {
                            seasons.First(s => s.Year == year).Rounds[i - 1] = round;
                        }
                        else
                        {
                            seasons.First(s => s.Year == year).Rounds.Add(round);
                        }
                    }

                    var finals      = GetRoundResultsFinals(year);
                    var finalNumber = 0;
                    foreach (var r in finals)
                    {
                        finalNumber++;
                        if (seasons.First(s => s.Year == year).Rounds.Count >= (numRounds + finalNumber))
                        {
                            seasons.First(s => s.Year == year).Rounds[(numRounds + finalNumber) - 1] = r;
                        }
                        else
                        {
                            seasons.First(s => s.Year == year).Rounds.Add(r);
                        }
                    }
                }
                catch (Exception e)
                {
                    Console.WriteLine(e.Message);
                    Console.WriteLine(e.StackTrace);
                    successful = false;
                }
                if (successful)
                {
                    //We're still getting fresh data so loop into next season:
                    year++;
                    number = 1;
                    seasons.Add(new Season(year, new List <Round>()));
                }
            }
            return(seasons);
        }