A Razor UI component that shows two leaderboards (Total Score and Best Combo). It opens when the Score input is held, fetches leaderboard data via Leaderboards API, and renders top entries highlighting the local Steam user.
@using Sandbox.Services
@using System.Threading.Tasks
@inherits PanelComponent
<root class="@(_open ? "open" : "")">
@if ( _open )
{
@foreach ( var view in Boards() )
{
<div class="board">
<div class="title">@view.Title</div>
@if ( view.Board is not null && view.Board.Entries.Length > 0 )
{
@foreach ( var e in view.Board.Entries )
{
<div class="row @(e.SteamId == _localSteamId ? "me" : "")">
<span class="rank">@e.Rank</span>
<span class="name">@e.DisplayName</span>
<span class="value">@e.Value.ToString( "N0" )</span>
</div>
}
}
else
{
<div class="row empty"><span class="name">No scores yet</span></div>
}
</div>
}
}
</root>
@code
{
private bool _open;
private bool _refreshing;
private Leaderboards.Board2 _scoreBoard;
private Leaderboards.Board2 _comboBoard;
private long _localSteamId => (long)Sandbox.Utility.Steam.SteamId;
private record BoardView( Leaderboards.Board2 Board, string Title );
private IEnumerable<BoardView> Boards()
{
yield return new BoardView( _scoreBoard, "Total Score" );
yield return new BoardView( _comboBoard, "Best Combo" );
}
protected override void OnUpdate()
{
var down = Input.Down( "Score" );
if ( down == _open )
return;
_open = down;
if ( _open )
_ = RefreshBoards();
StateHasChanged();
}
private async Task RefreshBoards()
{
if ( _refreshing )
return;
if ( _scoreBoard is null )
{
_scoreBoard = Leaderboards.GetFromStat( "total_score" );
_scoreBoard.SetAggregationSum();
_scoreBoard.SetSortDescending();
_scoreBoard.MaxEntries = 10;
}
if ( _comboBoard is null )
{
_comboBoard = Leaderboards.GetFromStat( "best_combo" );
_comboBoard.SetAggregationMax();
_comboBoard.SetSortDescending();
_comboBoard.MaxEntries = 10;
}
if ( _scoreBoard is null || _comboBoard is null )
return;
_refreshing = true;
try
{
await _scoreBoard.Refresh();
await _comboBoard.Refresh();
}
finally
{
_refreshing = false;
}
StateHasChanged();
}
protected override int BuildHash() => System.HashCode.Combine( _open, _scoreBoard?.Entries.Length, _comboBoard?.Entries.Length );
}