Skip to content

Commit b2949b9

Browse files
committed
Add support for selecting how many entries to show in leaderboards
Resolves #47
1 parent d167c23 commit b2949b9

File tree

2 files changed

+17
-6
lines changed

2 files changed

+17
-6
lines changed

ReplayBrowser/Pages/Leaderboard.razor

Lines changed: 13 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,8 @@ else
3535
{
3636
var queryDictionary = System.Web.HttpUtility.ParseQueryString(new Uri(NavigationManager.Uri).Query);
3737
var username = queryDictionary["username"] ?? "";
38+
var entries = int.Parse(queryDictionary["entries"] ?? "10"); // This can error, but we don't care.
39+
3840
// 0, 1, 2, 3, 4, 5 = Last24Hours, Last7Days, Last30Days, Last90Days, Last365Days, AllTime
3941
<div class="btn-group" role="group" aria-label="Time range selection" style="margin-bottom: 10px">
4042
<button type="button" class="btn btn-secondary" onclick="changeTimeRange(0)">Last 24 hours</button>
@@ -45,7 +47,13 @@ else
4547
<button type="button" class="btn btn-secondary" onclick="changeTimeRange(5)">All time</button>
4648
</div>
4749

48-
// Need a simple search bar to filter for own name
50+
<p>Showing leaderboards for the time range: @((RangeOption)int.Parse(queryDictionary["timeRange"] ?? "5"))</p>
51+
52+
<div class="input-group mb-3">
53+
<span class="input-group-text" id="basic-addon1">Entries to show</span>
54+
<input type="number" id="entries" class="form-control" placeholder="10" aria-label="Entries" aria-describedby="basic-addon1" value="@entries">
55+
</div>
56+
4957
<div class="search-bar">
5058
<div class="d-flex ms-auto">
5159
<input
@@ -173,6 +181,7 @@ else
173181
var uri = new URL(window.location.href);
174182
uri.searchParams.set("timeRange", timeRange);
175183
uri.searchParams.set("username", document.getElementById("search").value);
184+
uri.searchParams.set("entries", document.getElementById("entries").value);
176185
// Get the selected servers
177186
let selectedServers = Array.from(document.getElementsByClassName("server-checkbox"))
178187
.filter(x => x.checked)
@@ -191,6 +200,7 @@ else
191200
var uri = new URL(window.location.href);
192201
uri.searchParams.set("timeRange", uri.searchParams.get("timeRange") || 5);
193202
uri.searchParams.set("username",search);
203+
uri.searchParams.set("entries", document.getElementById("entries").value);
194204
let selectedServers = Array.from(document.getElementsByClassName("server-checkbox"))
195205
.filter(x => x.checked)
196206
.map(x => x.value)
@@ -244,6 +254,7 @@ else
244254
// Need to convert the timerange number to the enum
245255
var timeRangeEnum = (RangeOption) timeRange;
246256
var username = queryDictionary["username"];
257+
var entries = int.Parse(queryDictionary["entries"] ?? "10");
247258

248259
if (username != null)
249260
{
@@ -268,7 +279,7 @@ else
268279
}
269280

270281
var selectedServersArray = selectedServers.Split(',');
271-
leaderboard = await LeaderboardService.GetLeaderboard(timeRangeEnum, username, selectedServersArray, authState);
282+
leaderboard = await LeaderboardService.GetLeaderboard(timeRangeEnum, username, selectedServersArray, authState, entries);
272283
}
273284
catch (UnauthorizedAccessException)
274285
{

ReplayBrowser/Services/LeaderboardService.cs

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -52,7 +52,7 @@ private void DoWork(object? state)
5252
foreach (var rangeOption in Enum.GetValues<RangeOption>())
5353
{
5454
var anonymousAuth = new AuthenticationState(new ClaimsPrincipal(new ClaimsIdentity()));
55-
GetLeaderboard(rangeOption, null, [], anonymousAuth, false).Wait();
55+
GetLeaderboard(rangeOption, null, [], anonymousAuth, 10, false).Wait();
5656
}
5757

5858
sw.Stop();
@@ -70,7 +70,7 @@ public void Dispose()
7070
_timer?.Dispose();
7171
}
7272

73-
public async Task<LeaderboardData> GetLeaderboard(RangeOption rangeOption, string? username, string[]? servers, AuthenticationState authenticationState, bool logAction = true)
73+
public async Task<LeaderboardData> GetLeaderboard(RangeOption rangeOption, string? username, string[]? servers, AuthenticationState authenticationState, int entries = 10, bool logAction = true)
7474
{
7575
if (servers == null || servers.Length == 0)
7676
{
@@ -121,7 +121,7 @@ public async Task<LeaderboardData> GetLeaderboard(RangeOption rangeOption, strin
121121

122122
var serversCacheKey = string.Join("-", servers);
123123

124-
var cacheKey = "leaderboard-" + rangeOption + "-" + usernameCacheKey + "-" + serversCacheKey;
124+
var cacheKey = "leaderboard-" + rangeOption + "-" + usernameCacheKey + "-" + serversCacheKey + "-" + entries;
125125
if (_cache.TryGetValue(cacheKey, out LeaderboardData? leaderboardData))
126126
{
127127
return leaderboardData!;
@@ -387,7 +387,7 @@ public async Task<LeaderboardData> GetLeaderboard(RangeOption rangeOption, strin
387387
// Need to calculate the position of every player in the leaderboard.
388388
foreach (var leaderboard in leaderboards)
389389
{
390-
var leaderboardResult = await GenerateLeaderboard(leaderboard.Key, leaderboard.Key, leaderboard.Value, usernameGuid, leaderboard.Value.Limit);
390+
var leaderboardResult = await GenerateLeaderboard(leaderboard.Key, leaderboard.Key, leaderboard.Value, usernameGuid, entries);
391391
leaderboards[leaderboard.Key].Data = leaderboardResult.Data;
392392
}
393393

0 commit comments

Comments
 (0)