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

Room state editor

Room ID: @RoomId

@status

Show member events
@foreach (var stateEvent in FilteredEvents.Where(x => x.state_key != "").Select(x => x.state_key).Distinct().OrderBy(x => x)) { Console.WriteLine(stateEvent); }
@foreach (var stateEvent in FilteredEvents.Where(x => x.state_key != shownStateKey).Select(x => x.type).Distinct().OrderBy(x => x)) { }
@code { //get room list // - sync withroom list filter // type = support.feline.msc3784 //support.feline.policy.lists.msc.v1 [Parameter] public string? RoomId { get; set; } public List FilteredEvents { get; set; } = new(); public List Events { get; set; } = new(); public string status = ""; protected override async Task OnInitializedAsync() { if (!RuntimeCache.WasLoaded) await LocalStorageWrapper.LoadFromLocalStorage(LocalStorage); await base.OnInitializedAsync(); if (RuntimeCache.CurrentHomeServer != null) { NavigationManager.NavigateTo("/Login"); return; } RoomId = RoomId.Replace('~', '.'); await LoadStatesAsync(); Console.WriteLine("Policy list editor initialized!"); } private DateTime _lastUpdate = DateTime.Now; private async Task LoadStatesAsync() { int StateLoaded = 0; using var client = new HttpClient(); //TODO: can this be improved? client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", RuntimeCache.CurrentHomeServer.AccessToken); var response = await client.GetAsync($"{RuntimeCache.CurrentHomeServer.FullHomeServerDomain}/_matrix/client/r0/rooms/{RoomId}/state"); // var response = await client.GetAsync($"http://localhost:5117/matrix-hq-state.json"); //var _events = await response.Content.ReadFromJsonAsync>(); var _data = await response.Content.ReadAsStreamAsync(); var __events = JsonSerializer.DeserializeAsyncEnumerable(_data); await foreach (var _ev in __events) { var e = new StateEvent() { type = _ev.type, state_key = _ev.state_key, origin_server_ts = _ev.origin_server_ts, content = _ev.content }; Events.Add(e); if (string.IsNullOrEmpty(e.state_key)) { FilteredEvents.Add(e); } StateLoaded++; if ((DateTime.Now - _lastUpdate).TotalMilliseconds > 100) { _lastUpdate = DateTime.Now; status = $"Loaded {StateLoaded} state events"; StateHasChanged(); await Task.Delay(0); } } StateHasChanged(); } private async Task RebuildFilteredData() { status = "Rebuilding filtered data..."; StateHasChanged(); await Task.Delay(1); var _FilteredEvents = Events; if (!ShowMembershipEvents) _FilteredEvents = _FilteredEvents.Where(x => x.type != "m.room.member").ToList(); status = "Done, rerendering!"; StateHasChanged(); await Task.Delay(1); FilteredEvents = _FilteredEvents; if(_shownType != null) shownEventJson = _FilteredEvents.Where(x => x.type == _shownType).First().content.ToJson(indent: true, ignoreNull: true); StateHasChanged(); } public struct PreRenderedStateEvent { public string content { get; set; } public long origin_server_ts { get; set; } public string state_key { get; set; } public string type { get; set; } // public string sender { get; set; } // public string event_id { get; set; } // public string user_id { get; set; } // public string replaces_state { get; set; } } public bool ShowMembershipEvents { get => _showMembershipEvents; set { _showMembershipEvents = value; RebuildFilteredData(); } } private bool _showMembershipEvents; private string _shownStateKey; private string _shownType; private string shownStateKey { get => _shownStateKey; set { _shownStateKey = value; RebuildFilteredData(); } } private string shownType { get => _shownType; set { _shownType = value; RebuildFilteredData(); } } private string shownEventJson { get; set; } }