about summary refs log tree commit diff
path: root/MatrixRoomUtils.Web/Pages/PolicyList/PolicyListRoomList.razor
diff options
context:
space:
mode:
authorTheArcaneBrony <myrainbowdash949@gmail.com>2023-05-04 15:26:17 +0200
committerTheArcaneBrony <myrainbowdash949@gmail.com>2023-05-04 15:26:17 +0200
commitdc3201d641a03e051c6f0db07612eb6b0bb506c3 (patch)
treef4a57bcfbdf0be6a373df342d26b76bdbf43e2e9 /MatrixRoomUtils.Web/Pages/PolicyList/PolicyListRoomList.razor
parentFix bugs in policy editor and state viewer (diff)
downloadMatrixUtils-dc3201d641a03e051c6f0db07612eb6b0bb506c3.tar.xz
Dark theme, fancier room list
Diffstat (limited to 'MatrixRoomUtils.Web/Pages/PolicyList/PolicyListRoomList.razor')
-rw-r--r--MatrixRoomUtils.Web/Pages/PolicyList/PolicyListRoomList.razor158
1 files changed, 158 insertions, 0 deletions
diff --git a/MatrixRoomUtils.Web/Pages/PolicyList/PolicyListRoomList.razor b/MatrixRoomUtils.Web/Pages/PolicyList/PolicyListRoomList.razor
new file mode 100644
index 0000000..5656af9
--- /dev/null
+++ b/MatrixRoomUtils.Web/Pages/PolicyList/PolicyListRoomList.razor
@@ -0,0 +1,158 @@
+@page "/PolicyListEditor"
+@using System.Text.Json
+@using MatrixRoomUtils.Core.Extensions
+@inject ILocalStorageService LocalStorage
+@inject NavigationManager NavigationManager
+<h3>Policy list editor - Room list</h3>
+<hr/>
+
+@if (PolicyRoomList.Count == 0)
+{
+    <p>No policy rooms found.</p>
+    <p>Loading progress: @checkedRoomCount/@totalRoomCount</p>
+}
+else
+{
+    @if (checkedRoomCount != totalRoomCount)
+    {
+        <p>Loading progress: @checkedRoomCount/@totalRoomCount</p>
+    }
+    foreach (var s in PolicyRoomList)
+    {
+        <a href="@(NavigationManager.Uri + "/" + s.RoomId.Replace('.', '~'))">[@s.Shortcode] @s.Name (@s.RoomId)</a>
+        <br/>
+    }
+}
+
+<div style="margin-bottom: 4em;"></div>
+<LogView></LogView>
+
+@code {
+    //get room list
+    // - sync withroom list filter
+    // type = support.feline.msc3784
+    //support.feline.policy.lists.msc.v1
+
+    public List<PolicyRoomInfo> 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 xxxrooms = await RuntimeCache.CurrentHomeServer.GetJoinedRooms();
+        totalRoomCount = xxxrooms.Count;
+        StateHasChanged();
+
+        var xxxsemaphore = new SemaphoreSlim(256);
+        var xxxtasks = new List<Task<PolicyRoomInfo?>>();
+        foreach (var room in xxxrooms)
+        {
+            xxxtasks.Add(GetPolicyRoomInfo(room.RoomId, xxxsemaphore));
+        }
+        var xxxresults = await Task.WhenAll(xxxtasks);
+        PolicyRoomList.AddRange(xxxresults.Where(x => x != null).Select(x => x.Value));
+
+        Console.WriteLine($"Detected policy lists: {PolicyRoomList.ToJson()}");
+        return;
+    /*
+        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<JsonElement>();
+        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(256);
+        var tasks = new List<Task<PolicyRoomInfo?>>();
+        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));
+
+
+    //print to console
+        Console.WriteLine($"Detected policy lists: {PolicyRoomList.ToJson()}");
+        */
+    }
+
+    private async Task<PolicyRoomInfo?> GetPolicyRoomInfo(string room, SemaphoreSlim semaphore)
+    {
+        try
+        {
+    //TODO: refactor!!!!!
+            await semaphore.WaitAsync();
+            PolicyRoomInfo roomInfo = new()
+            {
+                RoomId = room
+            };
+
+
+    // --- //
+            var r = await RuntimeCache.CurrentHomeServer.GetRoom(room);
+            var shortcodeState = await r.GetStateAsync("org.matrix.mjolnir.shortcode");
+            if(!shortcodeState.HasValue) return null;
+            roomInfo.Shortcode = shortcodeState.Value.TryGetProperty("shortcode", out JsonElement shortcode) ? shortcode.GetString() : null;
+
+            if (roomInfo.Shortcode != null)
+            {
+                roomInfo.Name = await r.GetNameAsync();
+                return roomInfo;
+            }
+
+            return null;
+        }
+        finally
+
+        {
+            checkedRoomCount++;
+            StateHasChanged();
+            semaphore.Release();
+        }
+    }
+
+    public struct PolicyRoomInfo
+
+    {
+        public
+            string RoomId { get; set; }
+
+        public
+            string? Shortcode { get; set; }
+
+        public
+            string? Name { get; set; }
+    }
+    } 
\ No newline at end of file