diff options
Diffstat (limited to 'MatrixUtils.Web/Pages/Tools')
-rw-r--r-- | MatrixUtils.Web/Pages/Tools/UserTrace.razor | 143 |
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 |