static void WriteQueriesForAthlete(StravaXApi stravaXApi, StravaXApiContext db, string AthleteId) { DateTime Now = DateTime.Now; lastStravaHttpRequest = DateTime.Now; int ToYear = Now.Year; int ToMonth = Now.Month; // // Verify if queries have to be generated // // Retrieve all entered queries or the wanted athlete. List <ActivityRangeQuery> queriesForAthlete = db.ActivityQueriesDB.Where(a => a.AthleteId == AthleteId).OrderBy(a => a.DateFrom).ToList(); int FromYear; int FromMonth; // If we already have an entry, we assume that the entry contains the first activity date, as it is expensive to retrieve its value with Selenium. if (queriesForAthlete.Count == 0) { // Retrieve the first activity date with selenium. // may throw PrivateAthleteException. // be sure of a one seconde intervall between to requests int dt = DateTime.Now.Millisecond - lastStravaHttpRequest.Millisecond; if (dt < 2000) { System.Threading.Tasks.Task.Delay(dt).Wait(); } DateTime FirstActivityDate = stravaXApi.getActivityRange(AthleteId); lastStravaHttpRequest = DateTime.Now; System.Console.WriteLine($"First activity at {FirstActivityDate.Year}/{FirstActivityDate.Month}"); FromYear = FirstActivityDate.Year; FromMonth = FirstActivityDate.Month; } else { // retrieve first and last date DateTime minDT = queriesForAthlete.First().DateFrom; // DateTime maxDT = queriesForPatient.Last().DateFrom; FromYear = minDT.Year; FromMonth = minDT.Month; } Console.WriteLine($"queries enterred:{queriesForAthlete.Count}/total:{db.ActivityQueriesDB.Count()}"); if (FromYear == ToYear) { for (int month = FromMonth; month <= ToMonth; month++) { AddQuery(db, AthleteId, new DateTime(FromYear, month, 1), new DateTime(FromYear, month, 1).AddMonths(1).AddDays(-1), queriesForAthlete); } } else { // first year for (int month = FromMonth; month <= 12; month++) { AddQuery(db, AthleteId, new DateTime(FromYear, month, 1), new DateTime(FromYear, month, 1).AddMonths(1).AddDays(-1), queriesForAthlete); } // all years after for (int year = FromYear + 1; year <= ToYear - 1; year++) { for (int month = 01; month <= 12; month++) { AddQuery(db, AthleteId, new DateTime(year, month, 1), new DateTime(year, month, 1).AddMonths(1).AddDays(-1), queriesForAthlete); } } // last year for (int month = 01; month <= ToMonth; month++) { // from first day of month to last day of the month AddQuery(db, AthleteId, new DateTime(ToYear, month, 1), new DateTime(ToYear, month, 1).AddMonths(1).AddDays(-1), queriesForAthlete); } } int qCount = db.ActivityQueriesDB.Where(a => a.AthleteId == AthleteId).Count(); Console.WriteLine($"✅ enterred:{qCount}/total:{db.ActivityQueriesDB.Count()}"); }
static internal int ReadActivitiesForAthlete(StravaXApi stravaXApi, string[] args) { int ret = -1; Console.WriteLine("Read athlete activities with Strava-X-API."); String AthleteId = null; var p = new OptionSet() { { "a|athleteid=", v => { AthleteId = v; } }, }; p.Parse(args); if (AthleteId == null) { p.WriteOptionDescriptions(Console.Out); throw new ArgumentException("missing athlete id"); } try { stravaXApi.signIn(); List <ActivityShort> ActivitiesList = new List <ActivityShort>(); DateTime FirstActivityDate = stravaXApi.getActivityRange(AthleteId); System.Console.WriteLine($"First activity at {FirstActivityDate.Year}/{FirstActivityDate.Month}"); int FromYear = int.Parse(Environment.GetEnvironmentVariable("FROM_YEAR")); int FromMonth = int.Parse(Environment.GetEnvironmentVariable("FROM_MONTH")); int ToYear = int.Parse(Environment.GetEnvironmentVariable("TO_YEAR")); int ToMonth = int.Parse(Environment.GetEnvironmentVariable("TO_MONTH")); DateTime now = DateTime.Now; for (int year = FromYear; year <= ToYear; year++) { for (int month = 01; month <= 12; month++) { if ((year <= FromYear && month < FromMonth) || (year >= ToYear && month > ToMonth)) { continue; } List <ActivityShort> ActivitiesMonthList; try { ActivitiesMonthList = stravaXApi.getActivities(AthleteId, $"{year:D4}", $"{month:D2}"); } catch (StaleElementReferenceException) { // Wait and try again. Thread.Sleep(2000); ActivitiesMonthList = stravaXApi.getActivities(AthleteId, $"{year:D4}", $"{month:D2}"); } ActivitiesList.AddRange(ActivitiesMonthList); using (StravaXApiContext db = new StravaXApiContext()) { foreach (ActivityShort ActivityShort in ActivitiesList) { Console.WriteLine($"JSON={ActivityShort.SerializePrettyPrint(ActivityShort)}"); if (db.ActivityShortDB.Find(ActivityShort.ActivityId) == null) { db.ActivityShortDB.Add(ActivityShort); db.SaveChanges(); Console.WriteLine($"Enterred Activities: {db.ActivityShortDB.OrderBy(b => b.ActivityId).Count()}"); } else { Console.WriteLine($"{ActivityShort.ActivityId} allready in database"); } } Console.WriteLine($"total read = {ActivitiesList.Count}"); Console.WriteLine($"total stored = {db.ActivityShortDB.OrderBy(b => b.ActivityId).Count()}"); ActivitiesList.Clear(); } } } ret = 0; } catch (Exception e) { Console.WriteLine($"ERROR:{e.ToString()}"); ret = 1; } finally { stravaXApi.Dispose(); } return(ret); }