From 3ef3e5caa65458e595e2303358322626c7da1dda Mon Sep 17 00:00:00 2001 From: TheArcaneBrony Date: Tue, 23 May 2023 08:51:02 +0200 Subject: Add numerous new things --- MatrixRoomUtils.Web/Pages/About.razor | 1 - MatrixRoomUtils.Web/Pages/DevOptions.razor | 57 +++++++++- MatrixRoomUtils.Web/Pages/HSAdmin/HSAdmin.razor | 7 ++ .../Pages/KnownHomeserverList.razor | 79 ++++++++++++++ MatrixRoomUtils.Web/Pages/MediaLocator.razor | 119 ++++++++++++++++++--- .../Pages/PolicyList/PolicyListEditorPage.razor | 3 +- .../Pages/PolicyList/PolicyListRoomList.razor | 13 +-- MatrixRoomUtils.Web/Pages/RoomManager.razor | 40 ------- .../Pages/RoomManager/RoomManager.razor | 96 +++++++++++++++++ .../Pages/RoomManager/RoomManagerSpace.razor | 77 +++++++++++++ 10 files changed, 429 insertions(+), 63 deletions(-) create mode 100644 MatrixRoomUtils.Web/Pages/HSAdmin/HSAdmin.razor create mode 100644 MatrixRoomUtils.Web/Pages/KnownHomeserverList.razor delete mode 100644 MatrixRoomUtils.Web/Pages/RoomManager.razor create mode 100644 MatrixRoomUtils.Web/Pages/RoomManager/RoomManager.razor create mode 100644 MatrixRoomUtils.Web/Pages/RoomManager/RoomManagerSpace.razor (limited to 'MatrixRoomUtils.Web/Pages') diff --git a/MatrixRoomUtils.Web/Pages/About.razor b/MatrixRoomUtils.Web/Pages/About.razor index fc9128e..d47e60b 100644 --- a/MatrixRoomUtils.Web/Pages/About.razor +++ b/MatrixRoomUtils.Web/Pages/About.razor @@ -1,5 +1,4 @@ @page "/About" -@using MatrixRoomUtils.Web.Shared.IndexComponents @using System.Net @inject NavigationManager NavigationManager @inject ILocalStorageService LocalStorage diff --git a/MatrixRoomUtils.Web/Pages/DevOptions.razor b/MatrixRoomUtils.Web/Pages/DevOptions.razor index 0cc38d8..e1b6ac0 100644 --- a/MatrixRoomUtils.Web/Pages/DevOptions.razor +++ b/MatrixRoomUtils.Web/Pages/DevOptions.razor @@ -1,6 +1,4 @@ @page "/DevOptions" -@using MatrixRoomUtils.Web.Shared.IndexComponents -@using System.Net @using MatrixRoomUtils.Core.Extensions @inject NavigationManager NavigationManager @inject ILocalStorageService LocalStorage @@ -10,8 +8,32 @@

Rory&::MatrixUtils - Developer options


- +
+
+
+ + +
+
+ View caches +

Generic cache:

+ +
@code { protected override async Task OnInitializedAsync() @@ -19,6 +41,14 @@ await LocalStorageWrapper.LoadFromLocalStorage(LocalStorage); await base.OnInitializedAsync(); await LocalStorageWrapper.SaveToLocalStorage(LocalStorage); + Task.Run(async () => + { + while (true) + { + await Task.Delay(100); + StateHasChanged(); + } + }); } protected async Task LogStuff() @@ -29,4 +59,25 @@ await LocalStorageWrapper.SaveToLocalStorage(LocalStorage); } + protected async Task DropCaches() + { + RuntimeCache.GenericResponseCache.Clear(); + RuntimeCache.HomeserverResolutionCache.Clear(); + await LocalStorageWrapper.SaveToLocalStorage(LocalStorage); + } + + protected async Task RandomiseCacheTimers() + { + foreach (var keyValuePair in RuntimeCache.GenericResponseCache) + { + Console.WriteLine($"Randomising cache timer for {keyValuePair.Key}"); + foreach (var cacheItem in keyValuePair.Value.Cache) + { + cacheItem.Value.ExpiryTime = DateTime.Now.AddSeconds(Random.Shared.Next(15, 120)); + } + + await LocalStorageWrapper.SaveToLocalStorage(LocalStorage); + } + } + } \ No newline at end of file diff --git a/MatrixRoomUtils.Web/Pages/HSAdmin/HSAdmin.razor b/MatrixRoomUtils.Web/Pages/HSAdmin/HSAdmin.razor new file mode 100644 index 0000000..b77012b --- /dev/null +++ b/MatrixRoomUtils.Web/Pages/HSAdmin/HSAdmin.razor @@ -0,0 +1,7 @@ +@page "/HSAdmin" +

