diff options
author | Rory& <root@rory.gay> | 2024-05-14 17:49:09 +0200 |
---|---|---|
committer | Rory& <root@rory.gay> | 2024-05-14 17:49:09 +0200 |
commit | 41c5a84dacfd036b8d8f01f72226ac5a519995e3 (patch) | |
tree | a4bfc76541692cbbb0fc18f34463cf31a57440f5 /MatrixUtils.Web/Pages/Tools/Debug | |
parent | Improve the heatmap layout (diff) | |
download | MatrixUtils-41c5a84dacfd036b8d8f01f72226ac5a519995e3.tar.xz |
Organise tools somewhat, set proper icons for nav menu
Diffstat (limited to 'MatrixUtils.Web/Pages/Tools/Debug')
-rw-r--r-- | MatrixUtils.Web/Pages/Tools/Debug/LeaveRoom.razor | 52 | ||||
-rw-r--r-- | MatrixUtils.Web/Pages/Tools/Debug/MediaLocator.razor | 109 | ||||
-rw-r--r-- | MatrixUtils.Web/Pages/Tools/Debug/MigrateRoom.razor | 103 | ||||
-rw-r--r-- | MatrixUtils.Web/Pages/Tools/Debug/SpaceDebug.razor | 114 |
4 files changed, 378 insertions, 0 deletions
diff --git a/MatrixUtils.Web/Pages/Tools/Debug/LeaveRoom.razor b/MatrixUtils.Web/Pages/Tools/Debug/LeaveRoom.razor new file mode 100644 index 0000000..841552e --- /dev/null +++ b/MatrixUtils.Web/Pages/Tools/Debug/LeaveRoom.razor @@ -0,0 +1,52 @@ +@page "/Tools/LeaveRoom" +@using System.Collections.ObjectModel +<h3>Leave room</h3> +<hr/> +<span>Room ID: </span> +<InputText @bind-Value="@RoomId"></InputText> +<br/> +<LinkButton OnClick="@Leave">Leave</LinkButton> +<br/><br/> +@foreach (var line in Log) { + <p>@line</p> +} +@code { + AuthenticatedHomeserverGeneric? hs { get; set; } + ObservableCollection<string> Log { get; set; } = new ObservableCollection<string>(); + [Parameter, SupplyParameterFromQuery(Name = "roomId")] + public string? RoomId { get; set; } + + protected override async Task OnInitializedAsync() { + hs = await RMUStorage.GetCurrentSessionOrNavigate(); + if (hs is null) return; + Log.CollectionChanged += (sender, args) => StateHasChanged(); + + StateHasChanged(); + Console.WriteLine("Rerendered!"); + await base.OnInitializedAsync(); + } + + private async Task Leave() { + if(string.IsNullOrWhiteSpace(RoomId)) return; + var room = hs.GetRoom(RoomId); + Log.Add("Got room object..."); + try { + await room.LeaveAsync(); + Log.Add("Left room!"); + } + catch (Exception e) { + Log.Add(e.ToString()); + } + + try { + await room.ForgetAsync(); + Log.Add("Forgot room!"); + } + catch (Exception e) { + Log.Add(e.ToString()); + } + + Log.Add("Done!"); + } + +} \ No newline at end of file diff --git a/MatrixUtils.Web/Pages/Tools/Debug/MediaLocator.razor b/MatrixUtils.Web/Pages/Tools/Debug/MediaLocator.razor new file mode 100644 index 0000000..6e87926 --- /dev/null +++ b/MatrixUtils.Web/Pages/Tools/Debug/MediaLocator.razor @@ -0,0 +1,109 @@ +@page "/Tools/MediaLocator" +@inject HttpClient Http +<h3>Media locator</h3> +<hr/> + +<b>This is going to expose your IP address to all these homeservers!</b> +<details> + <summary>Checked homeserver list (@homeservers.Count entries)</summary> + <ul> + @foreach (var hs in homeservers) { + <li>@hs</li> + } + </ul> +</details> +<button @onclick="addMoreHomeservers">Add more homeservers</button> +<br/> +<span>MXC URL: </span> +<input type="text" @bind="mxcUrl"/> +<button @onclick="executeSearch">Search</button> + +@if (successResults.Count > 0) { + <h4>Successes</h4> + <ul> + @foreach (var result in successResults) { + <li>@result</li> + } + </ul> +} + +@if (errorResults.Count > 0) { + <h4>Errors</h4> + <ul> + @foreach (var result in errorResults) { + <li>@result</li> + } + </ul> +} + + +@code { + string mxcUrl { get; set; } + readonly List<string> successResults = new(); + readonly List<string> errorResults = new(); + readonly List<string> homeservers = new(); + + protected override async Task OnInitializedAsync() { + await base.OnInitializedAsync(); + homeservers.AddRange(new[] { + "matrix.org", + "feline.support", + "rory.gay", + "the-apothecary.club", + "envs.net", + "projectsegfau.lt" + }); + } + + Task executeSearch() { + var sem = new SemaphoreSlim(128, 128); + homeservers.ForEach(async hs => { + await sem.WaitAsync(); + var httpClient = new HttpClient { BaseAddress = new Uri(hs) }; + httpClient.Timeout = TimeSpan.FromSeconds(5); + var rmu = mxcUrl.Replace("mxc://", $"{hs}/_matrix/media/v3/download/"); + try { + var res = await httpClient.SendAsync(new HttpRequestMessage(HttpMethod.Head, rmu)); + if (res.IsSuccessStatusCode) { + successResults.Add($"{hs}: found - {res.Content.Headers.ContentLength} bytes"); + StateHasChanged(); + return; + } + errorResults.Add($"Error: {hs} - {res.StatusCode}\n" + await res.Content.ReadAsStringAsync()); + } + catch (Exception e) { + errorResults.Add($"Error: {e}"); + } + finally { + sem.Release(); + } + StateHasChanged(); + }); + return Task.CompletedTask; + } + + async Task addMoreHomeservers() { + var res = await Http.GetAsync("/homeservers.txt"); + var content = await res.Content.ReadAsStringAsync(); + homeservers.Clear(); + var lines = content.Split("\n"); + + var sem = new SemaphoreSlim(128, 128); + lines.ToList().ForEach(async line => { + await sem.WaitAsync(); + try { + homeservers.Add((await hsResolver.ResolveHomeserverFromWellKnown(line)).Client); + StateHasChanged(); + } + catch (Exception e) { + Console.WriteLine(e); + } + finally { + sem.Release(); + } + }); + + StateHasChanged(); + } + +} diff --git a/MatrixUtils.Web/Pages/Tools/Debug/MigrateRoom.razor b/MatrixUtils.Web/Pages/Tools/Debug/MigrateRoom.razor new file mode 100644 index 0000000..11d35f1 --- /dev/null +++ b/MatrixUtils.Web/Pages/Tools/Debug/MigrateRoom.razor @@ -0,0 +1,103 @@ +@page "/Tools/MigrateRoom" +@using ArcaneLibs.Extensions +@using LibMatrix +@using LibMatrix.RoomTypes +<h3>Migrate room</h3> +<hr/> +<span>Old room: </span> +<FancyTextBox @bind-Value="@roomId"></FancyTextBox><br/> +<span>New room: </span> +<FancyTextBox @bind-Value="@newRoomId"></FancyTextBox><br/> + +<details> + <summary>Users:</summary> + @foreach (var user in users) { + <p>@user</p> + } +</details> + +<br/> +<LinkButton OnClick="Execute">Execute</LinkButton> +<br/> +@foreach (var line in Enumerable.Reverse(log)) { + <p>@line</p> +} + +@code { + private string _roomId; + private List<string> log { get; set; } = new(); + private List<string> users { get; set; } = new(); + + string roomId { + get => _roomId; + set { + _roomId = value; + TryFetchUsers(); + } + } + + private string newRoomId { get; set; } + + protected override async Task OnInitializedAsync() { + var hs = await RMUStorage.GetCurrentSessionOrNavigate(); + if (hs is null) return; + + StateHasChanged(); + Console.WriteLine("Rerendered!"); + await base.OnInitializedAsync(); + } + + private async Task Execute() { + var hs = await RMUStorage.GetCurrentSessionOrNavigate(); + if (hs is null) return; + var oldRoom = hs.GetRoom(roomId); + var newRoom = hs.GetRoom(newRoomId); + var members = await oldRoom.GetMembersListAsync(); + var tasks = members.Select(x => ExecuteInvite(hs, newRoom, x.StateKey)).ToAsyncEnumerable(); + // var tasks = hss.Select(ExecuteInvite).ToAsyncEnumerable(); + await foreach (var a in tasks) { + if (!string.IsNullOrWhiteSpace(a)) { + log.Add(a); + StateHasChanged(); + } + } + } + + private async Task<string> ExecuteInvite(AuthenticatedHomeserverGeneric hs, GenericRoom newRoom, string mxid) { + try { + var pls = await newRoom.GetPowerLevelsAsync(); + if (pls.GetUserPowerLevel(hs.WhoAmI.UserId) < pls.Invite) return "I do not have permission to send invite in " + newRoom.RoomId; + await newRoom.InviteUserAsync(mxid); + return $"Invited {mxid} to {newRoom.RoomId}"; + } + catch (MatrixException e) { + log.Add($"Failed to invite {mxid} to {newRoom.RoomId}: {e.Message}"); + if (e is { ErrorCode: "M_LIMIT_EXCEEDED" }) { + log.Add($"Retrying after {e.RetryAfterMs}"); + await Task.Delay(e.RetryAfterMs!.Value); + return await ExecuteInvite(hs, newRoom, mxid); + } + + return ""; + } + catch (Exception e) { + return $"Failed to invite {mxid} to {newRoom.RoomId}: {e.Message}"; + } + + StateHasChanged(); + return ""; + } + + private async Task TryFetchUsers() { + try { + var hs = await RMUStorage.GetCurrentSessionOrNavigate(); + if (hs is null) return; + var room = hs.GetRoom(roomId); + var members = await room.GetMembersListAsync(); + users = members.Select(x => x.StateKey).ToList(); + StateHasChanged(); + } + catch { } + } + +} \ No newline at end of file diff --git a/MatrixUtils.Web/Pages/Tools/Debug/SpaceDebug.razor b/MatrixUtils.Web/Pages/Tools/Debug/SpaceDebug.razor new file mode 100644 index 0000000..263879b --- /dev/null +++ b/MatrixUtils.Web/Pages/Tools/Debug/SpaceDebug.razor @@ -0,0 +1,114 @@ +@page "/Tools/SpaceDebug" +@using LibMatrix.Helpers +@using LibMatrix.Utilities +<h3>SpaceDebug</h3> +<hr/> + +<p>@Status</p> + +<b>Has parent:</b> +<br/> + +@foreach (var (roomId, parents) in SpaceParents) { + <p>@roomId's parents</p> + <ul> + @foreach (var parent in parents) { + <li>@parent</li> + } + </ul> +} + +<b>Space children:</b> + +@foreach (var (roomId, children) in SpaceChildren) { + <p>@roomId's children</p> + <ul> + @foreach (var child in children) { + <li>@child</li> + } + </ul> +} + +@code { + private string _status = "Loading..."; + + public string Status { + get => _status; + set { + _status = value; + StateHasChanged(); + } + } + + public Dictionary<string, List<string>> SpaceChildren { get; set; } = new(); + public Dictionary<string, List<string>> SpaceParents { get; set; } = new(); + + protected override async Task OnInitializedAsync() { + Status = "Getting homeserver..."; + var hs = await RMUStorage.GetCurrentSessionOrNavigate(); + if (hs is null) return; + + var syncHelper = new SyncHelper(hs) { + // Filter = new SyncFilter() { + // Presence = new(0), + // Room = new() { + // AccountData = new(limit: 0), + // Ephemeral = new(limit: 0), + // State = new(limit: 1000, types: new() { "m.space.child", "m.space.parent" }), + // Timeline = new(limit: 0) + // }, + // AccountData = new(limit: 0) + // } + NamedFilterName = CommonSyncFilters.GetSpaceRelations + }; + + Status = "Syncing..."; + + var syncs = syncHelper.EnumerateSyncAsync(); + await foreach (var sync in syncs) { + if (sync is null) { + Status = "Sync failed"; + continue; + } + + if (sync.Rooms is null) { + Status = "No rooms in sync..."; + break; + } + + if (sync.Rooms.Join is null) { + Status = "No joined rooms in sync..."; + break; + } + + if (sync.Rooms.Join.Count == 0) { + Status = "Joined rooms list was empty..."; + break; + } + + // nextBatch = sync.NextBatch; + foreach (var (roomId, data) in sync.Rooms!.Join!) { + data.State?.Events?.ForEach(e => { + if (e.Type == "m.space.child") { + if (!SpaceChildren.ContainsKey(roomId)) SpaceChildren[roomId] = new(); + if (e.RawContent is null) e.StateKey += " (null)"; + else if (e.RawContent.Count == 0) e.StateKey += " (empty)"; + SpaceChildren[roomId].Add(e.StateKey); + } + if (e.Type == "m.space.parent") { + if (!SpaceParents.ContainsKey(roomId)) SpaceParents[roomId] = new(); + if (e.RawContent is null) e.StateKey += " (null)"; + else if (e.RawContent.Count == 0) e.StateKey += " (empty)"; + SpaceParents[roomId].Add(e.StateKey); + } + }); + } + Status = $"Synced {sync.Rooms.Join.Count} rooms, found {SpaceChildren.Count} spaces, {SpaceParents.Count} parents"; + } + Status = $"Synced: found {SpaceChildren.Count}->{SpaceChildren.Sum(x => x.Value.Count)} spaces, {SpaceParents.Count}->{SpaceParents.Sum(x => x.Value.Count)} parents!"; + + await base.OnInitializedAsync(); + } + + +} |