Skip to content

Commit 64c47e6

Browse files
committed
Refactor leaderboards and add job based leaderboards
1 parent 8f22a35 commit 64c47e6

File tree

4 files changed

+343
-164
lines changed

4 files changed

+343
-164
lines changed

Client/Components/Pages/Leaderboard.razor

Lines changed: 98 additions & 55 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
@inject HttpClient Http
44
@inject NavigationManager NavigationManager
55
@attribute [StreamRendering]
6+
@inject IConfiguration Configuration
67

78
<PageTitle>Leaderboard</PageTitle>
89
<h4>Leaderboards</h4>
@@ -12,76 +13,101 @@
1213
}
1314
else
1415
{
16+
var queryDictionary = System.Web.HttpUtility.ParseQueryString(new Uri(NavigationManager.Uri).Query);
17+
var username = queryDictionary["username"] ?? "";
1518
// 0, 1, 2, 3, 4, 5 = Last24Hours, Last7Days, Last30Days, Last90Days, Last365Days, AllTime
16-
<div class="btn-group" role="group" aria-label="Time range selection">
19+
<div class="btn-group" role="group" aria-label="Time range selection" style="margin-bottom: 10px">
1720
<button type="button" class="btn btn-secondary" onclick="changeTimeRange(0)">Last 24 hours</button>
1821
<button type="button" class="btn btn-secondary" onclick="changeTimeRange(1)">Last 7 days</button>
1922
<button type="button" class="btn btn-secondary" onclick="changeTimeRange(2)">Last 30 days</button>
2023
<button type="button" class="btn btn-secondary" onclick="changeTimeRange(3)">Last 90 days</button>
2124
<button type="button" class="btn btn-secondary" onclick="changeTimeRange(4)">Last 365 days</button>
2225
<button type="button" class="btn btn-secondary" onclick="changeTimeRange(5)">All time</button>
2326
</div>
24-
// Need 2 tables for MostSeenPlayers and MostAntagPlayers
25-
<table class="table">
26-
<thead>
27-
<tr>
28-
<th>Player name</th>
29-
<th>Times seen</th>
30-
</tr>
31-
</thead>
32-
<tbody>
33-
@foreach (var player in LeaderboardData.MostSeenPlayers)
34-
{
35-
<tr>
36-
<td><a href="/player/@player.Value.Player.PlayerGuid">@player.Value.Player.Username</a></td>
37-
<td>@player.Value.Count</td>
38-
</tr>
39-
}
40-
</tbody>
41-
</table>
27+
28+
// Need a simple search bar to filter for own name
29+
<div class="search-bar">
30+
<div class="d-flex ms-auto">
31+
<input
32+
type="text"
33+
class="form-control"
34+
placeholder="Enter username..."
35+
onsubmit="search()"
36+
aria-label="Search"
37+
data-filter="@Configuration["ApiUrl"]api/Data/username-completion?username=#QUERY#"
38+
id="search"
39+
value="@username"
40+
>
41+
<button class="btn btn-outline-success" type="button" onclick="search()">Filter</button>
42+
</div>
43+
</div>
44+
45+
<hr/>
4246

43-
<table class="table">
44-
<thead>
45-
<tr>
46-
<th>Player name</th>
47-
<th>Times antag</th>
48-
</tr>
49-
</thead>
50-
<tbody>
51-
@foreach (var player in LeaderboardData.MostAntagPlayers)
47+
@foreach (var leaderboard in LeaderboardData.Leaderboards)
48+
{
49+
<h4>@leaderboard.Name</h4>
50+
if (leaderboard.ExtraInfo != null)
5251
{
53-
<tr>
54-
<td><a href="/player/@player.Value.Player.PlayerGuid">@player.Value.Player.Username</a></td>
55-
<td>@player.Value.Count</td>
56-
</tr>
52+
<p>@leaderboard.ExtraInfo</p>
5753
}
58-
</tbody>
59-
</table>
60-
61-
<table class="table">
62-
<thead>
63-
<tr>
64-
<th>Player name</th>
65-
<th>Times hunted by antags</th>
66-
</tr>
67-
</thead>
68-
<tbody>
69-
@foreach (var player in LeaderboardData.MostHuntedPlayer)
70-
{
54+
<table class="table">
55+
<thead>
7156
<tr>
72-
<td><a href="/player/@player.Value.Player.PlayerGuid">@player.Value.Player.Username</a></td>
73-
<td>@player.Value.Count</td>
57+
<th>Position</th>
58+
<th>Player name</th>
59+
<th>@leaderboard.TrackedData</th>
7460
</tr>
75-
}
76-
</tbody>
77-
</table>
61+
</thead>
62+
<tbody>
63+
@foreach (var player in leaderboard.Data)
64+
{
65+
if (!IsCurrentPlayer(player.Value.Player.Username))
66+
{
67+
<tr>
68+
<td>@player.Value.Position</td>
69+
<td><a href="/player/@player.Value.Player.PlayerGuid">@player.Value.Player.Username</a></td>
70+
<td>@player.Value.Count</td>
71+
</tr>
72+
}
73+
else
74+
{
75+
<tr style="--bs-table-bg: #622c2c;">
76+
<td>@player.Value.Position</td>
77+
<td><a href="/player/@player.Value.Player.PlayerGuid">@player.Value.Player.Username</a></td>
78+
<td>@player.Value.Count</td>
79+
</tr>
80+
}
81+
}
82+
</tbody>
83+
</table>
84+
}
7885
}
7986

