Exemplo n.º 1
0
            public Task <int> BulkUpsertAsync <TEntity>(
                IEnumerable <TEntity> items,
                BulkUpsertOptions options,
                CancellationToken cancellationToken)
                where TEntity : class
            {
                BulkUpsertAsyncCallCount++;

                return(Task.FromResult(items.Count()));
            }
        public static async Task <IEnumerable <DailyLeaderboard> > GetDailyLeaderboardsAsync(ISteamClientApiClient steamClient)
        {
            var expectedDailyLeaderboards = new DailyLeaderboardsEnumerable(DateTime.UtcNow.Date);

            var missingDaily = expectedDailyLeaderboards.First(d => d.Date == new DateTime(2017, 10, 3, 0, 0, 0, DateTimeKind.Utc));

            // Add leaderboards found in local cache.
            // This does not perform updates since the local cache may contain bad data due to bugs from previous builds.
            var cachedDailyLeaderboards = JsonConvert.DeserializeObject <IEnumerable <DailyLeaderboard> >(Resources.DailyLeaderboards);
            var connectionString        = ConfigurationManager.ConnectionStrings[nameof(LeaderboardsContext)].ConnectionString;

            using (var storeClient = new LeaderboardsStoreClient(connectionString))
            {
                var options = new BulkUpsertOptions {
                    UpdateWhenMatched = false
                };
                await storeClient.BulkUpsertAsync(cachedDailyLeaderboards, options, default).ConfigureAwait(false);
            }

            using (var db = new LeaderboardsContext())
            {
                // Exclude existing daily leaderboards
                var dailyLeaderboards        = db.DailyLeaderboards.ToList();
                var missingDailyLeaderboards = expectedDailyLeaderboards.Except(dailyLeaderboards, new DailyLeaderboardEqualityComparer()).ToList();

                if (missingDailyLeaderboards.Any())
                {
                    // Get the leaderboard IDs for the missing leaderboards
                    await UpdateDailyLeaderboardsAsync(steamClient, missingDailyLeaderboards).ConfigureAwait(false);

                    // Store the new leaderboards
                    foreach (var dailyLeaderboard in missingDailyLeaderboards)
                    {
                        if (dailyLeaderboard.LeaderboardId == 0)
                        {
                            continue;
                        }

                        db.DailyLeaderboards.Add(dailyLeaderboard);
                    }

                    db.SaveChanges();
                }

                return((from l in db.DailyLeaderboards
                        orderby l.Date, l.ProductId, l.IsProduction
                        select l)
                       .ToList());
            }
        }
Exemplo n.º 3
0
        public async Task StoreDailyLeaderboardsAsync(
            IEnumerable <DailyLeaderboard> leaderboards,
            CancellationToken cancellationToken)
        {
            using (var operation = telemetryClient.StartOperation <RequestTelemetry>("Store daily leaderboards"))
            {
                try
                {
                    using (var activity = new StoreActivity(Log, "daily leaderboards"))
                    {
                        var rowsAffected = await storeClient.BulkUpsertAsync(leaderboards, cancellationToken).ConfigureAwait(false);

                        activity.Report(rowsAffected);
                    }

                    using (var activity = new StoreActivity(Log, "players"))
                    {
                        var players = leaderboards
                                      .SelectMany(l => l.Entries)
                                      .Select(e => e.SteamId)
                                      .Distinct()
                                      .Select(s => new Player {
                            SteamId = s
                        });

                        var options = new BulkUpsertOptions {
                            UpdateWhenMatched = false
                        };
                        var rowsAffected = await storeClient.BulkUpsertAsync(players, options, cancellationToken).ConfigureAwait(false);

                        activity.Report(rowsAffected);
                    }

                    using (var activity = new StoreActivity(Log, "replays"))
                    {
                        var replays = leaderboards
                                      .SelectMany(l => l.Entries)
                                      .Where(e => e.ReplayId != null)
                                      .Select(e => e.ReplayId.Value)
                                      .Distinct()
                                      .Select(r => new Replay {
                            ReplayId = r
                        });

                        var options = new BulkUpsertOptions {
                            UpdateWhenMatched = false
                        };
                        var rowsAffected = await storeClient.BulkUpsertAsync(replays, options, cancellationToken).ConfigureAwait(false);

                        activity.Report(rowsAffected);
                    }

                    using (var activity = new StoreActivity(Log, "daily entries"))
                    {
                        var entries = leaderboards.SelectMany(e => e.Entries);

                        var rowsAffected = await storeClient.BulkUpsertAsync(entries, cancellationToken).ConfigureAwait(false);

                        activity.Report(rowsAffected);
                    }

                    operation.Telemetry.Success = true;
                }
                catch (Exception) when(operation.Telemetry.MarkAsUnsuccessful())
                {
                }
            }
        }