Exemple #1
0
        /// <summary>
        /// Syncs a srl race with it's persistent euivalent
        /// </summary>
        /// <param name="context">The database context</param>
        /// <param name="srlRace">The srl race</param>
        /// <returns>Returns the persisted race</returns>
        private static Race?SyncRace(
            DatabaseContext context
            , SRLRace srlRace
            )
        {
            Logger.Info($"({srlRace.Id}) Synchronizing...");

            Game g = SyncGame(context, srlRace);

            if (srlRace.State == SRLApiClient.Endpoints.RaceState.Over &&
                context.GetRace(srlRace.Id) == null)
            {
                Logger.Info($"({srlRace.Id}) Race over and not persisted, continuing.");
                return(null);
            }

            Race?race = srlRace.Convert(g);

            race = context.AddOrUpdate(race);

            if (race != null)
            {
                race.ConsecutiveUpdateFailures = 0;
                SyncEntrants(context, srlRace, race);
            }

            return(race);
        }
Exemple #2
0
        /// <summary>
        /// Updates the existing or adss a new game entity based on the
        /// <paramref name="srlRace"/>
        /// </summary>
        /// <param name="context">The database context</param>
        /// <param name="srlRace">The SRL race</param>
        /// <returns>The updated game entity</returns>
        private static Game SyncGame(
            DatabaseContext context
            , SRLRace srlRace)
        {
            Game game = srlRace.Game.Convert();

            return(context.AddOrUpdate(game));
        }
 public static RaceAnnouncer.Schema.Models.Race Convert(
     this SRLApiClient.Endpoints.Races.Race race
     , RaceAnnouncer.Schema.Models.Game game)
 => new Schema.Models.Race(
     game
     , race.Goal
     , race.Id.ToLower()
     , race.Time
     , true
     , race.State);
Exemple #4
0
        /// <summary>
        /// Updates existing, adds new and deletes removed entrants  from
        /// the <paramref name="race"/> entity
        /// </summary>
        /// <param name="context">The database context</param>
        /// <param name="srlRace">The SRL race</param>
        /// <param name="race">The race entity</param>
        private static void SyncEntrants
            (DatabaseContext context
            , SRLRace srlRace
            , Race race)
        {
            foreach (SRLApiClient.Endpoints.Races.Entrant entrant in srlRace.Entrants)
            {
                context.AddOrUpdate(entrant.Convert(race));
            }

            UpdateRemovedEntrants(context, srlRace, race);
            race.EntrantCount = srlRace.Entrants.Count;
        }
Exemple #5
0
        /// <summary>
        /// Remove entrants from the <paramref name="race"/> entity which are
        /// no longer in the <paramref name="srlRace"/>.
        /// </summary>
        /// <param name="context">The database context</param>
        /// <param name="srlRace">The SRL race</param>
        /// <param name="race">The race entity</param>
        private static void UpdateRemovedEntrants(
            DatabaseContext context
            , SRLRace srlRace
            , Race race)
        {
            IEnumerable <Entrant> registeredEntrants = context.GetEntrants(race);

            foreach (Entrant e in registeredEntrants
                     .Where(e => !srlRace.Entrants
                            .Any(s => s.Name.Equals(e.DisplayName))))
            {
                context.DeleteEntrant(e);
            }
        }
Exemple #6
0
        /// <summary>
        /// Attempts to fetch and update race details of race entities
        /// which are no longer in the SRL race list.
        /// </summary>
        /// <param name="context">The database context</param>
        /// <param name="srlService">The srl service</param>
        /// <param name="updatedRaces">The list of updated races</param>
        public static async Task UpdateDroppedRacesAsync(
            DatabaseContext context
            , SRLService srlService
            , List <Race> updatedRaces)
        {
            List <Race> remainingActiveRaces = context
                                               .Races
                                               .Local
                                               .Where(r => r.IsActive && !updatedRaces.Any(ur => ur.SrlId.Equals(r.SrlId, StringComparison.CurrentCultureIgnoreCase)))
                                               .ToList();

            foreach (Race race in remainingActiveRaces)
            {
                try
                {
                    Logger.Info($"({race.Id}) Dropped, Fetching race...");

                    SRLRace srlRace
                        = await srlService.GetRaceAsync(race.SrlId).ConfigureAwait(false);

                    Logger.Info($"({race.Id}) Race fetched, Synchronizing...");

                    SyncRace(context, srlRace);
                }
                catch (Exception ex)
                {
                    Logger.Error($"({race.SrlId}) Exception thrown", ex);

                    race.ConsecutiveUpdateFailures++;

                    if (race.ConsecutiveUpdateFailures > 10)
                    {
                        Logger.Info($"({race.SrlId}) Deactivating race...");

                        race.IsActive = false;
                        if (race.State < SRLApiClient.Endpoints.RaceState.Finished)
                        {
                            race.State = SRLApiClient.Endpoints.RaceState.Unknown;
                        }
                    }
                }
            }
        }