8087
<script>
8188
function changeTimeRange(timeRange) {
82-
// This is a hacky way to change the time range, but it works
83-
window.location.href = "/leaderboard?timeRange=" + timeRange;
89+
var uri = new URL(window.location.href);
90+
uri.searchParams.set("timeRange", timeRange);
91+
uri.searchParams.set("username", document.getElementById("search").value);
92+
window.location.href = uri.toString();
93+
}
94+
95+
function search() {
96+
var search = document.getElementById("search").value;
97+
var uri = new URL(window.location.href);
98+
uri.searchParams.set("timeRange", uri.searchParams.get("timeRange") || 5);
99+
uri.searchParams.set("username",search);
100+
window.location.href = uri.toString();
84101
}
102+
103+
// on dom ready, fill the search bar with the query string
104+
document.addEventListener("DOMContentLoaded", function() {
105+
var uri = new URL(window.location.href);
106+
var search = uri.searchParams.get("search");
107+
if (search) {
108+
document.getElementById("search").value = search;
109+
}
110+
});
85111
</script>
86112

87113
@code{
@@ -94,16 +120,33 @@ else
94120
var uri = new Uri(NavigationManager.Uri);
95121
var query = uri.Query;
96122
var timeRange = 5; // Default to AllTime
123+
var queryDictionary = System.Web.HttpUtility.ParseQueryString(query);
97124
if (!string.IsNullOrEmpty(query))
98125
{
99-
var queryDictionary = System.Web.HttpUtility.ParseQueryString(query);
100126
if (queryDictionary.AllKeys.Contains("timeRange"))
101127
{
102128
timeRange = int.Parse(queryDictionary["timeRange"]);
103129
}
104130
}
105-
106-
LeaderboardData = await Http.GetFromJsonAsync<LeaderboardData>("api/Data/leaderboard?rangeOption=" + timeRange);
131+
132+
if (queryDictionary.AllKeys.Contains("username"))
133+
{
134+
LeaderboardData = await Http.GetFromJsonAsync<LeaderboardData>("api/Data/leaderboard?rangeOption=" + timeRange + "&username=" + queryDictionary["username"]);
135+
}
136+
else
137+
{
138+
LeaderboardData = await Http.GetFromJsonAsync<LeaderboardData>("api/Data/leaderboard?rangeOption=" + timeRange);
139+
}
107140
IsLoading = false;
108141
}
142+
143+
public bool IsCurrentPlayer(string username)
144+
{
145+
var queryDictionary = System.Web.HttpUtility.ParseQueryString(new Uri(NavigationManager.Uri).Query);
146+
if (queryDictionary.AllKeys.Contains("username"))
147+
{
148+
return queryDictionary["username"] == username;
149+
}
150+
return false;
151+
}
109152
}

0 commit comments

Comments
 (0)