public override void ExamineFlight(ExaminerFlightRow cfr) { if (cfr == null) { throw new ArgumentNullException(nameof(cfr)); } DateTime dtFlight = cfr.dtFlight.Date; if (AutoDateRange) { StartDate = StartDate.EarlierDate(dtFlight); EndDate = EndDate.LaterDate(dtFlight); } // ignore anything not in a real aircraft or outside of our date range if (!cfr.fIsRealAircraft || dtFlight.CompareTo(StartDate) < 0 || dtFlight.CompareTo(EndDate) > 0) { return; } miFlightCount.AddEvent(1); string szDateKey = dtFlight.YMDString(); // Initialize the current streak, if needed if (FirstDayOfCurrentStreak == null || LastDayOfCurrentStreak == null) { FirstDayOfCurrentStreak = LastDayOfCurrentStreak = dtFlight; } // Extend the current streak if this flight is either on the first date or on a day before the first date; if it isn't one of those, then end the current streak if (dtFlight.CompareTo(FirstDayOfCurrentStreak.Value.Date) == 0 || dtFlight.CompareTo(FirstDayOfCurrentStreak.Value.AddDays(-1).Date) == 0) { FirstDayOfCurrentStreak = dtFlight; } else { FirstDayOfCurrentStreak = LastDayOfCurrentStreak = dtFlight; } int cDaysCurrentStreak = CurrentFlyingDayStreak; if (cDaysCurrentStreak > 1 && cDaysCurrentStreak > FlyingDayStreak) { FirstFlyingDayOfStreak = FirstDayOfCurrentStreak; LastFlyingDayOfStreak = LastDayOfCurrentStreak; } // Distinct flights on dates if (FlightDates.ContainsKey(szDateKey)) { FlightDates[szDateKey] = FlightDates[szDateKey] + 1; } else { FlightDates[szDateKey] = 1; } if (FlightDates[szDateKey] > MaxFlightsPerDay) { int cFlights = FlightDates[szDateKey]; MaxFlightsPerDay = cFlights; miMostFlightsInDay.Progress = cFlights; miMostFlightsInDay.MatchingEventText = String.Format(CultureInfo.CurrentCulture, Resources.Achievements.RecentAchievementMostFlightsInDay, cFlights, cfr.dtFlight); miMostFlightsInDay.Query = new FlightQuery(Username) { DateRange = FlightQuery.DateRanges.Custom, DateMin = cfr.dtFlight, DateMax = cfr.dtFlight }; } if (FlightLandings.ContainsKey(szDateKey)) { FlightLandings[szDateKey] = FlightLandings[szDateKey] + cfr.cLandingsThisFlight; } else { FlightLandings[szDateKey] = cfr.cLandingsThisFlight; } if (FlightLandings[szDateKey] > MaxLandingsPerDay) { int cLandings = FlightLandings[szDateKey]; MaxLandingsPerDay = cLandings; miMostLandingsInDay.Progress = cLandings; miMostLandingsInDay.MatchingEventText = String.Format(CultureInfo.CurrentCulture, Resources.Achievements.RecentAchievementMostLandingsInDay, cLandings, cfr.dtFlight); miMostLandingsInDay.Query = new FlightQuery(Username) { DateRange = FlightQuery.DateRanges.Custom, DateMin = cfr.dtFlight, DateMax = cfr.dtFlight }; } // Longest flight if (cfr.Total > LongestFlightLength) { LongestFlightLength = cfr.Total; miLongestFlight.Progress = 1; miLongestFlight.MatchingEventID = cfr.flightID; miLongestFlight.MatchingEventText = String.Format(CultureInfo.CurrentCulture, Resources.Achievements.RecentAchievementsLongestFlight, cfr.Total, dtFlight); } // Distinct aircraft/models DistinctAircraft.Add(cfr.idAircraft); DistinctModels.Add(cfr.idModel); DistinctICAO.Add(cfr.szFamily); // Furthest Flight & airport computations. AirportList al = AirportListOfRoutes.CloneSubset(cfr.Route, true); double distance = al.DistanceForRoute(); if (distance > FurthestFlightDistance) { FurthestFlightDistance = distance; miFurthestFlight.Progress = 1; miFurthestFlight.MatchingEventID = cfr.flightID; miFurthestFlight.MatchingEventText = String.Format(CultureInfo.CurrentCulture, Resources.Achievements.RecentAchievementsFurthestFlight, distance, dtFlight); } int cUniqueAirports = 0; HashSet <string> hsThisFlight = new HashSet <string>(); foreach (airport ap in al.UniqueAirports) { // Dedupe as we go based on latitude/longitude, ignoring non-ports. // We don't actually need the facility name here - so we can just round off the latitude/longitude and distinguish by type code. // Note: this can differ slightly from Visited Airports counts because for achievements, we're ignoring flights in training devices; visited airports doesn't ignore them. if (ap.IsPort) { string szHash = ap.GeoHashKey; if (!Airports.Contains(szHash)) { Airports.Add(ap.GeoHashKey); cUniqueAirports++; } hsThisFlight.Add(szHash); } } int cAirportsThisFlight = hsThisFlight.Count; if (cAirportsThisFlight > MostAirportsFlightCount) { MostAirportsFlightCount = cAirportsThisFlight; miMostAirportsFlight.MatchingEventID = cfr.flightID; miMostAirportsFlight.Progress = 1; miMostAirportsFlight.MatchingEventText = String.Format(CultureInfo.CurrentCulture, Resources.Achievements.RecentAchievementsAirportsOnFlight, cAirportsThisFlight, dtFlight.ToShortDateString()); miMostAirportsFlight.Query = new FlightQuery(Username) { DateRange = FlightQuery.DateRanges.Custom, DateMax = dtFlight, DateMin = dtFlight }; } }
public override void ExamineFlight(ExaminerFlightRow cfr) { if (cfr == null) { throw new ArgumentNullException(nameof(cfr)); } DateTime dtFlight = cfr.dtFlight.Date; if (AutoDateRange) { StartDate = StartDate.EarlierDate(dtFlight); EndDate = EndDate.LaterDate(dtFlight); } // ignore anything not in a real aircraft or outside of our date range if (!cfr.fIsRealAircraft || dtFlight.CompareTo(StartDate) < 0 || dtFlight.CompareTo(EndDate) > 0) { return; } miFlightCount.AddEvent(1); string szDateKey = dtFlight.YMDString(); // Initialize the current streak, if needed if (FirstDayOfCurrentStreak == null || LastDayOfCurrentStreak == null) { FirstDayOfCurrentStreak = LastDayOfCurrentStreak = dtFlight; } // Extend the current streak if this flight is either on the first date or on a day before the first date; if it isn't one of those, then end the current streak FirstDayOfCurrentStreak = dtFlight.CompareTo(FirstDayOfCurrentStreak.Value.Date) == 0 || dtFlight.CompareTo(FirstDayOfCurrentStreak.Value.AddDays(-1).Date) == 0 ? (DateTime?)dtFlight : (LastDayOfCurrentStreak = dtFlight); int cDaysCurrentStreak = CurrentFlyingDayStreak; if (cDaysCurrentStreak > 1 && cDaysCurrentStreak > FlyingDayStreak) { FirstFlyingDayOfStreak = FirstDayOfCurrentStreak; LastFlyingDayOfStreak = LastDayOfCurrentStreak; } // Distinct flights on dates FlightDates[szDateKey] = FlightDates.ContainsKey(szDateKey) ? FlightDates[szDateKey] + 1 : 1; if (FlightDates[szDateKey] > MaxFlightsPerDay) { int cFlights = FlightDates[szDateKey]; MaxFlightsPerDay = cFlights; miMostFlightsInDay.Progress = cFlights; miMostFlightsInDay.MatchingEventText = String.Format(CultureInfo.CurrentCulture, Resources.Achievements.RecentAchievementMostFlightsInDay, cFlights, cfr.dtFlight); miMostFlightsInDay.Query = new FlightQuery(Username) { DateRange = FlightQuery.DateRanges.Custom, DateMin = cfr.dtFlight, DateMax = cfr.dtFlight }; } FlightLandings[szDateKey] = FlightLandings.ContainsKey(szDateKey) ? FlightLandings[szDateKey] + cfr.cLandingsThisFlight : cfr.cLandingsThisFlight; if (FlightLandings[szDateKey] > MaxLandingsPerDay) { int cLandings = FlightLandings[szDateKey]; MaxLandingsPerDay = cLandings; miMostLandingsInDay.Progress = cLandings; miMostLandingsInDay.MatchingEventText = String.Format(CultureInfo.CurrentCulture, Resources.Achievements.RecentAchievementMostLandingsInDay, cLandings, cfr.dtFlight); miMostLandingsInDay.Query = new FlightQuery(Username) { DateRange = FlightQuery.DateRanges.Custom, DateMin = cfr.dtFlight, DateMax = cfr.dtFlight }; } // Longest flight if (cfr.Total > LongestFlightLength) { LongestFlightLength = cfr.Total; miLongestFlight.Progress = 1; miLongestFlight.MatchingEventID = cfr.flightID; miLongestFlight.MatchingEventText = String.Format(CultureInfo.CurrentCulture, Resources.Achievements.RecentAchievementsLongestFlight, cfr.Total, dtFlight); } // Distinct aircraft/models DistinctAircraft.Add(cfr.idAircraft); DistinctModels.Add(cfr.idModel); DistinctICAO.Add(cfr.szFamily); // Furthest Flight & airport computations. AirportList al = AirportListOfRoutes.CloneSubset(cfr.Route, true); double distance = al.DistanceForRoute(); if (distance > FurthestFlightDistance) { FurthestFlightDistance = distance; miFurthestFlight.Progress = 1; miFurthestFlight.MatchingEventID = cfr.flightID; miFurthestFlight.MatchingEventText = String.Format(CultureInfo.CurrentCulture, Resources.Achievements.RecentAchievementsFurthestFlight, distance, dtFlight); } int cAirportsThisFlight = MatchAirports(al.UniqueAirports); if (cAirportsThisFlight > MostAirportsFlightCount) { MostAirportsFlightCount = cAirportsThisFlight; miMostAirportsFlight.MatchingEventID = cfr.flightID; miMostAirportsFlight.Progress = 1; miMostAirportsFlight.MatchingEventText = String.Format(CultureInfo.CurrentCulture, Resources.Achievements.RecentAchievementsAirportsOnFlight, cAirportsThisFlight, dtFlight.ToShortDateString()); miMostAirportsFlight.Query = new FlightQuery(Username) { DateRange = FlightQuery.DateRanges.Custom, DateMax = dtFlight, DateMin = dtFlight }; } fs100.ExamineFlight(cfr); fs1000.ExamineFlight(cfr); }