static string GetLeaderboardOutputPath(SteamStats.LeaderboardInfo leaderboard) { var asmDir = Path.GetDirectoryName(typeof(Program).GetTypeInfo().Assembly.Location); var leaderboardDir = Path.Combine(asmDir, "leaderboards"); return(Path.Combine(leaderboardDir, $"{leaderboard.Name}.json")); }
public HistogramData(SteamStats.LeaderboardInfo leaderboard) { Name = leaderboard.Name; IntervalSize = leaderboard.DisplayType == SteamStats.DisplayType.Score ? 1 : 50; MinScore = 0; MaxScore = leaderboard.DisplayType == SteamStats.DisplayType.Score ? 100 : 10 * 60 * 100; NextRequestUrl = leaderboard.Url; RequestedLeaderboardEntries = 0; TotalLeaderboardEntries = leaderboard.Entries; Values = new int[(MaxScore - MinScore + IntervalSize - 1) / IntervalSize]; }
static async Task GenerateHistogramAsync(SteamStats stats, SteamStats.LeaderboardInfo leaderboard, CancellationToken cancel) { var destFilePath = GetLeaderboardOutputPath(leaderboard); var destFileDir = Path.GetDirectoryName(destFilePath); if (!Directory.Exists(destFileDir)) { Directory.CreateDirectory(destFileDir); } var data = File.Exists(destFilePath) ? JsonConvert.DeserializeObject <HistogramData>(File.ReadAllText(destFilePath)) : new HistogramData(leaderboard); while (!cancel.IsCancellationRequested && data.RequestedLeaderboardEntries < data.TotalLeaderboardEntries) { SteamStats.LeaderboardEntriesResponse entries; try { entries = await stats.GetLeaderboardEntriesAsync(data.NextRequestUrl); } catch (Exception e) { Console.WriteLine(e); break; } if (cancel.IsCancellationRequested) { return; } Console.WriteLine($"- Fetched {entries.EntryEnd} of {entries.TotalLeaderboardEntries} entries..."); foreach (var entry in entries.Entries) { if (entry.Score < data.MinScore) { continue; } if (entry.Score >= data.MaxScore) { Console.WriteLine("- Reached max score."); data.RequestedLeaderboardEntries = data.TotalLeaderboardEntries; break; } var index = (entry.Score - data.MinScore) / data.IntervalSize; data.Values[index]++; } if (entries.EntryEnd > data.RequestedLeaderboardEntries) { data.RequestedLeaderboardEntries = entries.EntryEnd; data.TotalLeaderboardEntries = entries.TotalLeaderboardEntries; data.NextRequestUrl = entries.NextRequestUrl; } File.WriteAllText(destFilePath, JsonConvert.SerializeObject(data)); } }