about summary refs log tree commit diff
path: root/MatrixRoomUtils.Web/Pages/RoomStateEditorPage.razor
diff options
context:
space:
mode:
Diffstat (limited to 'MatrixRoomUtils.Web/Pages/RoomStateEditorPage.razor')
-rw-r--r--MatrixRoomUtils.Web/Pages/RoomStateEditorPage.razor177
1 files changed, 177 insertions, 0 deletions
diff --git a/MatrixRoomUtils.Web/Pages/RoomStateEditorPage.razor b/MatrixRoomUtils.Web/Pages/RoomStateEditorPage.razor
new file mode 100644
index 0000000..6ad99d9
--- /dev/null
+++ b/MatrixRoomUtils.Web/Pages/RoomStateEditorPage.razor
@@ -0,0 +1,177 @@
+@page "/RoomStateViewer/{RoomId}/Edit"
+@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
+@using MatrixRoomUtils.Web.Shared.IndexComponents
+@using Microsoft.Win32.SafeHandles
+@inject ILocalStorageService LocalStorage
+@inject NavigationManager NavigationManager
+<h3>Room state editor</h3>
+<p>Room ID: @RoomId</p>
+
+<p>@status</p>
+
+<input type="checkbox" id="showAll" @bind="ShowMembershipEvents"/> Show member events
+<br/>
+<InputSelect @bind-Value="shownStateKey">
+    <option value="">-- State key --</option>
+    @foreach (var stateEvent in FilteredEvents.Where(x => x.state_key != "").Select(x => x.state_key).Distinct().OrderBy(x => x))
+    {
+        <option value="@stateEvent">@stateEvent</option>
+        Console.WriteLine(stateEvent);
+    }
+</InputSelect>
+<br/>
+<InputSelect @bind-Value="shownType">
+    <option value="">-- Type --</option>
+    @foreach (var stateEvent in FilteredEvents.Where(x => x.state_key != shownStateKey).Select(x => x.type).Distinct().OrderBy(x => x))
+    {
+        <option value="@stateEvent">@stateEvent</option>
+    }
+</InputSelect>
+<br/>
+
+<textarea @bind="shownEventJson" style="width: 100%; height: fit-content;"></textarea>
+
+<LogView></LogView>
+
+@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<StateEvent> FilteredEvents { get; set; } = new();
+    public List<StateEvent> Events { get; set; } = new();
+    public string status = "";
+
+    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;
+        }
+        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();
+        client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", LocalStorageWrapper.AccessToken);
+        var response = await client.GetAsync($"{LocalStorageWrapper.CurrentHomeserver}/_matrix/client/r0/rooms/{RoomId}/state");
+    // var response = await client.GetAsync($"http://localhost:5117/matrix-hq-state.json");
+    //var _events = await response.Content.ReadFromJsonAsync<Queue<StateEventStruct>>();
+        var _data = await response.Content.ReadAsStreamAsync();
+        var __events = JsonSerializer.DeserializeAsyncEnumerable<StateEvent>(_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; }
+}
\ No newline at end of file