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)); }
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()); } }