From c37bcb0e4a878d4f4c0e47988adb8624131c82cd Mon Sep 17 00:00:00 2001 From: TheArcaneBrony Date: Thu, 9 Nov 2023 07:38:33 +0100 Subject: event types --- .../Pages/Tools/KnownHomeserverList.razor | 124 +++++---------------- MatrixRoomUtils.Web/Pages/Tools/MediaLocator.razor | 2 +- 2 files changed, 29 insertions(+), 97 deletions(-) (limited to 'MatrixRoomUtils.Web/Pages/Tools') diff --git a/MatrixRoomUtils.Web/Pages/Tools/KnownHomeserverList.razor b/MatrixRoomUtils.Web/Pages/Tools/KnownHomeserverList.razor index 0ab0bd2..dbf2f5f 100644 --- a/MatrixRoomUtils.Web/Pages/Tools/KnownHomeserverList.razor +++ b/MatrixRoomUtils.Web/Pages/Tools/KnownHomeserverList.razor @@ -7,51 +7,43 @@
@if (!IsFinished) { -

Loading... Please wait...

- -

@QueryProgress.ProcessedRooms / @QueryProgress.TotalRooms

- @foreach (var (room, state) in QueryProgress.ProcessedUsers.Where(x => !x.Value.IsFinished).OrderByDescending(x => x.Value.Total).ToList()) { - @if (state.Blocked) { -

🔒 @room.RoomId - @state.Processed / @state.Total, @state.Timing.Elapsed elapsed...

- } - else if (state.Slowmode) { -

🐢 @room.RoomId - @state.Processed / @state.Total, @state.Timing.Elapsed elapsed...

- } - else { -

@room.RoomId - @state.Processed / @state.Total, @state.Timing.Elapsed elapsed...

- } - - } +

+ Loading... +

} -else { - @foreach (var server in Homeservers.OrderByDescending(x => x.KnownUserCount).ThenBy(x => x.Server).ToList()) { -

@server.Server - @server.KnownUserCount

- } + +@foreach (var (homeserver, members) in counts.OrderByDescending(x => x.Value)) { +

@homeserver - @members

}
@code { - List Homeservers = new(); + Dictionary> homeservers { get; set; } = new(); + Dictionary counts { get; set; } = new(); + // List Homeservers = new(); bool IsFinished { get; set; } - HomeserverInfoQueryProgress QueryProgress { get; set; } = new(); - AuthenticatedHomeserverGeneric hs { get; set; } + // HomeserverInfoQueryProgress QueryProgress { get; set; } = new(); + AuthenticatedHomeserverGeneric? hs { get; set; } + protected override async Task OnInitializedAsync() { hs = await MRUStorage.GetCurrentSessionOrNavigate(); if (hs is null) return; - var sw = Stopwatch.StartNew(); - Homeservers = await GetHomeservers(progressCallback: async progress => { - if (sw.ElapsedMilliseconds > 1000) { - Console.WriteLine("Progress updated..."); - QueryProgress = progress; - StateHasChanged(); - Console.WriteLine("Progress rendered!"); - sw.Restart(); - await Task.Delay(100); - return true; + var fetchTasks = (await hs.GetJoinedRooms()).Select(x=>x.GetMembersByHomeserverAsync()).ToAsyncEnumerable(); + await foreach (var result in fetchTasks) { + foreach (var (resHomeserver, resMembers) in result) { + if (!homeservers.TryAdd(resHomeserver, resMembers)) { + homeservers[resHomeserver].AddRange(resMembers); + } + counts[resHomeserver] = homeservers[resHomeserver].Count; } - Console.WriteLine($"Progress updated, but not rendering because only {sw.ElapsedMilliseconds}ms elapsed since last call..."); - return false; - }); + // StateHasChanged(); + // await Task.Delay(250); + } + + foreach (var resHomeserver in homeservers.Keys) { + homeservers[resHomeserver] = homeservers[resHomeserver].Distinct().ToList(); + counts[resHomeserver] = homeservers[resHomeserver].Count; + } IsFinished = true; StateHasChanged(); @@ -59,64 +51,4 @@ else { await base.OnInitializedAsync(); } - private async Task> GetHomeservers(int memberLimit = 1000, Func>? progressCallback = null) { - HomeserverInfoQueryProgress progress = new(); - List homeServers = new(); - - var rooms = await hs.GetJoinedRooms(); - progress.TotalRooms = rooms.Count; - - var semaphore = new SemaphoreSlim(4); - var tasks = rooms.Select(async room => { - await semaphore.WaitAsync(); - progress.ProcessedUsers.Add(room, new HomeserverInfoQueryProgress.State()); - Console.WriteLine($"Fetching states for room ({rooms.IndexOf(room)}/{rooms.Count}) ({room.RoomId})"); - var states = room.GetMembersAsync(); - await foreach (var state in states) { - if (state.Type is not "m.room.member") continue; - progress.ProcessedUsers[room].Total++; - - if (homeServers.Any(x => x.Server == state.StateKey.Split(':')[1])) continue; - homeServers.Add(new HomeserverInfo { Server = state.StateKey.Split(':')[1] }); - Console.WriteLine($"Added new homeserver {state.StateKey.Split(':')[1]}"); - } - semaphore.Release(); - progress.ProcessedUsers[room].IsFinished = true; - progress.ProcessedRooms++; - if (progressCallback is not null) - await progressCallback.Invoke(progress); - }); - // var results = tasks.ToAsyncEnumerable(); - await Task.WhenAll(tasks); - - Console.WriteLine("Calculating member counts..."); - homeServers.ForEach(x => x.KnownUserCount = x.KnownUsers.Count); - Console.WriteLine(homeServers.First(x => x.Server == "rory.gay").ToJson()); - Console.WriteLine("Recalculated!"); - return homeServers; - } - - class HomeserverInfo { - public string Server { get; set; } - public int? KnownUserCount { get; set; } - public List KnownUsers { get; } = new(); - } - - class HomeserverInfoQueryProgress { - public int ProcessedRooms { get; set; } - public int TotalRooms { get; set; } - public Dictionary ProcessedUsers { get; } = new(); - public List CurrentState { get; set; } = new(); - - public class State { - public int Processed { get; set; } - public int Total { get; set; } - public bool Blocked { get; set; } - public bool Slowmode { get; set; } - public float Progress => (float)Processed / Total; - public bool IsFinished { get; set; } - public Stopwatch Timing { get; } = Stopwatch.StartNew(); - } - } - -} +} \ No newline at end of file diff --git a/MatrixRoomUtils.Web/Pages/Tools/MediaLocator.razor b/MatrixRoomUtils.Web/Pages/Tools/MediaLocator.razor index 59ec79e..20aa639 100644 --- a/MatrixRoomUtils.Web/Pages/Tools/MediaLocator.razor +++ b/MatrixRoomUtils.Web/Pages/Tools/MediaLocator.razor @@ -94,7 +94,7 @@ lines.ToList().ForEach(async line => { await sem.WaitAsync(); try { - homeservers.Add((await hsResolver.ResolveHomeserverFromWellKnown(line)).client); + homeservers.Add((await hsResolver.ResolveHomeserverFromWellKnown(line)).Client); StateHasChanged(); } catch (Exception e) { -- cgit 1.5.1