Example #1
0
        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"));
        }
Example #2
0
 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];
 }
Example #3
0
        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));
            }
        }