about summary refs log tree commit diff
path: root/MatrixUtils.Web/Pages/Tools
diff options
context:
space:
mode:
Diffstat (limited to 'MatrixUtils.Web/Pages/Tools')
-rw-r--r--MatrixUtils.Web/Pages/Tools/UserTrace.razor143
1 files changed, 93 insertions, 50 deletions
diff --git a/MatrixUtils.Web/Pages/Tools/UserTrace.razor b/MatrixUtils.Web/Pages/Tools/UserTrace.razor
index 4ad9874..95fe02b 100644
--- a/MatrixUtils.Web/Pages/Tools/UserTrace.razor
+++ b/MatrixUtils.Web/Pages/Tools/UserTrace.razor
@@ -5,6 +5,7 @@
 @using LibMatrix
 @using System.Collections.Frozen
 @using LibMatrix.EventTypes.Spec.State
+@using LibMatrix.Filters
 @using MatrixUtils.Abstractions
 <h3>User Trace</h3>
 <hr/>
@@ -17,7 +18,7 @@
 <details>
     <summary>Rooms to be searched (@rooms.Count)</summary>
     @foreach (var room in rooms) {
-        <span>@room.Room.RoomId</span>
+        <span>@room.RoomId</span>
         <br/>
     }
 </details>
@@ -48,8 +49,11 @@
 }
 
 @code {
+
     private ObservableCollection<string> log { get; set; } = new();
-    List<RoomInfo> rooms { get; set; } = new();
+
+    // List<RoomInfo> rooms { get; set; } = new();
+    List<GenericRoom> rooms { get; set; } = [];
     Dictionary<string, List<Match>> matches = new();
 
     private string UserIdString {
@@ -63,46 +67,58 @@
         log.CollectionChanged += (sender, args) => StateHasChanged();
         var hs = await RMUStorage.GetCurrentSessionOrNavigate();
         if (hs is null) return;
-        var sessions = await RMUStorage.GetAllTokens();
-        var baseRooms = new List<GenericRoom>();
-        foreach (var userAuth in sessions) {
-            var session = await RMUStorage.GetSession(userAuth);
-            if (session is not null) {
-                baseRooms.AddRange(await session.GetJoinedRooms());
-                var sessionRooms = (await session.GetJoinedRooms()).Where(x => !rooms.Any(y => y.Room.RoomId == x.RoomId)).ToList();
-                StateHasChanged();
-                log.Add($"Got {sessionRooms.Count} rooms for {userAuth.UserId}");
+        // var sessions = await RMUStorage.GetAllTokens();
+        // var baseRooms = new List<GenericRoom>();
+        // foreach (var userAuth in sessions) {
+        //     var session = await RMUStorage.GetSession(userAuth);
+        //     if (session is not null) {
+        //         baseRooms.AddRange(await session.GetJoinedRooms());
+        //         var sessionRooms = (await session.GetJoinedRooms()).Where(x => !rooms.Any(y => y.Room.RoomId == x.RoomId)).ToList();
+        //         StateHasChanged();
+        //         log.Add($"Got {sessionRooms.Count} rooms for {userAuth.UserId}");
+        //     }
+        // }
+        //
+        // log.Add("Done fetching rooms!");
+        //
+        // baseRooms = baseRooms.DistinctBy(x => x.RoomId).ToList();
+        //
+        // // rooms.CollectionChanged += (sender, args) => StateHasChanged();
+        // var tasks = baseRooms.Select(async newRoom => {
+        //     bool success = false;
+        //     while (!success)
+        //         try {
+        //             var state = await newRoom.GetFullStateAsListAsync();
+        //             var newRoomInfo = new RoomInfo(newRoom, state);
+        //             rooms.Add(newRoomInfo);
+        //             log.Add($"Got {newRoomInfo.StateEvents.Count} events for {newRoomInfo.RoomName}");
+        //             success = true;
+        //         }
+        //         catch (MatrixException e) {
+        //             log.Add($"Failed to fetch room {newRoom.RoomId}! {e}");
+        //             throw;
+        //         }
+        //         catch (HttpRequestException e) {
+        //             log.Add($"Failed to fetch room {newRoom.RoomId}! {e}");
+        //         }
+        // });
+        // await Task.WhenAll(tasks);
+        //
+        // log.Add($"Done fetching members!");
+        //
+        // UserIDs.RemoveAll(x => sessions.Any(y => y.UserId == x));
+
+        foreach (var session in await RMUStorage.GetAllTokens()) {
+            var _hs = await RMUStorage.GetSession(session);
+            if (_hs is not null) {
+                rooms.AddRange(await _hs.GetJoinedRooms());
+                log.Add($"Got {rooms.Count} rooms after adding {_hs.UserId}");
             }
         }
 
-        log.Add("Done fetching rooms!");
-
-        baseRooms = baseRooms.DistinctBy(x => x.RoomId).ToList();
-
-        // rooms.CollectionChanged += (sender, args) => StateHasChanged();
-        var tasks = baseRooms.Select(async newRoom => {
-            bool success = false;
-            while (!success)
-                try {
-                    var state = await newRoom.GetFullStateAsListAsync();
-                    var newRoomInfo = new RoomInfo(newRoom, state);
-                    rooms.Add(newRoomInfo);
-                    log.Add($"Got {newRoomInfo.StateEvents.Count} events for {newRoomInfo.RoomName}");
-                    success = true;
-                }
-                catch (MatrixException e) {
-                    log.Add($"Failed to fetch room {newRoom.RoomId}! {e}");
-                    throw;
-                }
-                catch (HttpRequestException e) {
-                    log.Add($"Failed to fetch room {newRoom.RoomId}! {e}");
-                }
-        });
-        await Task.WhenAll(tasks);
-
-        log.Add($"Done fetching members!");
-
-        UserIDs.RemoveAll(x => sessions.Any(y => y.UserId == x));
+        //get distinct rooms evenly distributed per session, accounting for count per session
+        rooms = rooms.OrderBy(x => rooms.Count(y => y.Homeserver == x.Homeserver)).DistinctBy(x => x.RoomId).ToList();
+        log.Add($"Got {rooms.Count} rooms");
 
         StateHasChanged();
         Console.WriteLine("Rerendered!");
@@ -113,18 +129,25 @@
         foreach (var userId in UserIDs) {
             matches.Add(userId, new List<Match>());
 
-            foreach (var room in rooms) {
-                var state = room.StateEvents.Where(x => x!.Type == RoomMemberEventContent.EventId).ToList();
-                if (state!.Any(x => x.StateKey == userId)) {
-                    matches[userId].Add(new() {
-                        Event = state.First(x => x.StateKey == userId),
-                        Room = room.Room,
-                        RoomName = room.RoomName ?? "No name"
-                    });
-                }
+            // foreach (var room in rooms) {
+            //     var state = room.StateEvents.Where(x => x!.Type == RoomMemberEventContent.EventId).ToList();
+            //     if (state!.Any(x => x.StateKey == userId)) {
+            //         matches[userId].Add(new() {
+            //             Event = state.First(x => x.StateKey == userId),
+            //             Room = room.Room,
+            //             RoomName = room.RoomName ?? "No name"
+            //         });
+            //     }
+            // }
+
+            log.Add($"Searching for {userId}...");
+            await foreach (var match in GetMatches(userId)) {
+                matches[userId].Add(match);
             }
         }
 
+        log.Add("Done!");
+
         StateHasChanged();
 
         return "";
@@ -135,8 +158,8 @@
     private async Task DoImportFromRoomId() {
         try {
             if (ImportFromRoomId is null) return;
-            var room = rooms.FirstOrDefault(x => x.Room.RoomId == ImportFromRoomId);
-            UserIdString = string.Join("\n", (await room.Room.GetMembersListAsync()).Select(x => x.StateKey));
+            var room = rooms.FirstOrDefault(x => x.RoomId == ImportFromRoomId);
+            UserIdString = string.Join("\n", (await room.GetMembersListAsync()).Select(x => x.StateKey));
         }
         catch (Exception e) {
             Console.WriteLine(e);
@@ -152,4 +175,24 @@
         public string RoomName { get; set; }
     }
 
+    private async IAsyncEnumerable<Match> GetMatches(string userId) {
+        var results = rooms.Select(async room => {
+            var state = await room.GetStateEventOrNullAsync(room.RoomId, userId);
+            if (state is not null) {
+                return new Match {
+                    Room = room,
+                    Event = state,
+                    RoomName = await room.GetNameOrFallbackAsync()
+                };
+            }
+
+            return null;
+        }).ToAsyncEnumerable();
+        await foreach (var result in results) {
+            if (result is not null) {
+                yield return result;
+            }
+        }
+    }
+
 }
\ No newline at end of file