@page "/RoomStateViewer" @using MatrixRoomUtils.Authentication @using MatrixRoomUtils.Web.Classes @using Blazored.LocalStorage @using System.Net.Http.Headers @using System.Text.Json @using System.Xml.Schema @using MatrixRoomUtils.Extensions @using MatrixRoomUtils.StateEventTypes @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 (!LocalStorageWrapper.WasLoaded) await LocalStorageWrapper.LoadFromLocalStorage(LocalStorage); await base.OnInitializedAsync(); if (LocalStorageWrapper.AccessToken == null || LocalStorageWrapper.CurrentHomeserver == null) { NavigationManager.NavigateTo("/Login"); return; } await EnumeratePolicyRooms(); Console.WriteLine("Policy list editor initialized!"); } private async Task EnumeratePolicyRooms() { using HttpClient wc = new(); wc.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", LocalStorageWrapper.AccessToken); //get room list //temporary hack until rooms get enumerated... string[] rooms = { "!fTjMjIzNKEsFlUIiru:neko.dev" }; var _rooms = await wc.GetAsync($"{LocalStorageWrapper.CurrentHomeserver}/_matrix/client/v3/joined_rooms"); Console.WriteLine($"Got {_rooms.StatusCode}..."); if (!_rooms.IsSuccessStatusCode) { Console.WriteLine($"Failed to get rooms: {await _rooms.Content.ReadAsStringAsync()}"); return; } var _rooms_o = await _rooms.Content.ReadFromJsonAsync(); if (_rooms_o.TryGetProperty("joined_rooms", out JsonElement _rooms_j)) { rooms = _rooms_j.EnumerateArray().Select(x => x.GetString()).ToArray(); } totalRoomCount = rooms.Length; 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(); var roomInfo = new PolicyRoomInfo() { RoomId = room }; using HttpClient wc = new(); wc.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", LocalStorageWrapper.AccessToken); var sk = await wc.GetAsync($"{LocalStorageWrapper.CurrentHomeserver}/_matrix/client/v3/rooms/{room}/state/m.room.name"); if (sk.IsSuccessStatusCode) { Console.WriteLine($"Got content: {await sk.Content.ReadAsStringAsync()}"); var sko = await sk.Content.ReadFromJsonAsync(); if (sko.TryGetProperty("name", out JsonElement shortcode)) { Console.WriteLine($"Room {room} has a name: {shortcode.GetString()}!"); roomInfo.Name = shortcode.GetString(); } else Console.WriteLine("No record found..."); } else if (sk.StatusCode == System.Net.HttpStatusCode.NotFound) { } else Console.WriteLine($"Got failure while checking {room}: {sk.StatusCode} ({await sk.Content.ReadAsStringAsync()})..."); return roomInfo; } finally { checkedRoomCount++; StateHasChanged(); semaphore.Release(); } } public struct PolicyRoomInfo { public string RoomId { get; set; } public string Name { get; set; } } }