about summary refs log tree commit diff
path: root/MatrixRoomUtils.Web/Shared
diff options
context:
space:
mode:
authorTheArcaneBrony <myrainbowdash949@gmail.com>2023-07-02 01:01:09 +0200
committerTheArcaneBrony <myrainbowdash949@gmail.com>2023-07-02 01:01:09 +0200
commitdef33cc092ae2c6defcc218b108b7c99cbfb8581 (patch)
treeba992ff8c30b7d4e8af0a78350e157e095455a18 /MatrixRoomUtils.Web/Shared
parentDeduplicate some api calls (diff)
downloadMatrixUtils-def33cc092ae2c6defcc218b108b7c99cbfb8581.tar.xz
Prefetch room info
Diffstat (limited to 'MatrixRoomUtils.Web/Shared')
-rw-r--r--MatrixRoomUtils.Web/Shared/InlineUserItem.razor3
-rw-r--r--MatrixRoomUtils.Web/Shared/RoomList.razor33
-rw-r--r--MatrixRoomUtils.Web/Shared/RoomListComponents/RoomListCategory.razor18
-rw-r--r--MatrixRoomUtils.Web/Shared/RoomListComponents/RoomListSpace.razor18
-rw-r--r--MatrixRoomUtils.Web/Shared/RoomListItem.razor32
-rw-r--r--MatrixRoomUtils.Web/Shared/TimelineComponents/TimelineMemberItem.razor1
-rw-r--r--MatrixRoomUtils.Web/Shared/UserListItem.razor3
7 files changed, 69 insertions, 39 deletions
diff --git a/MatrixRoomUtils.Web/Shared/InlineUserItem.razor b/MatrixRoomUtils.Web/Shared/InlineUserItem.razor
index a498c70..ffccc25 100644
--- a/MatrixRoomUtils.Web/Shared/InlineUserItem.razor
+++ b/MatrixRoomUtils.Web/Shared/InlineUserItem.razor
@@ -1,6 +1,7 @@
 @using MatrixRoomUtils.Core.Responses
 @using MatrixRoomUtils.Core.StateEventTypes
 @using MatrixRoomUtils.Core.Helpers
+@using MatrixRoomUtils.Core.StateEventTypes.Spec
 <div style="background-color: #ffffff11; border-radius: 0.5em; height: 1em; display: inline-block; vertical-align: middle;" alt="@UserId">
     <img style="@(ChildContent is not null ? "vertical-align: baseline;" : "vertical-align: top;") width: 1em; height: 1em; border-radius: 50%;" src="@ProfileAvatar"/>
     <span style="position: relative; top: -5px;">@ProfileName</span>
@@ -19,7 +20,7 @@
     public RenderFragment? ChildContent { get; set; }
 
     [Parameter]
-    public ProfileResponse User { get; set; }
+    public ProfileResponseEventData User { get; set; }
 
     [Parameter]
     public string? UserId { get; set; }
diff --git a/MatrixRoomUtils.Web/Shared/RoomList.razor b/MatrixRoomUtils.Web/Shared/RoomList.razor
index 7e002ed..db2d059 100644
--- a/MatrixRoomUtils.Web/Shared/RoomList.razor
+++ b/MatrixRoomUtils.Web/Shared/RoomList.razor
@@ -1,5 +1,7 @@
 @using MatrixRoomUtils.Web.Shared.RoomListComponents;
 @using MatrixRoomUtils.Core.StateEventTypes