Homeserver Admininistration

+
+ +@code { + +} \ No newline at end of file diff --git a/MatrixRoomUtils.Web/Pages/KnownHomeserverList.razor b/MatrixRoomUtils.Web/Pages/KnownHomeserverList.razor new file mode 100644 index 0000000..f396025 --- /dev/null +++ b/MatrixRoomUtils.Web/Pages/KnownHomeserverList.razor @@ -0,0 +1,79 @@ +@page "/KnownHomeserverList" +@using System.Text.Json +@using MatrixRoomUtils.Core.Extensions +

Known Homeserver List

+
+ +@if (!IsFinished) +{ +

Loading... Please wait...

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

@server.Server - @server.KnownUserCount

+ } +} +
+ +@code { + List HomeServers = new(); + bool IsFinished { get; set; } + + protected override async Task OnInitializedAsync() + { + await LocalStorageWrapper.LoadFromLocalStorage(LocalStorage); + + HomeServers = await GetHomeservers(); + + IsFinished = true; + StateHasChanged(); + Console.WriteLine("Rerendered!"); + await base.OnInitializedAsync(); + } + + + private async Task> GetHomeservers() + { + List homeServers = new(); + var rooms = await RuntimeCache.CurrentHomeServer.GetJoinedRooms(); + // Dictionary roomMembers = new(); + //start a task for each room + var tasks = rooms.Select(async room => + { + Console.WriteLine($"Fetching states for room ({rooms.IndexOf(room)}/{rooms.Count}) ({room.RoomId})"); + StateHasChanged(); + + var states = (await room.GetStateAsync("")).Value.Deserialize>(); + states.RemoveAll(x => x.type != "m.room.member"); + Console.WriteLine($"Room {room.RoomId} has {states.Count} members"); + foreach (var state in states) + { + if (!homeServers.Any(x => x.Server == state.state_key.Split(':')[1])) + { + homeServers.Add(new HomeServerInfo() { Server = state.state_key.Split(':')[1] }); + } + var hs = homeServers.First(x => x.Server == state.state_key.Split(':')[1]); + if(!hs.KnownUsers.Contains(state.state_key.Split(':')[0])) + hs.KnownUsers.Add(state.state_key.Split(':')[0]); + } + Console.WriteLine("Collected states!"); + }); + 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; set; } = new(); + } + +} \ No newline at end of file diff --git a/MatrixRoomUtils.Web/Pages/MediaLocator.razor b/MatrixRoomUtils.Web/Pages/MediaLocator.razor index cd244ef..06256f0 100644 --- a/MatrixRoomUtils.Web/Pages/MediaLocator.razor +++ b/MatrixRoomUtils.Web/Pages/MediaLocator.razor @@ -1,11 +1,46 @@ @page "/MediaLocator" -

MediaLocator

+@inject HttpClient Http +

Media locator


+This is going to expose your IP address to all these homeservers! +
+ Checked homeserver list (@homeservers.Count entries) +
    + @foreach (var hs in homeservers) + { +
  • @hs
  • + } +
+
+ +
MXC URL: +@if (successResults.Count > 0) +{ +

Successes

+
    + @foreach (var result in successResults) + { +
  • @result
  • + } +
+} + +@if (errorResults.Count > 0) +{ +

Errors

+
    + @foreach (var result in errorResults) + { +
  • @result
  • + } +
+} + @code { string mxcUrl { get; set; } @@ -15,22 +50,82 @@ protected override async Task OnInitializedAsync() { - base.OnInitializedAsync(); - + await base.OnInitializedAsync(); + homeservers.AddRange(new [] + { + "matrix.org", + "feline.support", + "rory.gay", + "the-apothecary.club", + "envs.net", + "projectsegfau.lt" + }); } async Task executeSearch() { - var client = new HttpClient(); - var response = await client.GetAsync($"https://matrix.org/_matrix/media/r0/identicon/{mxcUrl}"); - if (response.IsSuccessStatusCode) + var sem = new SemaphoreSlim(128, 128); + homeservers.ForEach(async hs => { - successResults.Add(mxcUrl); - } - else - { - errorResults.Add(mxcUrl); - } + await sem.WaitAsync(); + var httpClient = new HttpClient { BaseAddress = new Uri(hs) }; + httpClient.Timeout = TimeSpan.FromSeconds(5); + var rmu = mxcUrl.Replace("mxc://", $"{hs}/_matrix/media/r0/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(); + }); } + + async Task addMoreHomeservers() + { + await LocalStorageWrapper.LoadFromLocalStorage(LocalStorage); + var res = await Http.GetAsync("/homeservers.txt"); + var content = await res.Content.ReadAsStringAsync(); + homeservers.Clear(); + var lines = content.Split("\n"); + + var rhs = new RemoteHomeServer("rory.gay"); + var sem = new SemaphoreSlim(128, 128); + lines.ToList().ForEach(async line => + { + await sem.WaitAsync(); + try + { + homeservers.Add(await rhs.ResolveHomeserverFromWellKnown(line)); + StateHasChanged(); + if(Random.Shared.Next(0,101) == 50) + await LocalStorageWrapper.SaveToLocalStorage(LocalStorage); + } + catch (Exception e) + { + Console.WriteLine(e); + } + finally + { + sem.Release(); + } + }); + + + StateHasChanged(); + } } \ No newline at end of file diff --git a/MatrixRoomUtils.Web/Pages/PolicyList/PolicyListEditorPage.razor b/MatrixRoomUtils.Web/Pages/PolicyList/PolicyListEditorPage.razor index 5dfb2d6..d0f9b87 100644 --- a/MatrixRoomUtils.Web/Pages/PolicyList/PolicyListEditorPage.razor +++ b/MatrixRoomUtils.Web/Pages/PolicyList/PolicyListEditorPage.razor @@ -41,7 +41,8 @@ else @policyEvent.content.ExpiryDateTime - + + @* *@ } diff --git a/MatrixRoomUtils.Web/Pages/PolicyList/PolicyListRoomList.razor b/MatrixRoomUtils.Web/Pages/PolicyList/PolicyListRoomList.razor index e9d1be4..f25fbae 100644 --- a/MatrixRoomUtils.Web/Pages/PolicyList/PolicyListRoomList.razor +++ b/MatrixRoomUtils.Web/Pages/PolicyList/PolicyListRoomList.razor @@ -19,8 +19,13 @@ else } foreach (var s in PolicyRoomList) { - [@s.Shortcode] @s.Name (@s.RoomId) -
+ + +
+ Shortcode: @s.Shortcode +
+ @* [@s.Shortcode] @s.Name (@s.RoomId) *@ + @*
*@ } } @@ -74,15 +79,11 @@ else { try { - //TODO: refactor!!!!! await semaphore.WaitAsync(); PolicyRoomInfo roomInfo = new() { RoomId = room }; - - - // --- // var r = await RuntimeCache.CurrentHomeServer.GetRoom(room); var shortcodeState = await r.GetStateAsync("org.matrix.mjolnir.shortcode"); if(!shortcodeState.HasValue) return null; diff --git a/MatrixRoomUtils.Web/Pages/RoomManager.razor b/MatrixRoomUtils.Web/Pages/RoomManager.razor deleted file mode 100644 index deb6fd5..0000000 --- a/MatrixRoomUtils.Web/Pages/RoomManager.razor +++ /dev/null @@ -1,40 +0,0 @@ -@page "/RoomManager" -@inject ILocalStorageService LocalStorage -@inject NavigationManager NavigationManager -

Room manager

-
-@if (Rooms.Count == 0) -{ -

You are not in any rooms!

- @*

Loading progress: @checkedRoomCount/@totalRoomCount

*@ -} -else -{ -
- Room List - @foreach (var room in Rooms) - { - - } -
- -} - -
- - -@code { - public List Rooms { get; set; } = new(); - protected override async Task OnInitializedAsync() - { - if (!RuntimeCache.WasLoaded) await LocalStorageWrapper.LoadFromLocalStorage(LocalStorage); - await base.OnInitializedAsync(); - if (RuntimeCache.CurrentHomeServer == null) - { - NavigationManager.NavigateTo("/Login"); - return; - } - Rooms = (await RuntimeCache.CurrentHomeServer.GetJoinedRooms()).Select(x=>x.RoomId).ToList(); - Console.WriteLine("Fetched joined rooms!"); - } -} \ No newline at end of file diff --git a/MatrixRoomUtils.Web/Pages/RoomManager/RoomManager.razor b/MatrixRoomUtils.Web/Pages/RoomManager/RoomManager.razor new file mode 100644 index 0000000..6d27679 --- /dev/null +++ b/MatrixRoomUtils.Web/Pages/RoomManager/RoomManager.razor @@ -0,0 +1,96 @@ +@page "/RoomManager" +@inject ILocalStorageService LocalStorage +@inject NavigationManager NavigationManager +

Room manager

+
+@if (Rooms.Count == 0) +{ +

You are not in any rooms!

+ @*

Loading progress: @checkedRoomCount/@totalRoomCount

*@ +} +else +{ +

You are in @Rooms.Count rooms and @Spaces.Count spaces

+
+ Space List + @foreach (var room in Spaces) + { + + } +
+
+ Room List + @foreach (var room in Rooms) + { + + } +
+ +} + +
+ + +@code { + public List Rooms { get; set; } = new(); + public List Spaces { get; set; } = new(); + protected override async Task OnInitializedAsync() + { + if (!RuntimeCache.WasLoaded) await LocalStorageWrapper.LoadFromLocalStorage(LocalStorage); + await base.OnInitializedAsync(); + if (RuntimeCache.CurrentHomeServer == null) + { + NavigationManager.NavigateTo("/Login"); + return; + } + Rooms = await RuntimeCache.CurrentHomeServer.GetJoinedRooms(); + StateHasChanged(); + var semaphore = new SemaphoreSlim(1000); + var tasks = new List>(); + foreach (var room in Rooms) + { + tasks.Add(CheckIfSpace(room, semaphore)); + } + await Task.WhenAll(tasks); + + Console.WriteLine("Fetched joined rooms!"); + } + + private async Task CheckIfSpace(Room room, SemaphoreSlim semaphore) + { + await semaphore.WaitAsync(); + try + { + var state = await room.GetStateAsync("m.room.create"); + if (state != null) + { + //Console.WriteLine(state.Value.ToJson()); + if(state.Value.TryGetProperty("type", out var type)) + { + if(type.ToString() == "m.space") + { + Spaces.Add(room); + Rooms.Remove(room); + StateHasChanged(); + return room; + } + } + else + { + //this is fine, apprently... + //Console.WriteLine($"Room {room.RoomId} has no content.type in m.room.create!"); + } + } + } + catch (Exception e) + { + Console.WriteLine(e); + return null; + } + finally + { + semaphore.Release(); + } + return null; + } +} \ No newline at end of file diff --git a/MatrixRoomUtils.Web/Pages/RoomManager/RoomManagerSpace.razor b/MatrixRoomUtils.Web/Pages/RoomManager/RoomManagerSpace.razor new file mode 100644 index 0000000..4a5bddf --- /dev/null +++ b/MatrixRoomUtils.Web/Pages/RoomManager/RoomManagerSpace.razor @@ -0,0 +1,77 @@ +@page "/RoomManager/Space/{RoomId}" +@using MatrixRoomUtils.Core.Extensions +@using System.Text.Json +

Room manager - Viewing Space

+ + +@foreach (var room in Rooms) +{ + +} + + +
+
+ State list + @foreach (var stateEvent in States.OrderBy(x => x.state_key).ThenBy(x => x.type)) + { +

@stateEvent.state_key/@stateEvent.type:

+
@stateEvent.content.ToJson()
+ } +
+ +@code { + + [Parameter] + public string RoomId { get; set; } = "invalid!!!!!!"; + + private Room? Room { get; set; } + + private StateEvent[] States { get; set; } = Array.Empty>(); + private List Rooms { get; set; } = new(); + + protected override async Task OnInitializedAsync() + { + await LocalStorageWrapper.LoadFromLocalStorage(LocalStorage); + Room = await RuntimeCache.CurrentHomeServer.GetRoom(RoomId.Replace('~', '.')); + var state = await Room.GetStateAsync(""); + if (state != null) + { + Console.WriteLine(state.Value.ToJson()); + States = state.Value.Deserialize[]>()!; + + foreach (var stateEvent in States) + { + if (stateEvent.type == "m.space.child") + { + // if (stateEvent.content.ToJson().Length < 5) return; + var roomId = stateEvent.state_key; + var room = await RuntimeCache.CurrentHomeServer.GetRoom(roomId); + if (room != null) + { + Rooms.Add(room); + } + } + } + + // if(state.Value.TryGetProperty("type", out var type)) + // { + // } + // else + // { + // //this is fine, apprently... + // //Console.WriteLine($"Room {room.RoomId} has no content.type in m.room.create!"); + // } + } + await base.OnInitializedAsync(); + } + + private async Task JoinAllRooms() + { + foreach (var room in Rooms) + { + room.JoinAsync(); + } + } + +} \ No newline at end of file -- cgit 1.5.1