ui/Lobby.razor
@using System
@using System.Collections.Generic
@using System.Linq
@using System.Threading.Tasks
@using Sandbox;
@using Sandbox.Network
@inherits PanelComponent
@namespace Facepunch.BombRoyale

<root>
	<div class="center">
		<div class="left">
			<div class="title">
				💣 Bomb Royale
			</div>

			<div class="explanation">
				<p>
					Survive the longest without getting blown up.
				</p>
			</div>
			
			<div class="button-list">
				<div class="button" onclick=@CreateLobby>
					Create Lobby
				</div>
				
				<div class="button" onclick=@Quit>
					Quit
				</div>
			</div>
		</div>

		<div class="lobby-list">
			<div class="header">
				<div class="title">Lobbies</div>
			</div>

			@if ( IsRefreshing )
			{
				<label>Refreshing the lobby list, please wait...</label>
			}
			else if ( List.Count == 0 )
			{
				<label>No lobbies were found, create one to play.</label>
			}
			else
			{
				<div class="button-list">
					@foreach ( var lobby in List )
					{
						if ( lobby.Members >= 4 ) continue;
						
						<div class="button" onclick=@( () => OpenLobby( lobby ) )>
							<div class="title">
								@lobby.Name
							</div>

							<div class="meta">
								<div class="map">
									Bomb Royale
								</div>

								<div class="count">
									@lobby.Members / @lobby.MaxMembers
								</div>
							</div>
						</div>
					}
				</div>
			}
		</div>
	</div>
</root>

@code
{
	private TimeSince TimeSinceLastConnect { get; set; }
	private bool IsRefreshing { get; set; }
	private List<LobbyInformation> List { get; set; } = [];
	
	protected override void OnFixedUpdate()
	{
		
	}
	
	protected override void OnEnabled()
	{
		base.OnEnabled();
		
		_ = RefreshLobbyList();
	}

	protected override void OnUpdate()
	{
		
	}
	
	protected override int BuildHash() => HashCode.Combine( RealTime.Now );
	
	private async Task RefreshLobbyList()
	{
		while ( true )
		{
			IsRefreshing = true;
			StateHasChanged();

			List = await Networking.QueryLobbies();

			IsRefreshing = false;
			StateHasChanged();

			await Task.DelayRealtimeSeconds( 5f );
		}
	}

	private void OpenLobby( LobbyInformation lobby )
	{
		if ( TimeSinceLastConnect < 3f ) return;
		if ( lobby.Members >= 4 ) return;
		Networking.Connect( lobby.LobbyId );
		TimeSinceLastConnect = 0f;
	}

	private void CreateLobby()
	{
		Game.ActiveScene.LoadFromFile( "scenes/arena.scene" );
	}

	private void Quit()
	{
		Game.Close();
	}
}