+@using MatrixRoomUtils.Core.StateEventTypes.Common
+@using MatrixRoomUtils.Core.StateEventTypes.Spec
 <p>@Rooms.Count rooms total, @RoomsWithTypes.Sum(x=>x.Value.Count) fetched so far...</p>
 @if(Rooms.Count != RoomsWithTypes.Sum(x=>x.Value.Count)) {
     <p>Fetching more rooms...</p>
@@ -16,14 +18,14 @@ else {
 @code {
 
     [Parameter]
-    public List<GenericRoom> Rooms { get; set; }
+    public List<RoomInfo> Rooms { get; set; }
     [Parameter]
-    public ProfileResponse? GlobalProfile { get; set; }
+    public ProfileResponseEventData? GlobalProfile { get; set; }
 
-    Dictionary<string, List<GenericRoom>> RoomsWithTypes = new();
+    Dictionary<string, List<RoomInfo>> RoomsWithTypes = new();
     
     protected override async Task OnInitializedAsync() {
-        GlobalProfile ??= await (await MRUStorage.GetCurrentSession()!).GetProfile((await MRUStorage.GetCurrentSession()!).WhoAmI.UserId);
+        GlobalProfile ??= await (await MRUStorage.GetCurrentSession())!.GetProfile((await MRUStorage.GetCurrentSession())!.WhoAmI.UserId);
         if (RoomsWithTypes.Any()) return;
 
         var tasks = Rooms.Select(AddRoom);
@@ -35,35 +37,42 @@ else {
     private string GetRoomTypeName(string? roomType) => roomType switch {
         "m.space" => "Space",
         "msc3588.stories.stories-room" => "Story room",
+        "support.feline.policy.lists.msc.v1" => "MSC3784 Policy list (v1)",
         null => "Room",
         _ => roomType
         };
 
     
-    private static SemaphoreSlim _semaphoreSlim = new SemaphoreSlim(4, 4);
-    private async Task AddRoom(GenericRoom room) {
+    private static SemaphoreSlim _semaphoreSlim = new(8, 8);
+    private async Task AddRoom(RoomInfo room) {
         await _semaphoreSlim.WaitAsync();
         string roomType;
         try {
-            var createEvent = await room.GetCreateEventAsync();
+            RoomCreateEventData createEvent = (await room.GetStateEvent("m.room.create")).TypedContent as RoomCreateEventData;
             roomType = GetRoomTypeName(createEvent.Type);
 
             if (roomType == "Room") {
-                var shortcodeState = await room.GetStateAsync<MjolnirShortcodeEventData>("org.matrix.mjolnir.shortcode");
-                if (shortcodeState is not null) roomType = "Legacy policy room";
+                var mjolnirData = await room.GetStateEvent("org.matrix.mjolnir.shortcode");
+                if(mjolnirData?.RawContent?.ToJson(ignoreNull: true) is not null and not "{}")
+                    roomType = "Legacy policy room";
             }
+            //prefetch some stuff
+            await Task.WhenAll(
+                room.GetStateEvent("m.room.name"),
+                room.GetStateEvent("m.room.name")
+                );
         }
         catch (MatrixException e) {
             roomType = $"Error: {e.ErrorCode}";
         }
         
         if (!RoomsWithTypes.ContainsKey(roomType)) {
-            RoomsWithTypes.Add(roomType, new List<GenericRoom>());
+            RoomsWithTypes.Add(roomType, new List<RoomInfo>());
         }
         RoomsWithTypes[roomType].Add(room);
         
-    // if (RoomsWithTypes.Count % 10 == 0)
-        StateHasChanged();
+        // if (RoomsWithTypes[roomType].Count % 10 == 0)
+            StateHasChanged();
         // await Task.Delay(100);
         _semaphoreSlim.Release();
     }
diff --git a/MatrixRoomUtils.Web/Shared/RoomListComponents/RoomListCategory.razor b/MatrixRoomUtils.Web/Shared/RoomListComponents/RoomListCategory.razor
index e860321..4be3c1f 100644
--- a/MatrixRoomUtils.Web/Shared/RoomListComponents/RoomListCategory.razor
+++ b/MatrixRoomUtils.Web/Shared/RoomListComponents/RoomListCategory.razor
@@ -1,12 +1,16 @@
 @using MatrixRoomUtils.Core.StateEventTypes
+@using MatrixRoomUtils.Core.StateEventTypes.Spec
 <details>
     <summary>@roomType (@rooms.Count)</summary>
     @foreach (var room in rooms) {
         <div class="room-list-item">
-            <RoomListItem Room="@room" ShowOwnProfile="@(roomType == "Room")"></RoomListItem>
-            <MatrixRoomUtils.Web.Shared.SimpleComponents.LinkButton href="@($"/Rooms/{room.RoomId}/Timeline")">View timeline</MatrixRoomUtils.Web.Shared.SimpleComponents.LinkButton>
-            <MatrixRoomUtils.Web.Shared.SimpleComponents.LinkButton href="@($"/Rooms/{room.RoomId}/State/View")">View state</MatrixRoomUtils.Web.Shared.SimpleComponents.LinkButton>
-            <MatrixRoomUtils.Web.Shared.SimpleComponents.LinkButton href="@($"/Rooms/{room.RoomId}/State/Edit")">Edit state</MatrixRoomUtils.Web.Shared.SimpleComponents.LinkButton>
+            <RoomListItem RoomInfo="@room" ShowOwnProfile="@(roomType == "Room")"></RoomListItem>
+            @if (room.StateEvents.Any(x => x.Type == "m.room.create")) {
+                
+            }
+            <MatrixRoomUtils.Web.Shared.SimpleComponents.LinkButton href="@($"/Rooms/{room.Room.RoomId}/Timeline")">View timeline</MatrixRoomUtils.Web.Shared.SimpleComponents.LinkButton>
+            <MatrixRoomUtils.Web.Shared.SimpleComponents.LinkButton href="@($"/Rooms/{room.Room.RoomId}/State/View")">View state</MatrixRoomUtils.Web.Shared.SimpleComponents.LinkButton>
+            <MatrixRoomUtils.Web.Shared.SimpleComponents.LinkButton href="@($"/Rooms/{room.Room.RoomId}/State/Edit")">Edit state</MatrixRoomUtils.Web.Shared.SimpleComponents.LinkButton>
             
             @if (roomType == "Space") {
                 <RoomListSpace Space="@room"></RoomListSpace>
@@ -19,12 +23,12 @@
 @code {
 
     [Parameter]
-    public KeyValuePair<string, List<GenericRoom>> Category { get; set; }
+    public KeyValuePair<string, List<RoomInfo>> Category { get; set; }
     
     [Parameter]
-    public ProfileResponse? GlobalProfile { get; set; }
+    public ProfileResponseEventData? GlobalProfile { get; set; }
 
     private string roomType => Category.Key;
-    private List<GenericRoom> rooms => Category.Value;
+    private List<RoomInfo> rooms => Category.Value;
     
 }
\ No newline at end of file
diff --git a/MatrixRoomUtils.Web/Shared/RoomListComponents/RoomListSpace.razor b/MatrixRoomUtils.Web/Shared/RoomListComponents/RoomListSpace.razor
index 73dc334..5153658 100644
--- a/MatrixRoomUtils.Web/Shared/RoomListComponents/RoomListSpace.razor
+++ b/MatrixRoomUtils.Web/Shared/RoomListComponents/RoomListSpace.razor
@@ -1,4 +1,4 @@
-<LinkButton href="@($"/Rooms/{Space.RoomId}/Space")">Manage space</LinkButton>
+<LinkButton href="@($"/Rooms/{Space.Room.RoomId}/Space")">Manage space</LinkButton>
 
 <br/>
 <details @ontoggle="SpaceChildrenOpened">
@@ -14,23 +14,25 @@
 @code {
 
     [Parameter]
-    public GenericRoom Space { get; set; }
+    public RoomInfo Space { get; set; }
 
     [Parameter, CascadingParameter]
     public string? Breadcrumbs {
-        get => _breadcrumbs + Space.RoomId;
+        get => _breadcrumbs + Space.Room.RoomId;
         set => _breadcrumbs = value;
     }
 
-    private List<GenericRoom> Children { get; set; } = new();
+    private List<RoomInfo> Children { get; set; } = new();
 
     protected override async Task OnInitializedAsync() {
         if (Breadcrumbs == null) throw new ArgumentNullException(nameof(Breadcrumbs));
         await Task.Delay(Random.Shared.Next(1000, 10000));
-        var rooms = Space.AsSpace.GetRoomsAsync();
+        var rooms = Space.Room.AsSpace.GetRoomsAsync();
         await foreach (var room in rooms) {
-            if(Breadcrumbs.Contains(room.RoomId)) continue;
-            Children.Add(room);
+            if (Breadcrumbs.Contains(room.RoomId)) continue;
+            Children.Add(new() {
+                Room = room
+            });
         }
         await base.OnInitializedAsync();
     }
@@ -41,7 +43,7 @@
     private async Task SpaceChildrenOpened() {
         if (_shouldRenderChildren) return;
         _shouldRenderChildren = true;
-        Console.WriteLine($"[RoomList] Rendering children of {Space.RoomId}");
+        Console.WriteLine($"[RoomList] Rendering children of {Space.Room.RoomId}");
     }
 
 }
\ No newline at end of file
diff --git a/MatrixRoomUtils.Web/Shared/RoomListItem.razor b/MatrixRoomUtils.Web/Shared/RoomListItem.razor
index 13cc02d..d35c9ab 100644
--- a/MatrixRoomUtils.Web/Shared/RoomListItem.razor
+++ b/MatrixRoomUtils.Web/Shared/RoomListItem.razor
@@ -2,6 +2,7 @@
 @using System.Text.Json
 @using MatrixRoomUtils.Core.Helpers
 @using MatrixRoomUtils.Core.StateEventTypes
+@using MatrixRoomUtils.Core.StateEventTypes.Spec
 <div class="roomListItem" id="@RoomId" style="background-color: #ffffff11; border-radius: 25px; margin: 8px; width: fit-Content; @(hasDangerousRoomVersion ? "border: red 4px solid;" : hasOldRoomVersion ? "border: #FF0 1px solid;" : "")">
     @if (OwnMemberState != null) {
         <img class="imageUnloaded @(string.IsNullOrWhiteSpace(OwnMemberState?.AvatarUrl ?? GlobalProfile?.AvatarUrl) ? "" : "imageLoaded")"
@@ -30,6 +31,9 @@
 
     [Parameter]
     public GenericRoom? Room { get; set; }
+    
+    [Parameter]
+    public RoomInfo? RoomInfo { get; set; }
 
     [Parameter]
     public string? RoomId { get; set; }
@@ -40,8 +44,8 @@
     [Parameter]
     public RoomMemberEventData? OwnMemberState { get; set; }
 
-    [Parameter]
-    public ProfileResponse? GlobalProfile { get; set; }
+    [CascadingParameter]
+    public ProfileResponseEventData? GlobalProfile { get; set; }
 
     private string? roomName { get; set; }
 
@@ -62,11 +66,19 @@
         hs ??= await MRUStorage.GetCurrentSessionOrNavigate();
         if (hs is null) return;
 
-        if (Room is null && RoomId is null) {
+        if (Room is null && RoomId is null && RoomInfo is null) {
             throw new ArgumentNullException(nameof(RoomId));
         }
-        Room ??= await hs.GetRoom(RoomId);
-        RoomId = Room.RoomId;
+        
+        // sweep from roominfo to id
+        if (RoomInfo is not null) Room = RoomInfo.Room;
+        if(Room is not null) RoomId = Room.RoomId;
+        
+        //sweep from id to roominfo
+        if(RoomId is not null) Room ??= await hs.GetRoom(RoomId);
+        if(Room is not null) RoomInfo ??= new RoomInfo() {
+            Room = Room
+        };
 
         await CheckRoomVersion();
         await GetRoomInfo();
@@ -77,8 +89,8 @@
     private async Task LoadOwnProfile() {
         if (!ShowOwnProfile) return;
         try {
-            OwnMemberState ??= await Room.GetStateAsync<RoomMemberEventData>("m.room.member", hs.UserId);
-            GlobalProfile ??= await hs.GetProfile(hs.UserId, true);
+            OwnMemberState ??= (await RoomInfo.GetStateEvent("m.room.member", hs.UserId)).TypedContent as RoomMemberEventData;
+            GlobalProfile ??= await hs.GetProfile(hs.UserId);
         }
         catch (MatrixException e) {
             if (e is { ErrorCode: "M_FORBIDDEN" }) {
@@ -93,7 +105,7 @@
 
     private async Task CheckRoomVersion() {
         try {
-            var ce = await Room.GetCreateEventAsync();
+            var ce = (await RoomInfo.GetStateEvent("m.room.create")).TypedContent as RoomCreateEventData;
             if (int.TryParse(ce.RoomVersion, out var rv)) {
                 if (rv < 10)
                     hasOldRoomVersion = true;
@@ -115,9 +127,9 @@
 
     private async Task GetRoomInfo() {
         try {
-            roomName ??= await Room.GetNameAsync();
+            roomName ??= ((await RoomInfo.GetStateEvent("m.room.name"))?.TypedContent as RoomNameEventData)?.Name ?? RoomId;
 
-            var state = await Room.GetStateAsync<RoomAvatarEventData>("m.room.avatar");
+            var state = (await RoomInfo.GetStateEvent("m.room.avatar")).TypedContent as RoomAvatarEventData;
             if (state?.Url is { } url) {
                 roomIcon = MediaResolver.ResolveMediaUri(hs.FullHomeServerDomain, url);
                 Console.WriteLine($"Got avatar for room {RoomId}: {roomIcon} ({url})");
diff --git a/MatrixRoomUtils.Web/Shared/TimelineComponents/TimelineMemberItem.razor b/MatrixRoomUtils.Web/Shared/TimelineComponents/TimelineMemberItem.razor
index b7e0220..519e0b2 100644
--- a/MatrixRoomUtils.Web/Shared/TimelineComponents/TimelineMemberItem.razor
+++ b/MatrixRoomUtils.Web/Shared/TimelineComponents/TimelineMemberItem.razor
@@ -1,5 +1,6 @@
 @using MatrixRoomUtils.Core.Responses
 @using MatrixRoomUtils.Core.StateEventTypes
+@using MatrixRoomUtils.Core.StateEventTypes.Spec
 
 @if (roomMemberData.Membership == "ban") {
     <i>@Event.StateKey was banned</i>
diff --git a/MatrixRoomUtils.Web/Shared/UserListItem.razor b/MatrixRoomUtils.Web/Shared/UserListItem.razor
index a41ce49..20b1c8c 100644
--- a/MatrixRoomUtils.Web/Shared/UserListItem.razor
+++ b/MatrixRoomUtils.Web/Shared/UserListItem.razor
@@ -1,6 +1,7 @@
 @using MatrixRoomUtils.Core.Responses
 @using MatrixRoomUtils.Core.StateEventTypes
 @using MatrixRoomUtils.Core.Helpers
+@using MatrixRoomUtils.Core.StateEventTypes.Spec
 <div style="background-color: #ffffff11; border-radius: 25px; margin: 8px; width: fit-Content;">
     <img style="@(ChildContent is not null ? "vertical-align: baseline;" : "") width: 32px; height:  32px; border-radius: 50%;" src="@profileAvatar"/>
     <span style="vertical-align: middle; margin-right: 8px; border-radius: 75px;">@profileName</span>
@@ -19,7 +20,7 @@
     public RenderFragment? ChildContent { get; set; }
 
     [Parameter]
-    public ProfileResponse User { get; set; }
+    public ProfileResponseEventData User { get; set; }
 
     [Parameter]
     public string UserId { get; set; }