From 222f475dfd662980d5e0b9f27efa951f91604364 Mon Sep 17 00:00:00 2001 From: Rory& Date: Fri, 3 May 2024 19:40:00 +0200 Subject: All kinds of changes --- MatrixUtils.Web/Pages/Tools/UserTrace.razor | 143 ++++++++++++++++++---------- 1 file changed, 93 insertions(+), 50 deletions(-) (limited to 'MatrixUtils.Web/Pages/Tools') 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

User Trace


@@ -17,7 +18,7 @@
Rooms to be searched (@rooms.Count) @foreach (var room in rooms) { - @room.Room.RoomId + @room.RoomId
}
@@ -48,8 +49,11 @@ } @code { + private ObservableCollection log { get; set; } = new(); - List rooms { get; set; } = new(); + + // List rooms { get; set; } = new(); + List rooms { get; set; } = []; Dictionary> 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(); - 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(); + // 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()); - 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 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 -- cgit 1.5.1