@page "/RoomStateViewer" @using System.Net.Http.Headers @using System.Text.Json @using MatrixRoomUtils.Core @inject ILocalStorageService LocalStorage @inject NavigationManager NavigationManager

Room state viewer

Room list

@if (PolicyRoomList.Count == 0) {

No policy rooms found.

Loading progress: @checkedRoomCount/@totalRoomCount

} else { @if (checkedRoomCount != totalRoomCount) {

Loading progress: @checkedRoomCount/@totalRoomCount

} foreach (var s in PolicyRoomList) { @s.Name (@s.RoomId)
}
} @code { public List PolicyRoomList { get; set; } = new(); private int checkedRoomCount { get; set; } = 0; private int totalRoomCount { get; set; } = 0; protected override async Task OnInitializedAsync() { if (!RuntimeCache.WasLoaded) await LocalStorageWrapper.LoadFromLocalStorage(LocalStorage); await base.OnInitializedAsync(); if (RuntimeCache.CurrentHomeServer == null) { NavigationManager.NavigateTo("/Login"); return; } await EnumeratePolicyRooms(); Console.WriteLine("Policy list editor initialized!"); } private async Task EnumeratePolicyRooms() { var rooms = (await RuntimeCache.CurrentHomeServer.GetJoinedRooms()).Select(x=>x.RoomId).ToList(); totalRoomCount = rooms.Count; StateHasChanged(); var semaphore = new SemaphoreSlim(128); var tasks = new List>(); foreach (string room in rooms) { tasks.Add(GetPolicyRoomInfo(room, semaphore)); } var results = await Task.WhenAll(tasks); PolicyRoomList.AddRange(results.Where(x => x != null).Select(x=>x.Value)); StateHasChanged(); } private async Task GetPolicyRoomInfo(string room, SemaphoreSlim semaphore) { try { await semaphore.WaitAsync(); return new PolicyRoomInfo() { RoomId = room, Name = await (await RuntimeCache.CurrentHomeServer.GetRoom(room)).GetNameAsync() }; } finally { checkedRoomCount++; StateHasChanged(); semaphore.Release(); } } public struct PolicyRoomInfo { public string RoomId { get; set; } public string Name { get; set; } } }