From c37bcb0e4a878d4f4c0e47988adb8624131c82cd Mon Sep 17 00:00:00 2001 From: TheArcaneBrony Date: Thu, 9 Nov 2023 07:38:33 +0100 Subject: event types --- MatrixRoomUtils.Web/Pages/Dev/DevUtilities.razor | 7 +- MatrixRoomUtils.Web/Pages/HSAdmin/HSAdmin.razor | 22 +- MatrixRoomUtils.Web/Pages/Index.razor | 22 +- MatrixRoomUtils.Web/Pages/LoginPage.razor | 46 ++-- .../ModerationUtilities/UserRoomHistory.razor | 113 ++++++++++ MatrixRoomUtils.Web/Pages/Rooms/Create.razor | 2 +- MatrixRoomUtils.Web/Pages/Rooms/Index.razor | 1 + MatrixRoomUtils.Web/Pages/Rooms/Timeline.razor | 8 +- MatrixRoomUtils.Web/Pages/ServerInfo.razor | 235 +++++++++++++++++++++ .../Pages/Tools/KnownHomeserverList.razor | 124 +++-------- MatrixRoomUtils.Web/Pages/Tools/MediaLocator.razor | 2 +- MatrixRoomUtils.Web/Pages/User/DMManager.razor | 11 +- 12 files changed, 459 insertions(+), 134 deletions(-) create mode 100644 MatrixRoomUtils.Web/Pages/ModerationUtilities/UserRoomHistory.razor create mode 100644 MatrixRoomUtils.Web/Pages/ServerInfo.razor (limited to 'MatrixRoomUtils.Web/Pages') diff --git a/MatrixRoomUtils.Web/Pages/Dev/DevUtilities.razor b/MatrixRoomUtils.Web/Pages/Dev/DevUtilities.razor index 4b2dc4f..94c51b2 100644 --- a/MatrixRoomUtils.Web/Pages/Dev/DevUtilities.razor +++ b/MatrixRoomUtils.Web/Pages/Dev/DevUtilities.razor @@ -16,7 +16,7 @@ else { Room List @foreach (var room in Rooms) { - + } @@ -37,10 +37,11 @@ else { @code { public List Rooms { get; set; } = new(); + public AuthenticatedHomeserverGeneric? hs { get; set; } protected override async Task OnInitializedAsync() { await base.OnInitializedAsync(); - var hs = await MRUStorage.GetCurrentSessionOrNavigate(); + hs = await MRUStorage.GetCurrentSessionOrNavigate(); if (hs == null) return; Rooms = (await hs.GetJoinedRooms()).Select(x => x.RoomId).ToList(); Console.WriteLine("Fetched joined rooms!"); @@ -76,4 +77,4 @@ else { StateHasChanged(); } -} +} \ No newline at end of file diff --git a/MatrixRoomUtils.Web/Pages/HSAdmin/HSAdmin.razor b/MatrixRoomUtils.Web/Pages/HSAdmin/HSAdmin.razor index 59ce70f..c605e7a 100644 --- a/MatrixRoomUtils.Web/Pages/HSAdmin/HSAdmin.razor +++ b/MatrixRoomUtils.Web/Pages/HSAdmin/HSAdmin.razor @@ -1,20 +1,34 @@ @page "/HSAdmin" @using LibMatrix.Homeservers +@using ArcaneLibs.Extensions

Homeserver Admininistration


-

Synapse tools

-
-Query rooms +@if (Homeserver is null) { +

Homeserver is null...

+} +else { + @if (Homeserver is AuthenticatedHomeserverSynapse) { +

Synapse tools

+
+ Query rooms + } + else { +

Homeserver type @Homeserver.GetType().Name does not have any administration tools in MRU.

+

Server info:

+
@ServerVersionResponse?.ToJson(ignoreNull: true)
+ } +} @code { public AuthenticatedHomeserverGeneric? Homeserver { get; set; } + public ServerVersionResponse? ServerVersionResponse { get; set; } protected override async Task OnInitializedAsync() { Homeserver = await MRUStorage.GetCurrentSessionOrNavigate(); if (Homeserver is null) return; + ServerVersionResponse = await Homeserver.GetServerVersionAsync(); await base.OnInitializedAsync(); } - } \ No newline at end of file diff --git a/MatrixRoomUtils.Web/Pages/Index.razor b/MatrixRoomUtils.Web/Pages/Index.razor index 74dd651..804fde3 100644 --- a/MatrixRoomUtils.Web/Pages/Index.razor +++ b/MatrixRoomUtils.Web/Pages/Index.razor @@ -3,6 +3,7 @@ @using LibMatrix @using LibMatrix.Homeservers @using ArcaneLibs.Extensions +@using MatrixRoomUtils.Web.Pages.Dev Index @@ -28,13 +29,18 @@ Small collection of tools to do not-so-everyday things.

@__auth.UserInfo.RoomCount rooms - @__auth.ServerVersion.Server.Name @__auth.ServerVersion.Server.Version + @__auth.ServerVersion.Server.Name @__auth.ServerVersion.Server.Version @if (_auth.Proxy != null) { (proxied via @_auth.Proxy) } else {

Not proxied

} + @if (DEBUG) { +

T=@__auth.Homeserver.GetType().FullName

+

D=@__auth.Homeserver.WhoAmI.DeviceId

+

U=@__auth.Homeserver.WhoAmI.UserId

+ }

@@ -51,10 +57,17 @@ Small collection of tools to do not-so-everyday things. @code { +#if DEBUG + bool DEBUG = true; +#else + bool DEBUG = false; +#endif + private class AuthInfo { public UserAuth UserAuth { get; set; } public UserInfo UserInfo { get; set; } public ServerVersionResponse ServerVersion { get; set; } + public AuthenticatedHomeserverGeneric Homeserver { get; set; } } // private Dictionary _users = new(); @@ -69,7 +82,7 @@ Small collection of tools to do not-so-everyday things. UserInfo userInfo = new(); AuthenticatedHomeserverGeneric hs; try { - hs = await hsProvider.GetAuthenticatedWithToken(token.Homeserver, token.AccessToken); + hs = await hsProvider.GetAuthenticatedWithToken(token.Homeserver, token.AccessToken, token.Proxy); } catch (MatrixException e) { if (e.ErrorCode == "M_UNKNOWN_TOKEN") { @@ -88,7 +101,8 @@ Small collection of tools to do not-so-everyday things. _auth.Add(new() { UserInfo = userInfo, UserAuth = token, - ServerVersion = await hs.GetServerVersionAsync() + ServerVersion = await hs.GetServerVersionAsync(), + Homeserver = hs }); // StateHasChanged(); }); @@ -105,7 +119,7 @@ Small collection of tools to do not-so-everyday things. private async Task RemoveUser(UserAuth auth, bool logout = false) { try { if (logout) { - await (await hsProvider.GetAuthenticatedWithToken(auth.Homeserver, auth.AccessToken)).Logout(); + await (await hsProvider.GetAuthenticatedWithToken(auth.Homeserver, auth.AccessToken, auth.Proxy)).Logout(); } } catch (Exception e) { diff --git a/MatrixRoomUtils.Web/Pages/LoginPage.razor b/MatrixRoomUtils.Web/Pages/LoginPage.razor index 1b466c9..c926a93 100644 --- a/MatrixRoomUtils.Web/Pages/LoginPage.razor +++ b/MatrixRoomUtils.Web/Pages/LoginPage.razor @@ -7,15 +7,15 @@ @@: + --> via - + - +
@@ -34,18 +34,18 @@ @foreach (var record in records) { var r = record; - + - + - + - + - + Remove @@ -59,21 +59,20 @@ @code { - readonly List<(string homeserver, string username, string password, string? proxy)> records = new(); - (string homeserver, string username, string password, string? proxy) newRecordInput = ("", "", "", null); + readonly List records = new(); + private LoginStruct newRecordInput = new(); List? LoggedInSessions { get; set; } = new(); async Task Login() { var loginTasks = records.Select(async record => { - var (homeserver, username, password, proxy) = record; - if (LoggedInSessions.Any(x => x.UserId == $"@{username}:{homeserver}" && x.Proxy == proxy)) return; + if (LoggedInSessions.Any(x => x.UserId == $"@{record.Username}:{record.Homeserver}" && x.Proxy == record.Proxy)) return; try { - var result = new UserAuth(await hsProvider.Login(homeserver, username, password, proxy)) { - Proxy = proxy + var result = new UserAuth(await hsProvider.Login(record.Homeserver, record.Username, record.Password, record.Proxy)) { + Proxy = record.Proxy }; if (result == null) { - Console.WriteLine($"Failed to login to {homeserver} as {username}!"); + Console.WriteLine($"Failed to login to {record.Homeserver} as {record.Username}!"); return; } Console.WriteLine($"Obtained access token for {result.UserId}!"); @@ -82,7 +81,7 @@ LoggedInSessions = await MRUStorage.GetAllTokens(); } catch (Exception e) { - Console.WriteLine($"Failed to login to {homeserver} as {username}!"); + Console.WriteLine($"Failed to login to {record.Homeserver} as {record.Username}!"); Console.WriteLine(e); } StateHasChanged(); @@ -104,14 +103,21 @@ if (parts.Length < 3) continue; string? via = parts.Length > 3 ? parts[3] : null; - records.Add((parts[0], parts[1], parts[2], via)); + records.Add(new() { Homeserver = parts[0], Username = parts[1], Password = parts[2], Proxy = via }); } } private async Task AddRecord() { LoggedInSessions = await MRUStorage.GetAllTokens(); records.Add(newRecordInput); - newRecordInput = ("", "", "", null); + newRecordInput = new(); } -} + private class LoginStruct { + public string? Homeserver { get; set; } = ""; + public string? Username { get; set; } = ""; + public string? Password { get; set; } = ""; + public string? Proxy { get; set; } + } + +} \ No newline at end of file diff --git a/MatrixRoomUtils.Web/Pages/ModerationUtilities/UserRoomHistory.razor b/MatrixRoomUtils.Web/Pages/ModerationUtilities/UserRoomHistory.razor new file mode 100644 index 0000000..02dfe44 --- /dev/null +++ b/MatrixRoomUtils.Web/Pages/ModerationUtilities/UserRoomHistory.razor @@ -0,0 +1,113 @@ +@page "/UserRoomHistory/{UserId}" +@using LibMatrix.Homeservers +@using LibMatrix +@using LibMatrix.EventTypes.Spec.State +@using LibMatrix.RoomTypes +@using ArcaneLibs.Extensions +

UserRoomHistory

+ +Enter mxid: + + +@if (string.IsNullOrWhiteSpace(UserId)) { +

UserId is null!

+} +else { +

Checked @checkedRooms.Count so far...

+ @if (currentHs is not null) { +

Checking rooms from @currentHs.UserId's perspective

+ } + else if (checkedRooms.Count > 1) { +

Done!

+ } + @foreach (var (state, rooms) in matchingStates) { + @state +
+ @foreach (var roomInfo in rooms) { + + } + } +} + +@code { + private string? _userId; + + [Parameter] + public string? UserId { + get => _userId; + set { + _userId = value; + FindMember(value); + } + } + + private List hss = new(); + private AuthenticatedHomeserverGeneric? currentHs { get; set; } + + protected override async Task OnInitializedAsync() { + var hs = await MRUStorage.GetCurrentSessionOrNavigate(); + if (hs is null) return; + var sessions = await MRUStorage.GetAllTokens(); + foreach (var userAuth in sessions) { + var session = await MRUStorage.GetSession(userAuth); + if (session is not null) { + hss.Add(session); + StateHasChanged(); + } + } + + StateHasChanged(); + Console.WriteLine("Rerendered!"); + await base.OnInitializedAsync(); + if (!string.IsNullOrWhiteSpace(UserId)) FindMember(UserId); + } + + public Dictionary> matchingStates = new(); + public List checkedRooms = new(); + private SemaphoreSlim _semaphoreSlim = new(1, 1); + + public async Task FindMember(string mxid) { + await _semaphoreSlim.WaitAsync(); + if (mxid != UserId) { + _semaphoreSlim.Release(); + return; //abort if changed + } + matchingStates.Clear(); + foreach (var homeserver in hss) { + currentHs = homeserver; + var rooms = await homeserver.GetJoinedRooms(); + rooms.RemoveAll(x => checkedRooms.Contains(x.RoomId)); + checkedRooms.AddRange(rooms.Select(x => x.RoomId)); + var tasks = rooms.Select(x => GetMembershipAsync(x, mxid)).ToAsyncEnumerable(); + await foreach (var (room, state) in tasks) { + if (state is null) continue; + if (!matchingStates.ContainsKey(state.Membership)) + matchingStates.Add(state.Membership, new()); + var roomInfo = new RoomInfo() { + Room = room + }; + matchingStates[state.Membership].Add(roomInfo); + roomInfo.StateEvents.Add(new() { + Type = RoomNameEventContent.EventId, + TypedContent = new RoomNameEventContent() { + Name = await room.GetNameOrFallbackAsync(4) + } + }); + StateHasChanged(); + if (mxid != UserId) { + _semaphoreSlim.Release(); + return; //abort if changed + } + } + StateHasChanged(); + } + currentHs = null; + StateHasChanged(); + _semaphoreSlim.Release(); + } + + public async Task<(GenericRoom roomId, RoomMemberEventContent? content)> GetMembershipAsync(GenericRoom room, string mxid) { + return (room, await room.GetStateOrNullAsync(RoomMemberEventContent.EventId, mxid)); + } + +} \ No newline at end of file diff --git a/MatrixRoomUtils.Web/Pages/Rooms/Create.razor b/MatrixRoomUtils.Web/Pages/Rooms/Create.razor index 5823757..08b21dd 100644 --- a/MatrixRoomUtils.Web/Pages/Rooms/Create.razor +++ b/MatrixRoomUtils.Web/Pages/Rooms/Create.razor @@ -88,7 +88,7 @@ Room icon: - +

diff --git a/MatrixRoomUtils.Web/Pages/Rooms/Index.razor b/MatrixRoomUtils.Web/Pages/Rooms/Index.razor index fd32cb3..60f4f62 100644 --- a/MatrixRoomUtils.Web/Pages/Rooms/Index.razor +++ b/MatrixRoomUtils.Web/Pages/Rooms/Index.razor @@ -156,6 +156,7 @@ Status = $"Got {Rooms.Count} rooms so far! {queue.Count} entries in processing queue..."; } RenderContents |= queue.Count == 0; + if (queue.Count > 10) RenderContents = false; await Task.Delay(RenderContents ? 25 : 25); } else { diff --git a/MatrixRoomUtils.Web/Pages/Rooms/Timeline.razor b/MatrixRoomUtils.Web/Pages/Rooms/Timeline.razor index 1f4a923..01bf555 100644 --- a/MatrixRoomUtils.Web/Pages/Rooms/Timeline.razor +++ b/MatrixRoomUtils.Web/Pages/Rooms/Timeline.razor @@ -47,10 +47,14 @@ private StateEventResponse GetProfileEventBefore(StateEventResponse Event) => Events.TakeWhile(x => x != Event).Last(e => e.Type == "m.room.member" && e.StateKey == Event.Sender); private Type ComponentType(StateEvent Event) => Event.TypedContent switch { - RoomMessageEventContent => typeof(TimelineMessageItem), + RoomCanonicalAliasEventContent => typeof(TimelineCanonicalAliasItem), + RoomHistoryVisibilityEventContent => typeof(TimelineHistoryVisibilityItem), + RoomTopicEventContent => typeof(TimelineRoomTopicItem), RoomMemberEventContent => typeof(TimelineMemberItem), + RoomMessageEventContent => typeof(TimelineMessageItem), RoomCreateEventContent => typeof(TimelineRoomCreateItem), + RoomNameEventContent => typeof(TimelineRoomNameItem), _ => typeof(TimelineUnknownItem) - }; + }; } diff --git a/MatrixRoomUtils.Web/Pages/ServerInfo.razor b/MatrixRoomUtils.Web/Pages/ServerInfo.razor new file mode 100644 index 0000000..5b3f1c1 --- /dev/null +++ b/MatrixRoomUtils.Web/Pages/ServerInfo.razor @@ -0,0 +1,235 @@ +@page "/ServerInfo/{Homeserver}" +@using LibMatrix.Homeservers +@using LibMatrix.Responses +@using ArcaneLibs.Extensions +

ServerInfo

+
+@if (ServerVersionResponse is not null) { +

Server version: @ServerVersionResponse.Server.Name @ServerVersionResponse.Server.Version

+
@ServerVersionResponse?.ToJson(ignoreNull: true)
+
+} +@if (ClientVersionsResponse is not null) { +

Client versions:

+
+ JSON data +
@ClientVersionsResponse?.ToJson(ignoreNull: true)
+
+ Spec versions + + + + + + + @foreach (var (version, info) in ClientVersions) { + + + + + + } + + @foreach (var version in ClientVersionsResponse.Versions) { + if (!ClientVersions.ContainsKey(version)) { + + + + + + } + } +
VersionRelease date
@(ClientVersionsResponse.Versions.Contains(version) ? "\u2714" : "\u274c")@info.Name@info.Released
@("\u2714")Unknown version: @version
+ Unstable features + + + + + + + @* @foreach (var (version, info) in ClientVersions) { *@ + @* *@ + @* *@ + @* *@ + @* *@ + @* *@ + @* *@ + @* } *@ + + @foreach (var version in ClientVersionsResponse.UnstableFeatures) { + if (!ClientVersions.ContainsKey(version.Key)) { + + + + + + } + } +
SupportedEnabledName
@("\u2714")@(ClientVersionsResponse.Versions.Contains(version) ? "\u2714" : "\u274c")@info.Released
@("\u2714")@(version.Value ? "\u2714" : "\u274c")@version.Key
+} + + +@code { + + [Parameter] + public string? Homeserver { get; set; } + + public ServerVersionResponse? ServerVersionResponse { get; set; } + public ClientVersionsResponse? ClientVersionsResponse { get; set; } + + protected override async Task OnParametersSetAsync() { + if (Homeserver is not null) { + var rhs = await hsProvider.GetRemoteHomeserver(Homeserver); + ServerVersionResponse = await rhs.GetServerVersionAsync(); + ClientVersionsResponse = await rhs.GetClientVersionsAsync(); + } + base.OnParametersSetAsync(); + } + + private class ClientVersionInfo { + public string Name { get; set; } + public string SpecUrl { get; set; } + public DateTime Released { get; set; } + } + + private Dictionary ClientVersions = new() { + { + "legacy", + new() { + Name = "Legacy: Last draft before formal release of r0.0.0", + Released = DateTime.Parse("2014-07-01 00:00:00 +0000"), + SpecUrl = "https://spec.matrix.org/legacy/legacy/" + } + }, + { + "r0.0.0", + new() { + Name = "r0.0.0: Initial release: media repo, sync v2", + Released = DateTime.Parse("2014-07-01 00:00:00 +0000"), + SpecUrl = "https://spec.matrix.org/legacy/r0.0.0/" + } + }, + { + "r0.0.1", + new() { + Name = "r0.0.1: User-interactive authentication, groups, read receipts, presence", + Released = DateTime.Parse("2014-07-01 00:00:00 +0000"), + SpecUrl = "https://spec.matrix.org/legacy/r0.0.1/" + } + }, + { + "r0.1.0", + new() { + Name = "r0.1.0: Device management, account data, push rules, VoIP", + Released = DateTime.Parse("2014-07-01 00:00:00 +0000"), + SpecUrl = "https://spec.matrix.org/legacy/r0.1.0/" + } + }, + { + "r0.2.0", + new() { + Name = "r0.2.0: Clarifications", + Released = DateTime.Parse("2014-07-01 00:00:00 +0000"), + SpecUrl = "https://spec.matrix.org/legacy/client_server/r0.2.0.html" + } + }, + { + "r0.3.0", + new() { + Name = "r0.3.0: Device management", + Released = DateTime.Parse("2014-07-01 00:00:00 +0000"), + SpecUrl = "https://spec.matrix.org/legacy/client_server/r0.3.0.html" + } + }, + { + "r0.4.0", + new() { + Name = "r0.4.0: Room directory", + Released = DateTime.Parse("2014-07-01 00:00:00 +0000"), + SpecUrl = "https://spec.matrix.org/legacy/r0.4.0/" + } + }, + { + "r0.5.0", + new() { + Name = "r0.5.0: Push rules, VoIP, groups, read receipts, presence", + Released = DateTime.Parse("2014-07-01 00:00:00 +0000"), + SpecUrl = "https://spec.matrix.org/legacy/r0.5.0/" + } + }, + { + "r0.6.0", + new() { + Name = "r0.6.0: Unbinding 3PIDs, clean up bindings from register", + Released = DateTime.Parse("2014-07-01 00:00:00 +0000"), + SpecUrl = "https://spec.matrix.org/legacy/r0.6.0/" + } + }, + { + "r0.6.1", + new(){ + Name = "r0.6.1: Moderation policies, better alias handling", + Released = DateTime.Parse("2014-07-01 00:00:00 +0000"), + SpecUrl = "https://spec.matrix.org/legacy/r0.6.1/" + } + }, + { + "v1.1", + new() { + Name = "v1.1: Key backup, knocking", + Released = DateTime.Parse("2021-11-09 00:00:00 +0000"), + SpecUrl = "https://spec.matrix.org/v1.1/" + } + }, { + "v1.2", + new() { + Name = "v1.2: ", + Released = DateTime.Parse("2022-02-02 00:00:00 +0000"), + SpecUrl = "https://spec.matrix.org/v1.2/" + } + }, { + "v1.3", + new() { + Name = "v1.3: ", + Released = DateTime.Parse("2022-06-15 00:00:00 +0100"), + SpecUrl = "https://spec.matrix.org/v1.3/" + } + }, { + "v1.4", + new() { + Name = "v1.4: ", + Released = DateTime.Parse("2022-09-29 00:00:00 +0100"), + SpecUrl = "https://spec.matrix.org/v1.4/" + } + }, { + "v1.5", + new() { + Name = "v1.5: ", + Released = DateTime.Parse("2022-11-17 08:22:11 -0700"), + SpecUrl = "https://spec.matrix.org/v1.5/" + } + }, { + "v1.6", + new () { + Name = "v1.6: ", + Released = DateTime.Parse("2023-02-14 08:25:40 -0700"), + SpecUrl = "https://spec.matrix.org/v1.6" + } + }, { + "v1.7", + new () { + Name = "v1.7: ", + Released = DateTime.Parse("2023-05-25 09:47:21 -0600"), + SpecUrl = "https://spec.matrix.org/v1.7" + } + }, { + "v1.8", + new () { + Name = "v1.8: Room version 11", + Released = DateTime.Parse("2023-08-23 09:23:53 -0600"), + SpecUrl = "https://spec.matrix.org/v1.8" + } + } + }; + +} \ No newline at end of file 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) { diff --git a/MatrixRoomUtils.Web/Pages/User/DMManager.razor b/MatrixRoomUtils.Web/Pages/User/DMManager.razor index 92e1bc2..f753f18 100644 --- a/MatrixRoomUtils.Web/Pages/User/DMManager.razor +++ b/MatrixRoomUtils.Web/Pages/User/DMManager.razor @@ -40,7 +40,14 @@ var roomList = new List(); DMRooms.Add(await Homeserver.GetProfileAsync(userId), roomList); foreach (var room in rooms) { - roomList.Add(new RoomInfo() { Room = Homeserver.GetRoom(room) }); + var roomInfo = new RoomInfo() { Room = Homeserver.GetRoom(room) }; + roomList.Add(roomInfo); + roomInfo.StateEvents.Add(new() { + Type = RoomNameEventContent.EventId, + TypedContent = new RoomNameEventContent() { + Name = await Homeserver.GetRoom(room).GetNameOrFallbackAsync(4) + } + }); } StateHasChanged(); } @@ -51,6 +58,4 @@ await base.OnInitializedAsync(); } - - } \ No newline at end of file -- cgit 1.5.1