private static Task UpdateLeaderboardsAsync(ISteamClientApiClient steamClient, IEnumerable <Leaderboard> leaderboards)
        {
            var updateTasks = new List <Task>();

            foreach (var leaderboard in leaderboards)
            {
                var updateTask = UpdateLeaderboardAsync(steamClient, leaderboard);
                updateTasks.Add(updateTask);
            }

            return(Task.WhenAll(updateTasks));
        }
Example #2
0
 public DailyLeaderboardsWorker(
     uint appId,
     ILeaderboardsContext db,
     ISteamClientApiClient steamClientApiClient,
     ILeaderboardsStoreClient storeClient,
     TelemetryClient telemetryClient)
 {
     this.appId           = appId;
     this.telemetryClient = telemetryClient;
     this.db = db;
     this.steamClientApiClient = steamClientApiClient;
     this.storeClient          = storeClient;
 }
        private static async Task UpdateLeaderboardAsync(ISteamClientApiClient steamClient, Leaderboard leaderboard)
        {
            try
            {
                var response = await steamClient.FindLeaderboardAsync(247080, leaderboard.Name).ConfigureAwait(false);

                leaderboard.LeaderboardId = response.ID;
            }
            catch (SteamClientApiException)
            {
                Log.Warn($"Leaderboard named '{leaderboard.Name}' could not be found.");
            }
        }
        public static async Task <IEnumerable <Leaderboard> > GetLeaderboardsAsync(ISteamClientApiClient steamClient)
        {
            using (var db = new LeaderboardsContext())
            {
                var products             = db.Products.ToList();
                var modes                = db.Modes.ToList();
                var runs                 = db.Runs.ToList();
                var characters           = db.Characters.ToList();
                var expectedLeaderboards = new LeaderboardsEnumerable(products, modes, runs, characters);

                // Exclude cached leaderboards
                var cachedLeaderboards  = JsonConvert.DeserializeObject <IEnumerable <Leaderboard> >(Resources.Leaderboards);
                var missingLeaderboards = expectedLeaderboards.Except(cachedLeaderboards, new LeaderboardEqualityComparer()).ToList();
                // Exclude existing leaderboards
                var leaderboards = db.Leaderboards.ToList();
                missingLeaderboards = expectedLeaderboards.Except(leaderboards, new LeaderboardEqualityComparer()).ToList();

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

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

                        // null these out so Entity Framework doesn't try to add them as new entities.
                        leaderboard.Product   = null;
                        leaderboard.Mode      = null;
                        leaderboard.Run       = null;
                        leaderboard.Character = null;

                        db.Leaderboards.Add(leaderboard);
                    }

                    db.SaveChanges();
                }

                return((from l in db.Leaderboards
                        orderby l.ProductId, l.IsProduction, l.CharacterId, l.RunId, l.ModeId, l.IsCustomMusic, l.IsCoOp
                        select l)
                       .ToList());
            }
        }
        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());
            }
        }