diff --git a/MatrixRoomUtils.Web/Pages/About.razor b/MatrixRoomUtils.Web/Pages/About.razor
index d47e60b..cf43c4f 100644
--- a/MatrixRoomUtils.Web/Pages/About.razor
+++ b/MatrixRoomUtils.Web/Pages/About.razor
@@ -13,26 +13,23 @@
<br/><br/>
<p>You can find the source code on <a href="https://git.rory.gay/MatrixRoomUtils.git/">my git server</a>.<br/></p>
<p>You can also join the <a href="https://matrix.to/#/%23mru%3Arory.gay?via=rory.gay&via=matrix.org&via=feline.support">Matrix room</a> for this project.</p>
-@if (showBinDownload)
-{
+@if (showBinDownload) {
<p>This deployment also serves a copy of the compiled, hosting-ready binaries at <a href="MRU-BIN.tar.xz">/MRU-BIN.tar.xz</a>!</p>
}
-@if (showSrcDownload)
-{
+@if (showSrcDownload) {
<p>This deployment also serves a copy of the compiled, hosting-ready binaries at <a href="MRU-SRC.tar.xz">/MRU-SRC.tar.xz</a>!</p>
}
@code {
- private bool showBinDownload { get; set; } = false;
- private bool showSrcDownload { get; set; } = false;
+ private bool showBinDownload { get; set; }
+ private bool showSrcDownload { get; set; }
- protected override async Task OnInitializedAsync()
- {
+ protected override async Task OnInitializedAsync() {
using var hc = new HttpClient();
- var hr = await hc.SendAsync(new(HttpMethod.Head, NavigationManager.ToAbsoluteUri("/MRU-BIN.tar.xz").AbsoluteUri));
+ var hr = await hc.SendAsync(new HttpRequestMessage(HttpMethod.Head, NavigationManager.ToAbsoluteUri("/MRU-BIN.tar.xz").AbsoluteUri));
showBinDownload = hr.StatusCode == HttpStatusCode.OK;
- hr = await hc.SendAsync(new(HttpMethod.Head, NavigationManager.ToAbsoluteUri("/MRU-SRC.tar.xz").AbsoluteUri));
+ hr = await hc.SendAsync(new HttpRequestMessage(HttpMethod.Head, NavigationManager.ToAbsoluteUri("/MRU-SRC.tar.xz").AbsoluteUri));
showSrcDownload = hr.StatusCode == HttpStatusCode.OK;
await base.OnInitializedAsync();
}
diff --git a/MatrixRoomUtils.Web/Pages/DataExportPage.razor b/MatrixRoomUtils.Web/Pages/DataExportPage.razor
index 49fb700..732cd74 100644
--- a/MatrixRoomUtils.Web/Pages/DataExportPage.razor
+++ b/MatrixRoomUtils.Web/Pages/DataExportPage.razor
@@ -1,5 +1,4 @@
@page "/Export"
-@using MatrixRoomUtils.Web.Shared.IndexComponents
@using System.Text.Json
@inject NavigationManager NavigationManager
@inject ILocalStorageService LocalStorage
@@ -11,12 +10,10 @@
<br/><br/>
<h5>Signed in accounts - <a href="/Login">Add new account</a> or <a href="/ImportUsers">Import from TSV</a></h5>
<hr/>
-@if (_isLoaded)
-{
-@foreach (var (token, user) in RuntimeCache.LoginSessions)
-{
+@if (_isLoaded) {
+ @foreach (var (token, user) in RuntimeCache.LoginSessions) {
@* <IndexUserItem User="@user"/> *@
- <pre>
+ <pre>
@user.LoginResponse.UserId[1..].Split(":")[0]\auth\access_token=@token
@user.LoginResponse.UserId[1..].Split(":")[0]\auth\device_id=@user.LoginResponse.DeviceId
@user.LoginResponse.UserId[1..].Split(":")[0]\auth\home_server=@(RuntimeCache.HomeserverResolutionCache.ContainsKey(user.LoginResponse.HomeServer) ? RuntimeCache.HomeserverResolutionCache[user.LoginResponse.HomeServer].Result : "loading...")
@@ -26,10 +23,9 @@
@user.LoginResponse.UserId[1..].Split(":")[0]\user\online_key_backup=true
@user.LoginResponse.UserId[1..].Split(":")[0]\user\only_share_keys_with_verified_users=false
</pre>
+ }
}
-}
-else
-{
+else {
<p>Loading...</p>
<p>@resolvedHomeservers/@totalHomeservers homeservers resolved...</p>
}
@@ -39,31 +35,26 @@ else
private int resolvedHomeservers;
private int totalHomeservers;
- protected override async Task OnInitializedAsync()
- {
+ protected override async Task OnInitializedAsync() {
await base.OnInitializedAsync();
- if (!RuntimeCache.WasLoaded)
- {
+ if (!RuntimeCache.WasLoaded) {
await LocalStorageWrapper.LoadFromLocalStorage(LocalStorage);
}
var homeservers = RuntimeCache.LoginSessions.Values.Select(x => x.LoginResponse.HomeServer).Distinct();
totalHomeservers = homeservers.Count();
StateHasChanged();
- foreach (var hs in homeservers)
- {
- if (RuntimeCache.HomeserverResolutionCache.ContainsKey(hs))
- {
+ foreach (var hs in homeservers) {
+ if (RuntimeCache.HomeserverResolutionCache.ContainsKey(hs)) {
resolvedHomeservers++;
continue;
}
var resolvedHomeserver = (await new RemoteHomeServer(hs).Configure()).FullHomeServerDomain;
- RuntimeCache.HomeserverResolutionCache.Add(hs, new() { Result = resolvedHomeserver, ResolutionTime = DateTime.Now });
+ RuntimeCache.HomeserverResolutionCache.Add(hs, new HomeServerResolutionResult { Result = resolvedHomeserver, ResolutionTime = DateTime.Now });
await LocalStorageWrapper.SaveCacheToLocalStorage(LocalStorage);
Console.WriteLine("Saved to local storage:");
- Console.WriteLine(JsonSerializer.Serialize(RuntimeCache.HomeserverResolutionCache, new JsonSerializerOptions()
- {
+ Console.WriteLine(JsonSerializer.Serialize(RuntimeCache.HomeserverResolutionCache, new JsonSerializerOptions {
WriteIndented = true
}));
resolvedHomeservers++;
diff --git a/MatrixRoomUtils.Web/Pages/DebugTools.razor b/MatrixRoomUtils.Web/Pages/DebugTools.razor
index c8fabaa..da5c172 100644
--- a/MatrixRoomUtils.Web/Pages/DebugTools.razor
+++ b/MatrixRoomUtils.Web/Pages/DebugTools.razor
@@ -1,26 +1,24 @@
@page "/Debug"
-@using MatrixRoomUtils.Core.Interfaces
-@using MatrixRoomUtils.Core.Extensions
@using System.Reflection
+@using MatrixRoomUtils.Core.Extensions
+@using MatrixRoomUtils.Core.Interfaces
@inject ILocalStorageService LocalStorage
@inject NavigationManager NavigationManager
<h3>Debug Tools</h3>
<hr/>
-@if (Rooms.Count == 0)
-{
+@if (Rooms.Count == 0) {
<p>You are not in any rooms!</p>
@* <p>Loading progress: @checkedRoomCount/@totalRoomCount</p> *@
}
-else
-{
+else {
<details>
<summary>Room List</summary>
- @foreach (var room in Rooms)
- {
- <a style="color: unset; text-decoration: unset;" href="/RoomStateViewer/@room.Replace('.', '~')"><RoomListItem RoomId="@room"></RoomListItem></a>
+ @foreach (var room in Rooms) {
+ <a style="color: unset; text-decoration: unset;" href="/RoomStateViewer/@room.Replace('.', '~')">
+ <RoomListItem RoomId="@room"></RoomListItem>
+ </a>
}
</details>
-
}
<details open>
@@ -38,50 +36,44 @@ else
@code {
public List<string> Rooms { get; set; } = new();
- protected override async Task OnInitializedAsync()
- {
+
+ protected override async Task OnInitializedAsync() {
await LocalStorageWrapper.LoadFromLocalStorage(LocalStorage);
await base.OnInitializedAsync();
- if (RuntimeCache.CurrentHomeServer == null)
- {
+ if (RuntimeCache.CurrentHomeServer == null) {
NavigationManager.NavigateTo("/Login");
return;
}
- Rooms = (await RuntimeCache.CurrentHomeServer.GetJoinedRooms()).Select(x=>x.RoomId).ToList();
+ Rooms = (await RuntimeCache.CurrentHomeServer.GetJoinedRooms()).Select(x => x.RoomId).ToList();
Console.WriteLine("Fetched joined rooms!");
}
-
//send req
string get_request_url { get; set; } = "";
string get_request_result { get; set; } = "";
- private async Task SendGetRequest()
- {
+
+ private async Task SendGetRequest() {
var field = typeof(IHomeServer).GetRuntimeFields().First(x => x.ToString().Contains("<_httpClient>k__BackingField"));
var httpClient = field.GetValue(RuntimeCache.CurrentHomeServer) as HttpClient;
- try
- {
+ try {
var res = await httpClient.GetAsync(get_request_url);
- if (res.IsSuccessStatusCode)
- {
- if(res.Content.Headers.ContentType.MediaType == "application/json")
+ if (res.IsSuccessStatusCode) {
+ if (res.Content.Headers.ContentType.MediaType == "application/json")
get_request_result = (await res.Content.ReadFromJsonAsync<object>()).ToJson();
else
get_request_result = await res.Content.ReadAsStringAsync();
StateHasChanged();
return;
}
- if(res.Content.Headers.ContentType.MediaType == "application/json")
+ if (res.Content.Headers.ContentType.MediaType == "application/json")
get_request_result = $"Error: {res.StatusCode}\n" + (await res.Content.ReadFromJsonAsync<object>()).ToJson();
else
get_request_result = $"Error: {res.StatusCode}\n" + await res.Content.ReadAsStringAsync();
-
}
- catch (Exception e)
- {
+ catch (Exception e) {
get_request_result = $"Error: {e}";
}
StateHasChanged();
}
-}
\ No newline at end of file
+}
\ No newline at end of file
diff --git a/MatrixRoomUtils.Web/Pages/DevOptions.razor b/MatrixRoomUtils.Web/Pages/DevOptions.razor
index 3ca86b4..0843d5f 100644
--- a/MatrixRoomUtils.Web/Pages/DevOptions.razor
+++ b/MatrixRoomUtils.Web/Pages/DevOptions.razor
@@ -19,15 +19,13 @@
<summary>View caches</summary>
<p>Generic cache:</p>
<ul>
- @foreach (var item in RuntimeCache.GenericResponseCache)
- {
+ @foreach (var item in RuntimeCache.GenericResponseCache) {
<li>
@item.Key: @item.Value.Cache.Count entries<br/>
- @if (item.Value.Cache.Count > 0)
- {
+ @if (item.Value.Cache.Count > 0) {
<p>Earliest expiry: @(item.Value.Cache.Min(x => x.Value.ExpiryTime)) (@string.Format("{0:g}", item.Value.Cache.Min(x => x.Value.ExpiryTime).Value.Subtract(DateTime.Now)) from now)</p>
@* <p>Average expiry: @(item.Value.Cache.Average(x => x.Value.ExpiryTime.Value))(@item.Value.Cache.Average(x => x.Value.ExpiryTime).Value.Subtract(DateTime.Now) from now)</p> *@
- <p>Last expiry: @(item.Value.Cache.Max(x => x.Value.ExpiryTime)) (@string.Format("{0:g}", item.Value.Cache.Max(x => x.Value.ExpiryTime).Value.Subtract(DateTime.Now)) from now)</p>
+ <p>Last expiry: @(item.Value.Cache.Max(x => x.Value.ExpiryTime)) (@string.Format("{0:g}", item.Value.Cache.Max(x => x.Value.ExpiryTime).Value.Subtract(DateTime.Now)) from now)</p>
}
</li>
}
@@ -35,50 +33,42 @@
</details>
@code {
- protected override async Task OnInitializedAsync()
- {
+
+ protected override async Task OnInitializedAsync() {
await LocalStorageWrapper.LoadFromLocalStorage(LocalStorage);
await base.OnInitializedAsync();
- Task.Run(async () =>
- {
- while (true)
- {
+ Task.Run(async () => {
+ while (true) {
await Task.Delay(1000);
StateHasChanged();
}
});
}
- protected async Task LogStuff()
- {
+ protected async Task LogStuff() {
await Task.Delay(100);
Console.WriteLine($"Settings: {LocalStorageWrapper.Settings.ToJson()}");
-
+
await LocalStorageWrapper.SaveToLocalStorage(LocalStorage);
}
- protected async Task DropCaches()
- {
- foreach (var (key, value) in RuntimeCache.GenericResponseCache)
- {
+ protected async Task DropCaches() {
+ foreach (var (key, value) in RuntimeCache.GenericResponseCache) {
value.Cache.Clear();
}
-
- //RuntimeCache.GenericResponseCache.Clear();
+
+ //RuntimeCache.GenericResponseCache.Clear();
RuntimeCache.HomeserverResolutionCache.Clear();
await LocalStorageWrapper.SaveCacheToLocalStorage(LocalStorage);
}
- protected async Task RandomiseCacheTimers()
- {
- foreach (var keyValuePair in RuntimeCache.GenericResponseCache)
- {
+ 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)
- {
+ foreach (var cacheItem in keyValuePair.Value.Cache) {
cacheItem.Value.ExpiryTime = DateTime.Now.AddSeconds(Random.Shared.Next(15, 120));
}
-
+
await LocalStorageWrapper.SaveCacheToLocalStorage(LocalStorage);
}
}
diff --git a/MatrixRoomUtils.Web/Pages/HSAdmin/HSAdmin.razor b/MatrixRoomUtils.Web/Pages/HSAdmin/HSAdmin.razor
index b77012b..f972236 100644
--- a/MatrixRoomUtils.Web/Pages/HSAdmin/HSAdmin.razor
+++ b/MatrixRoomUtils.Web/Pages/HSAdmin/HSAdmin.razor
@@ -2,6 +2,10 @@
<h3>Homeserver Admininistration</h3>
<hr/>
+<h4>Synapse tools</h4>
+<hr/>
+<a href="/HSAdmin/RoomQuery">Query rooms</a>
+
@code {
-
+
}
\ No newline at end of file
diff --git a/MatrixRoomUtils.Web/Pages/HSAdmin/RoomQuery.razor b/MatrixRoomUtils.Web/Pages/HSAdmin/RoomQuery.razor
index 109ad7d..e6f95c7 100644
--- a/MatrixRoomUtils.Web/Pages/HSAdmin/RoomQuery.razor
+++ b/MatrixRoomUtils.Web/Pages/HSAdmin/RoomQuery.razor
@@ -1,73 +1,78 @@
-@page "/RoomQuery"
+@page "/HSAdmin/RoomQuery"
@using MatrixRoomUtils.Core.Extensions
-@using System.Runtime.InteropServices
-@using System.ComponentModel
@using MatrixRoomUtils.Core.Responses.Admin
<h3>Homeserver Administration - Room Query</h3>
<label>Search name: </label>
-<InputText @bind-Value="SearchTerm" /><br/>
+<InputText @bind-Value="SearchTerm"/><br/>
<label>Search id/name/creator (slow!): </label>
-<InputText @bind-Value="ContentSearchTerm" /><br/>
+<InputText @bind-Value="ContentSearchTerm"/><br/>
<label>Order by: </label>
<select @bind="OrderBy">
- @foreach (var item in validOrderBy)
- {
+ @foreach (var item in validOrderBy) {
<option value="@item.Key">@item.Value</option>
}
</select><br/>
<label>Ascending: </label>
-<InputCheckbox @bind-Value="Ascending" /><br/>
+<InputCheckbox @bind-Value="Ascending"/><br/>
<button class="btn btn-primary" @onclick="Search">Search</button>
<br/>
-@foreach (var res in Results)
-{
+@foreach (var res in Results) {
<div style="background-color: #ffffff11; border-radius: 0.5em; display: block; margin-top: 4px; padding: 4px;">
- <RoomListItem RoomId="@res.RoomId"></RoomListItem>
- <p>@res.CanonicalAlias, created by <InlineUserItem UserId="@res.Creator"></InlineUserItem></p>
+ <RoomListItem RoomName="@res.Name" RoomId="@res.RoomId"></RoomListItem>
+ <p>
+ @res.CanonicalAlias
+ @if (!string.IsNullOrWhiteSpace(res.Creator)) {
+ <span>
+ , created by <InlineUserItem UserId="@res.Creator"></InlineUserItem>
+ </span>
+ }
+ </p>
<p>@res.StateEvents state events</p>
<p>@res.JoinedMembers members, of which @res.JoinedLocalMembers are on this server</p>
</div>
}
@code {
-
- [Parameter, SupplyParameterFromQuery(Name = "order_by")]
+
+ [Parameter]
+ [SupplyParameterFromQuery(Name = "order_by")]
public string? OrderBy { get; set; }
-
- [Parameter, SupplyParameterFromQuery(Name = "search_term")]
+
+ [Parameter]
+ [SupplyParameterFromQuery(Name = "search_term")]
public string SearchTerm { get; set; }
-
- [Parameter, SupplyParameterFromQuery(Name = "content_search_term")]
+
+ [Parameter]
+ [SupplyParameterFromQuery(Name = "content_search_term")]
public string ContentSearchTerm { get; set; }
-
- [Parameter, SupplyParameterFromQuery(Name = "ascending")]
+
+ [Parameter]
+ [SupplyParameterFromQuery(Name = "ascending")]
public bool Ascending { get; set; }
public List<AdminRoomListingResult.AdminRoomListingResultRoom> Results { get; set; } = new();
-
- protected override async Task OnParametersSetAsync()
- {
- if(Ascending == null)
+
+ private string Status { get; set; }
+
+ protected override async Task OnParametersSetAsync() {
+ if (Ascending == null)
Ascending = true;
OrderBy ??= "name";
}
-
- private async Task Search()
- {
+
+ private async Task Search() {
Results.Clear();
var searchRooms = RuntimeCache.CurrentHomeServer.Admin.SearchRoomsAsync(orderBy: OrderBy!, dir: Ascending ? "f" : "b", searchTerm: SearchTerm, contentSearch: ContentSearchTerm).GetAsyncEnumerator();
- while (await searchRooms.MoveNextAsync())
- {
+ while (await searchRooms.MoveNextAsync()) {
var room = searchRooms.Current;
- Console.WriteLine("Hit: " + room.ToJson(indent: false));
+ Console.WriteLine("Hit: " + room.ToJson(false));
Results.Add(room);
}
}
- private Dictionary<string, string> validOrderBy = new Dictionary<string, string>()
- {
+ private readonly Dictionary<string, string> validOrderBy = new() {
{ "name", "Room name" },
{ "canonical_alias", "Main alias address" },
{ "joined_members", "Number of members (reversed)" },
@@ -80,7 +85,7 @@
{ "join_rules", "Join rules" },
{ "guest_access", "Guest access" },
{ "history_visibility", "Visibility of history" },
- { "state_events", "Number of state events" },
+ { "state_events", "Number of state events" }
};
}
\ No newline at end of file
diff --git a/MatrixRoomUtils.Web/Pages/Index.razor b/MatrixRoomUtils.Web/Pages/Index.razor
index decdb0c..33cca61 100644
--- a/MatrixRoomUtils.Web/Pages/Index.razor
+++ b/MatrixRoomUtils.Web/Pages/Index.razor
@@ -12,18 +12,15 @@ Small collection of tools to do not-so-everyday things.
<h5>Signed in accounts - <a href="/Login">Add new account</a></h5>
<hr/>
<form>
- @foreach (var (token, user) in RuntimeCache.LoginSessions)
- {
+ @foreach (var (token, user) in RuntimeCache.LoginSessions) {
<IndexUserItem User="@user"/>
}
</form>
@code
{
- protected override async Task OnInitializedAsync()
- {
- if (!RuntimeCache.WasLoaded)
- {
+ protected override async Task OnInitializedAsync() {
+ if (!RuntimeCache.WasLoaded) {
Console.WriteLine("[INDEX] !!! LOCALSTORAGE WAS NOT LOADED !!!");
await LocalStorageWrapper.LoadFromLocalStorage(LocalStorage);
}
diff --git a/MatrixRoomUtils.Web/Pages/KnownHomeserverList.razor b/MatrixRoomUtils.Web/Pages/KnownHomeserverList.razor
index 13b717d..92a8445 100644
--- a/MatrixRoomUtils.Web/Pages/KnownHomeserverList.razor
+++ b/MatrixRoomUtils.Web/Pages/KnownHomeserverList.razor
@@ -5,33 +5,25 @@
<h3>Known Homeserver List</h3>
<hr/>
-@if (!IsFinished)
-{
+@if (!IsFinished) {
<p>Loading... Please wait...</p>
<progress value="@QueryProgress.ProcessedRooms" max="@QueryProgress.TotalRooms"></progress>
<p>@QueryProgress.ProcessedRooms / @QueryProgress.TotalRooms</p>
- @foreach (var (room, state) in QueryProgress.ProcessedUsers.Where(x => !x.Value.IsFinished).OrderByDescending(x => x.Value.Total).ToList())
- {
- @if (state.Blocked)
- {
+ @foreach (var (room, state) in QueryProgress.ProcessedUsers.Where(x => !x.Value.IsFinished).OrderByDescending(x => x.Value.Total).ToList()) {
+ @if (state.Blocked) {
<p>🔒 @room.RoomId - @state.Processed / @state.Total, @state.Timing.Elapsed elapsed...</p>
}
- else if (state.Slowmode)
- {
-
+ else if (state.Slowmode) {
<p>🐢 @room.RoomId - @state.Processed / @state.Total, @state.Timing.Elapsed elapsed...</p>
}
- else
- {
+ else {
<p>@room.RoomId - @state.Processed / @state.Total, @state.Timing.Elapsed elapsed...</p>
}
<progress value="@state.Processed" max="@state.Total"></progress>
}
}
-else
-{
- @foreach (var server in HomeServers.OrderByDescending(x => x.KnownUserCount).ThenBy(x => x.Server).ToList())
- {
+else {
+ @foreach (var server in HomeServers.OrderByDescending(x => x.KnownUserCount).ThenBy(x => x.Server).ToList()) {
<p>@server.Server - @server.KnownUserCount</p>
}
}
@@ -42,15 +34,12 @@ else
bool IsFinished { get; set; }
HomeServerInfoQueryProgress QueryProgress { get; set; } = new();
- protected override async Task OnInitializedAsync()
- {
+ protected override async Task OnInitializedAsync() {
await LocalStorageWrapper.LoadFromLocalStorage(LocalStorage);
var sw = Stopwatch.StartNew();
- HomeServers = await GetHomeservers(progressCallback: async progress =>
- {
- if (sw.ElapsedMilliseconds > 1000)
- {
+ HomeServers = await GetHomeservers(progressCallback: async progress => {
+ if (sw.ElapsedMilliseconds > 1000) {
Console.WriteLine("Progress updated...");
QueryProgress = progress;
StateHasChanged();
@@ -69,9 +58,7 @@ else
await base.OnInitializedAsync();
}
-
- private async Task<List<HomeServerInfo>> GetHomeservers(int memberLimit = 1000, Func<HomeServerInfoQueryProgress, Task<bool>>? progressCallback = null)
- {
+ private async Task<List<HomeServerInfo>> GetHomeservers(int memberLimit = 1000, Func<HomeServerInfoQueryProgress, Task<bool>>? progressCallback = null) {
HomeServerInfoQueryProgress progress = new();
List<HomeServerInfo> homeServers = new();
var rooms = await RuntimeCache.CurrentHomeServer.GetJoinedRooms();
@@ -79,16 +66,14 @@ else
var semaphore = new SemaphoreSlim(4);
var semLock = new SemaphoreSlim(1);
- var tasks = rooms.Select(async room =>
- {
+ var tasks = rooms.Select(async room => {
await semaphore.WaitAsync();
- progress.ProcessedUsers.Add(room, new());
+ progress.ProcessedUsers.Add(room, new HomeServerInfoQueryProgress.State());
Console.WriteLine($"Fetching states for room ({rooms.IndexOf(room)}/{rooms.Count}) ({room.RoomId})");
var states = (await room.GetStateAsync("")).Value.Deserialize<List<StateEventResponse>>();
states.RemoveAll(x => x.Type != "m.room.member" || x.Content.GetProperty("membership").GetString() != "join");
Console.WriteLine($"Room {room.RoomId} has {states.Count} members");
- if (states.Count > memberLimit)
- {
+ if (states.Count > memberLimit) {
Console.WriteLine("Skipping!");
semaphore.Release();
progress.ProcessedUsers.Remove(room);
@@ -97,37 +82,31 @@ else
}
progress.ProcessedUsers[room].Total = states.Count;
var updateInterval = progress.ProcessedUsers[room].Total >= 1000 ? 1000 : 100;
- while (progress.ProcessedUsers.Any(x => x.Value.Total == 0) && progress.ProcessedUsers[room].Total >= 1000)
- {
+ while (progress.ProcessedUsers.Any(x => x.Value.Total == 0) && progress.ProcessedUsers[room].Total >= 1000) {
progress.ProcessedUsers[room].Blocked = true;
await Task.Delay(1000);
- // if(progressCallback != null)
- // await progressCallback.Invoke(progress);
+ // if(progressCallback != null)
+ // await progressCallback.Invoke(progress);
}
progress.ProcessedUsers[room].Blocked = false;
- int processedStates = 0;
- foreach (var state in states)
- {
+ var processedStates = 0;
+ foreach (var state in states) {
await semLock.WaitAsync();
semLock.Release();
- if (progress.ProcessedUsers.Count(x => x.Value.Total == 0) > 5 && progress.ProcessedUsers[room].Total >= 200)
- {
+ if (progress.ProcessedUsers.Count(x => x.Value.Total == 0) > 5 && progress.ProcessedUsers[room].Total >= 200) {
progress.ProcessedUsers[room].Slowmode = true;
await Task.Delay(progress.ProcessedUsers[room].Total >= 500 ? 1000 : 100);
}
- else
- {
+ else {
progress.ProcessedUsers[room].Slowmode = false;
}
- if (!homeServers.Any(x => x.Server == state.StateKey.Split(':')[1]))
- {
- homeServers.Add(new HomeServerInfo() { Server = state.StateKey.Split(':')[1] });
+ if (!homeServers.Any(x => x.Server == state.StateKey.Split(':')[1])) {
+ homeServers.Add(new HomeServerInfo { Server = state.StateKey.Split(':')[1] });
}
var hs = homeServers.First(x => x.Server == state.StateKey.Split(':')[1]);
if (!hs.KnownUsers.Contains(state.StateKey.Split(':')[0]))
hs.KnownUsers.Add(state.StateKey.Split(':')[0]);
- if (++progress.ProcessedUsers[room].Processed % updateInterval == 0 && progressCallback != null)
- {
+ if (++progress.ProcessedUsers[room].Processed % updateInterval == 0 && progressCallback != null) {
await semLock.WaitAsync();
var _ = await progressCallback.Invoke(progress);
semLock.Release();
@@ -148,29 +127,26 @@ else
return homeServers;
}
- class HomeServerInfo
- {
+ class HomeServerInfo {
public string Server { get; set; }
public int? KnownUserCount { get; set; }
- public List<string> KnownUsers { get; set; } = new();
+ public List<string> KnownUsers { get; } = new();
}
- class HomeServerInfoQueryProgress
- {
+ class HomeServerInfoQueryProgress {
public int ProcessedRooms { get; set; }
public int TotalRooms { get; set; }
- public Dictionary<Room, State> ProcessedUsers { get; set; } = new();
+ public Dictionary<Room, State> ProcessedUsers { get; } = new();
public List<HomeServerInfo> CurrentState { get; set; } = new();
- public class State
- {
+ 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; set; } = Stopwatch.StartNew();
+ public Stopwatch Timing { get; } = Stopwatch.StartNew();
}
}
diff --git a/MatrixRoomUtils.Web/Pages/LoginPage.razor b/MatrixRoomUtils.Web/Pages/LoginPage.razor
index c46dc9a..16fdd24 100644
--- a/MatrixRoomUtils.Web/Pages/LoginPage.razor
+++ b/MatrixRoomUtils.Web/Pages/LoginPage.razor
@@ -1,6 +1,6 @@
@page "/Login"
-@using System.Text.Json
@using MatrixRoomUtils.Core.Authentication
+@using System.Text.Json
@using MatrixRoomUtils.Web.Shared.SimpleComponents
@inject ILocalStorageService LocalStorage
@inject IJSRuntime JsRuntime
@@ -27,8 +27,7 @@
<h4>Parsed records</h4>
<hr/>
<table border="1">
- @foreach (var (homeserver, username, password) in records)
- {
+ @foreach (var (homeserver, username, password) in records) {
<tr style="background-color: @(RuntimeCache.LoginSessions.Any(x => x.Value.LoginResponse.UserId == $"@{username}:{homeserver}") ? "green" : "unset")">
<td style="border-width: 1px;">@username</td>
<td style="border-width: 1px;">@homeserver</td>
@@ -41,19 +40,16 @@
<LogView></LogView>
@code {
- List<(string homeserver, string username, string password)> records = new();
+ readonly List<(string homeserver, string username, string password)> records = new();
(string homeserver, string username, string password) newRecordInput = ("", "", "");
- async Task Login()
- {
- foreach (var (homeserver, username, password) in records)
- {
+ async Task Login() {
+ foreach (var (homeserver, username, password) in records) {
if (RuntimeCache.LoginSessions.Any(x => x.Value.LoginResponse.UserId == $"@{username}:{homeserver}")) continue;
var result = await MatrixAuth.Login(homeserver, username, password);
Console.WriteLine($"Obtained access token for {result.UserId}!");
- var userinfo = new UserInfo()
- {
+ var userinfo = new UserInfo {
LoginResponse = result
};
userinfo.Profile = await (await new AuthenticatedHomeServer(result.UserId, result.AccessToken, result.HomeServer).Configure()).GetProfile(result.UserId);
@@ -66,18 +62,15 @@
await LocalStorageWrapper.SaveToLocalStorage(LocalStorage);
}
- private async Task FileChanged(InputFileChangeEventArgs obj)
- {
- Console.WriteLine(JsonSerializer.Serialize(obj, new JsonSerializerOptions()
- {
+ private async Task FileChanged(InputFileChangeEventArgs obj) {
+ Console.WriteLine(JsonSerializer.Serialize(obj, new JsonSerializerOptions {
WriteIndented = true
}));
await using var rs = obj.File.OpenReadStream();
using var sr = new StreamReader(rs);
- string TsvData = await sr.ReadToEndAsync();
+ var TsvData = await sr.ReadToEndAsync();
records.Clear();
- foreach (var line in TsvData.Split('\n'))
- {
+ foreach (var line in TsvData.Split('\n')) {
var parts = line.Split('\t');
if (parts.Length != 3)
continue;
@@ -85,8 +78,7 @@
}
}
- private void AddRecord()
- {
+ private void AddRecord() {
records.Add(newRecordInput);
newRecordInput = ("", "", "");
}
diff --git a/MatrixRoomUtils.Web/Pages/MediaLocator.razor b/MatrixRoomUtils.Web/Pages/MediaLocator.razor
index 19a0d4e..36cd8e6 100644
--- a/MatrixRoomUtils.Web/Pages/MediaLocator.razor
+++ b/MatrixRoomUtils.Web/Pages/MediaLocator.razor
@@ -7,8 +7,7 @@
<details>
<summary>Checked homeserver list (@homeservers.Count entries)</summary>
<ul>
- @foreach (var hs in homeservers)
- {
+ @foreach (var hs in homeservers) {
<li>@hs</li>
}
</ul>
@@ -16,26 +15,22 @@
<button @onclick="addMoreHomeservers">Add more homeservers</button>
<br/>
<span>MXC URL: </span>
-<input type="text" @bind="mxcUrl" />
+<input type="text" @bind="mxcUrl"/>
<button @onclick="executeSearch">Search</button>
-@if (successResults.Count > 0)
-{
+@if (successResults.Count > 0) {
<h4>Successes</h4>
<ul>
- @foreach (var result in successResults)
- {
+ @foreach (var result in successResults) {
<li>@result</li>
}
</ul>
}
-@if (errorResults.Count > 0)
-{
+@if (errorResults.Count > 0) {
<h4>Errors</h4>
<ul>
- @foreach (var result in errorResults)
- {
+ @foreach (var result in errorResults) {
<li>@result</li>
}
</ul>
@@ -44,15 +39,13 @@
@code {
string mxcUrl { get; set; }
- List<string> successResults = new List<string>();
- List<string> errorResults = new List<string>();
- List<string> homeservers = new List<string>();
+ readonly List<string> successResults = new();
+ readonly List<string> errorResults = new();
+ readonly List<string> homeservers = new();
- protected override async Task OnInitializedAsync()
- {
+ protected override async Task OnInitializedAsync() {
await base.OnInitializedAsync();
- homeservers.AddRange(new []
- {
+ homeservers.AddRange(new[] {
"matrix.org",
"feline.support",
"rory.gay",
@@ -62,70 +55,58 @@
});
}
- async Task executeSearch()
- {
+ async Task executeSearch() {
var sem = new SemaphoreSlim(128, 128);
- homeservers.ForEach(async hs =>
- {
+ 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/r0/download/");
- try
- {
+ try {
var res = await httpClient.SendAsync(new HttpRequestMessage(HttpMethod.Head, rmu));
- if (res.IsSuccessStatusCode)
- {
+ 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)
- {
+ catch (Exception e) {
errorResults.Add($"Error: {e}");
}
- finally
- {
+ finally {
sem.Release();
}
StateHasChanged();
});
}
-
- async Task addMoreHomeservers()
- {
+ 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 =>
- {
+ lines.ToList().ForEach(async line => {
await sem.WaitAsync();
- try
- {
+ try {
homeservers.Add(await rhs.ResolveHomeserverFromWellKnown(line));
StateHasChanged();
- if(Random.Shared.Next(0,101) == 50)
+ if (Random.Shared.Next(0, 101) == 50)
await LocalStorageWrapper.SaveCacheToLocalStorage(LocalStorage);
}
- catch (Exception e)
- {
+ catch (Exception e) {
Console.WriteLine(e);
}
- finally
- {
+ 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 bf03ee3..b15928a 100644
--- a/MatrixRoomUtils.Web/Pages/PolicyList/PolicyListEditorPage.razor
+++ b/MatrixRoomUtils.Web/Pages/PolicyList/PolicyListEditorPage.razor
@@ -1,7 +1,7 @@
@page "/PolicyListEditor/{RoomId}"
-@using System.Text.Json
@using MatrixRoomUtils.Core.Extensions
@using MatrixRoomUtils.Core.StateEventTypes
+@using System.Text.Json
@inject ILocalStorageService LocalStorage
@inject NavigationManager NavigationManager
<h3>Policy list editor - Editing @RoomId</h3>
@@ -15,12 +15,10 @@
<InputCheckbox @bind-Value="_enableAvatars" @oninput="GetAllAvatars"></InputCheckbox><label>Enable avatars (WILL EXPOSE YOUR IP TO TARGET HOMESERVERS!)</label>
-@if (!PolicyEvents.Any(x => x.Type == "m.policy.rule.server"))
-{
+@if (!PolicyEvents.Any(x => x.Type == "m.policy.rule.server")) {
<p>No server policies</p>
}
-else
-{
+else {
<h3>Server policies</h3>
<hr/>
<table class="table table-striped table-hover" style="width: fit-Content;">
@@ -33,8 +31,7 @@ else
</tr>
</thead>
<tbody>
- @foreach (var policyEvent in PolicyEvents.Where(x => x.Type == "m.policy.rule.server" && x.Content.Entity != null))
- {
+ @foreach (var policyEvent in PolicyEvents.Where(x => x.Type == "m.policy.rule.server" && x.Content.Entity != null)) {
<tr>
<td>Entity: @policyEvent.Content.Entity<br/>State: @policyEvent.StateKey</td>
<td>@policyEvent.Content.Reason</td>
@@ -59,23 +56,20 @@ else
</tr>
</thead>
<tbody>
- @foreach (var policyEvent in PolicyEvents.Where(x => x.Type == "m.policy.rule.server" && x.Content.Entity == null))
- {
+ @foreach (var policyEvent in PolicyEvents.Where(x => x.Type == "m.policy.rule.server" && x.Content.Entity == null)) {
<tr>
<td>@policyEvent.StateKey</td>
- <td>@policyEvent.Content.ToJson(indent: false, ignoreNull: true)</td>
+ <td>@policyEvent.Content.ToJson(false, true)</td>
</tr>
}
</tbody>
</table>
</details>
}
-@if (!PolicyEvents.Any(x => x.Type == "m.policy.rule.room"))
-{
+@if (!PolicyEvents.Any(x => x.Type == "m.policy.rule.room")) {
<p>No room policies</p>
}
-else
-{
+else {
<h3>Room policies</h3>
<hr/>
<table class="table table-striped table-hover" style="width: fit-Content;">
@@ -88,8 +82,7 @@ else
</tr>
</thead>
<tbody>
- @foreach (var policyEvent in PolicyEvents.Where(x => x.Type == "m.policy.rule.room" && x.Content.Entity != null))
- {
+ @foreach (var policyEvent in PolicyEvents.Where(x => x.Type == "m.policy.rule.room" && x.Content.Entity != null)) {
<tr>
<td>Entity: @policyEvent.Content.Entity<br/>State: @policyEvent.StateKey</td>
<td>@policyEvent.Content.Reason</td>
@@ -113,30 +106,26 @@ else
</tr>
</thead>
<tbody>
- @foreach (var policyEvent in PolicyEvents.Where(x => x.Type == "m.policy.rule.room" && x.Content.Entity == null))
- {
+ @foreach (var policyEvent in PolicyEvents.Where(x => x.Type == "m.policy.rule.room" && x.Content.Entity == null)) {
<tr>
<td>@policyEvent.StateKey</td>
- <td>@policyEvent.Content.ToJson(indent: false, ignoreNull: true)</td>
+ <td>@policyEvent.Content.ToJson(false, true)</td>
</tr>
}
</tbody>
</table>
</details>
}
-@if (!PolicyEvents.Any(x => x.Type == "m.policy.rule.user"))
-{
+@if (!PolicyEvents.Any(x => x.Type == "m.policy.rule.user")) {
<p>No user policies</p>
}
-else
-{
+else {
<h3>User policies</h3>
<hr/>
<table class="table table-striped table-hover" style="width: fit-Content;">
<thead>
<tr>
- @if (_enableAvatars)
- {
+ @if (_enableAvatars) {
<th scope="col"></th>
}
<th scope="col" style="max-width: 0.2vw; word-wrap: anywhere;">User</th>
@@ -146,12 +135,12 @@ else
</tr>
</thead>
<tbody>
- @foreach (var policyEvent in PolicyEvents.Where(x => x.Type == "m.policy.rule.user" && x.Content.Entity != null))
- {
+ @foreach (var policyEvent in PolicyEvents.Where(x => x.Type == "m.policy.rule.user" && x.Content.Entity != null)) {
<tr>
- @if (_enableAvatars)
- {
- <td scope="col"><img style="width: 48px; height: 48px; aspect-ratio: unset; border-radius: 50%;" src="@(avatars.ContainsKey(policyEvent.Content.Entity) ? avatars[policyEvent.Content.Entity] : "")"/></td>
+ @if (_enableAvatars) {
+ <td scope="col">
+ <img style="width: 48px; height: 48px; aspect-ratio: unset; border-radius: 50%;" src="@(avatars.ContainsKey(policyEvent.Content.Entity) ? avatars[policyEvent.Content.Entity] : "")"/>
+ </td>
}
<td style="word-wrap: anywhere;">Entity: @string.Join("", policyEvent.Content.Entity.Take(64))<br/>State: @string.Join("", policyEvent.StateKey.Take(64))</td>
<td>@policyEvent.Content.Reason</td>
@@ -175,11 +164,10 @@ else
</tr>
</thead>
<tbody>
- @foreach (var policyEvent in PolicyEvents.Where(x => x.Type == "m.policy.rule.user" && x.Content.Entity == null))
- {
+ @foreach (var policyEvent in PolicyEvents.Where(x => x.Type == "m.policy.rule.user" && x.Content.Entity == null)) {
<tr>
<td>@policyEvent.StateKey</td>
- <td>@policyEvent.Content.ToJson(indent: false, ignoreNull: true)</td>
+ <td>@policyEvent.Content.ToJson(false, true)</td>
</tr>
}
</tbody>
@@ -197,21 +185,19 @@ else
[Parameter]
public string? RoomId { get; set; }
-
- private bool _enableAvatars = false;
-
- static Dictionary<string, string?> avatars = new Dictionary<string, string?>();
- static Dictionary<string, RemoteHomeServer> servers = new Dictionary<string, RemoteHomeServer>();
+
+ private bool _enableAvatars;
+
+ static readonly Dictionary<string, string?> avatars = new();
+ static readonly Dictionary<string, RemoteHomeServer> servers = new();
public static List<StateEventResponse<PolicyRuleStateEventData>> PolicyEvents { get; set; } = new();
- protected override async Task OnInitializedAsync()
- {
+ protected override async Task OnInitializedAsync() {
await LocalStorageWrapper.LoadFromLocalStorage(LocalStorage);
await base.OnInitializedAsync();
- // if(RuntimeCache.AccessToken == null || RuntimeCache.CurrentHomeserver == null)
- if (RuntimeCache.CurrentHomeServer == null)
- {
+ // if(RuntimeCache.AccessToken == null || RuntimeCache.CurrentHomeserver == null)
+ if (RuntimeCache.CurrentHomeServer == null) {
NavigationManager.NavigateTo("/Login");
return;
}
@@ -220,18 +206,16 @@ else
Console.WriteLine("Policy list editor initialized!");
}
- private async Task LoadStatesAsync()
- {
- // using var client = new HttpClient();
- // client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", LocalStorageWrapper.AccessToken);
- // var response = await client.GetAsync($"{LocalStorageWrapper.CurrentHomeserver}/_matrix/client/r0/rooms/{RoomId}/state");
- // var Content = await response.Content.ReadAsStringAsync();
- // Console.WriteLine(JsonSerializer.Deserialize<object>(Content).ToJson());
- // var stateEvents = JsonSerializer.Deserialize<List<StateEventResponse>>(Content);
+ private async Task LoadStatesAsync() {
+ // using var client = new HttpClient();
+ // client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", LocalStorageWrapper.AccessToken);
+ // var response = await client.GetAsync($"{LocalStorageWrapper.CurrentHomeserver}/_matrix/client/r0/rooms/{RoomId}/state");
+ // var Content = await response.Content.ReadAsStringAsync();
+ // Console.WriteLine(JsonSerializer.Deserialize<object>(Content).ToJson());
+ // var stateEvents = JsonSerializer.Deserialize<List<StateEventResponse>>(Content);
var room = await RuntimeCache.CurrentHomeServer.GetRoom(RoomId);
var stateEventsQuery = await room.GetStateAsync("");
- if (stateEventsQuery == null)
- {
+ if (stateEventsQuery == null) {
Console.WriteLine("state events query is null!!!");
}
var stateEvents = stateEventsQuery.Value.Deserialize<List<StateEventResponse>>();
@@ -239,30 +223,25 @@ else
.Select(x => JsonSerializer.Deserialize<StateEventResponse<PolicyRuleStateEventData>>(JsonSerializer.Serialize(x))).ToList();
StateHasChanged();
}
-
- private async Task GetAvatar(string userId)
- {
- try
- {
+
+ private async Task GetAvatar(string userId) {
+ try {
if (avatars.ContainsKey(userId)) return;
var hs = userId.Split(':')[1];
- RemoteHomeServer server = servers.ContainsKey(hs) ? servers[hs] : await new RemoteHomeServer(userId.Split(':')[1]).Configure();
+ var server = servers.ContainsKey(hs) ? servers[hs] : await new RemoteHomeServer(userId.Split(':')[1]).Configure();
if (!servers.ContainsKey(hs)) servers.Add(hs, server);
var profile = await server.GetProfile(userId);
avatars.Add(userId, server.ResolveMediaUri(profile.AvatarUrl));
servers.Add(userId, server);
StateHasChanged();
}
- catch
- {
- // ignored
+ catch {
+ // ignored
}
}
-
- private async Task GetAllAvatars()
- {
- foreach (var policyEvent in PolicyEvents.Where(x => x.Type == "m.policy.rule.user" && x.Content.Entity != null))
- {
+
+ private async Task GetAllAvatars() {
+ foreach (var policyEvent in PolicyEvents.Where(x => x.Type == "m.policy.rule.user" && x.Content.Entity != null)) {
await GetAvatar(policyEvent.Content.Entity);
}
StateHasChanged();
diff --git a/MatrixRoomUtils.Web/Pages/PolicyList/PolicyListRoomList.razor b/MatrixRoomUtils.Web/Pages/PolicyList/PolicyListRoomList.razor
index e61598a..20eab7a 100644
--- a/MatrixRoomUtils.Web/Pages/PolicyList/PolicyListRoomList.razor
+++ b/MatrixRoomUtils.Web/Pages/PolicyList/PolicyListRoomList.razor
@@ -1,29 +1,25 @@
@page "/PolicyListEditor"
-@using System.Text.Json
@using MatrixRoomUtils.Core.Extensions
@inject ILocalStorageService LocalStorage
@inject NavigationManager NavigationManager
<h3>Policy list editor - Room list</h3>
<hr/>
-@if (PolicyRoomList.Count == 0)
-{
+@if (PolicyRoomList.Count == 0) {
<p>No policy rooms found.</p>
<p>Loading progress: @checkedRoomCount/@totalRoomCount</p>
}
-else
-{
- @if (checkedRoomCount != totalRoomCount)
- {
+else {
+ @if (checkedRoomCount != totalRoomCount) {
<p>Loading progress: @checkedRoomCount/@totalRoomCount</p>
}
- foreach (var s in PolicyRoomList)
- {
-
- <a style="color: unset; text-decoration: unset;" href="/PolicyListEditor/@s.RoomId.Replace('.','~')"><RoomListItem RoomId="@s.RoomId">
- <br/>
- <span>Shortcode: @s.Shortcode</span>
- </RoomListItem></a>
+ foreach (var s in PolicyRoomList) {
+ <a style="color: unset; text-decoration: unset;" href="/PolicyListEditor/@s.RoomId.Replace('.', '~')">
+ <RoomListItem RoomId="@s.RoomId">
+ <br/>
+ <span>Shortcode: @s.Shortcode</span>
+ </RoomListItem>
+ </a>
@* <a href="@(NavigationManager.Uri + "/" + s.RoomId.Replace('.', '~'))">[@s.Shortcode] @s.Name (@s.RoomId)</a> *@
@* <br/> *@
}
@@ -40,15 +36,13 @@ else
public List<PolicyRoomInfo> PolicyRoomList { get; set; } = new();
- private int checkedRoomCount { get; set; } = 0;
- private int totalRoomCount { get; set; } = 0;
+ private int checkedRoomCount { get; set; }
+ private int totalRoomCount { get; set; }
- protected override async Task OnInitializedAsync()
- {
+ protected override async Task OnInitializedAsync() {
await LocalStorageWrapper.LoadFromLocalStorage(LocalStorage);
await base.OnInitializedAsync();
- if (RuntimeCache.CurrentHomeServer == null)
- {
+ if (RuntimeCache.CurrentHomeServer == null) {
NavigationManager.NavigateTo("/Login");
return;
}
@@ -56,59 +50,48 @@ else
Console.WriteLine("Policy list editor initialized!");
}
- private async Task EnumeratePolicyRooms()
- {
+ private async Task EnumeratePolicyRooms() {
var xxxrooms = await RuntimeCache.CurrentHomeServer.GetJoinedRooms();
totalRoomCount = xxxrooms.Count;
StateHasChanged();
var xxxsemaphore = new SemaphoreSlim(1000);
var xxxtasks = new List<Task<PolicyRoomInfo?>>();
- foreach (var room in xxxrooms)
- {
+ foreach (var room in xxxrooms) {
xxxtasks.Add(GetPolicyRoomInfo(room.RoomId, xxxsemaphore));
}
var xxxresults = await Task.WhenAll(xxxtasks);
PolicyRoomList.AddRange(xxxresults.Where(x => x != null).Select(x => x.Value));
Console.WriteLine($"Detected policy lists: {PolicyRoomList.ToJson()}");
- return;
}
- private async Task<PolicyRoomInfo?> GetPolicyRoomInfo(string room, SemaphoreSlim semaphore)
- {
- try
- {
+ private async Task<PolicyRoomInfo?> GetPolicyRoomInfo(string room, SemaphoreSlim semaphore) {
+ try {
await semaphore.WaitAsync();
- PolicyRoomInfo roomInfo = new()
- {
+ 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;
- roomInfo.Shortcode = shortcodeState.Value.TryGetProperty("shortcode", out JsonElement shortcode) ? shortcode.GetString() : null;
+ if (!shortcodeState.HasValue) return null;
+ roomInfo.Shortcode = shortcodeState.Value.TryGetProperty("shortcode", out var shortcode) ? shortcode.GetString() : null;
- if (roomInfo.Shortcode != null)
- {
+ if (roomInfo.Shortcode != null) {
roomInfo.Name = await r.GetNameAsync();
return roomInfo;
}
return null;
}
- finally
-
- {
+ finally {
checkedRoomCount++;
StateHasChanged();
semaphore.Release();
}
}
- public struct PolicyRoomInfo
-
- {
+ public struct PolicyRoomInfo {
public
string RoomId { get; set; }
@@ -118,4 +101,5 @@ else
public
string? Name { get; set; }
}
- }
\ No newline at end of file
+
+}
\ No newline at end of file
diff --git a/MatrixRoomUtils.Web/Pages/RoomManager/RoomManager.razor b/MatrixRoomUtils.Web/Pages/RoomManager/RoomManager.razor
index 5daa97c..9b0bb88 100644
--- a/MatrixRoomUtils.Web/Pages/RoomManager/RoomManager.razor
+++ b/MatrixRoomUtils.Web/Pages/RoomManager/RoomManager.razor
@@ -3,12 +3,10 @@
@inject NavigationManager NavigationManager
<h3>Room manager</h3>
<hr/>
-@if (Rooms.Count == 0)
-{
+@if (Rooms.Count == 0) {
<p>You are not in any rooms!</p>
}
-else
-{
+else {
<p>You are in @Rooms.Count rooms and @Spaces.Count spaces</p>
<p>
<a href="/RoomManagerCreateRoom">Create room</a>
@@ -16,8 +14,7 @@ else
<details open>
<summary>Space List</summary>
- @foreach (var room in Spaces)
- {
+ @foreach (var room in Spaces) {
<a style="color: unset; text-decoration: unset;" href="/RoomManager/Space/@room.RoomId.Replace('.', '~')">
<RoomListItem Room="@room" ShowOwnProfile="false"></RoomListItem>
</a>
@@ -25,8 +22,7 @@ else
</details>
<details open>
<summary>Room List</summary>
- @foreach (var room in Rooms)
- {
+ @foreach (var room in Rooms) {
<a style="color: unset; text-decoration: unset;" href="/RoomManager/Room/@room.RoomId.Replace('.', '~')">
<RoomListItem Room="@room" ShowOwnProfile="true"></RoomListItem>
</a>
@@ -41,15 +37,13 @@ else
public List<Room> Rooms { get; set; } = new();
public List<Room> Spaces { get; set; } = new();
- protected override async Task OnInitializedAsync()
- {
+ protected override async Task OnInitializedAsync() {
Console.WriteLine("Initializing room manager");
await LocalStorageWrapper.LoadFromLocalStorage(LocalStorage);
Console.WriteLine("Loaded from local storage");
await base.OnInitializedAsync();
Console.WriteLine("Initialized base");
- if (RuntimeCache.CurrentHomeServer == null)
- {
+ if (RuntimeCache.CurrentHomeServer == null) {
NavigationManager.NavigateTo("/Login");
return;
}
@@ -59,8 +53,7 @@ else
Console.WriteLine($"Got {_rooms.Count} rooms");
var semaphore = new SemaphoreSlim(10);
var tasks = new List<Task<Room?>>();
- foreach (var room in _rooms)
- {
+ foreach (var room in _rooms) {
tasks.Add(CheckIfSpace(room, semaphore));
}
await Task.WhenAll(tasks);
@@ -68,45 +61,36 @@ else
Console.WriteLine("Fetched joined rooms!");
}
- private async Task<Room?> CheckIfSpace(Room room, SemaphoreSlim semaphore)
- {
+ private async Task<Room?> CheckIfSpace(Room room, SemaphoreSlim semaphore) {
await semaphore.WaitAsync();
- // Console.WriteLine($"Checking if {room.RoomId} is a space");
- try
- {
+ // Console.WriteLine($"Checking if {room.RoomId} is a space");
+ try {
var state = await room.GetStateAsync<CreateEvent>("m.room.create");
- if (state != null)
- {
+ if (state != null) {
//Console.WriteLine(state.Value.ToJson());
- if (state.Type != null)
- {
- if (state.Type == "m.space")
- {
+ if (state.Type != null) {
+ if (state.Type == "m.space") {
Console.WriteLine($"Room {room.RoomId} is a space!");
Spaces.Add(room);
StateHasChanged();
return room;
}
- else
- {
+ else {
Console.WriteLine($"Encountered unknown room type {state.Type}");
}
}
- else
- {
+ else {
Rooms.Add(room);
//this is fine, apprently...
// Console.WriteLine($"Room {room.RoomId} has no Content.type in m.room.create!");
}
}
}
- catch (Exception e)
- {
+ catch (Exception e) {
Console.WriteLine(e);
return null;
}
- finally
- {
+ finally {
semaphore.Release();
}
return null;
diff --git a/MatrixRoomUtils.Web/Pages/RoomManager/RoomManagerCreateRoom.razor b/MatrixRoomUtils.Web/Pages/RoomManager/RoomManagerCreateRoom.razor
index d561eb0..5cfda77 100644
--- a/MatrixRoomUtils.Web/Pages/RoomManager/RoomManagerCreateRoom.razor
+++ b/MatrixRoomUtils.Web/Pages/RoomManager/RoomManagerCreateRoom.razor
@@ -1,12 +1,13 @@
@page "/RoomManagerCreateRoom"
-@using System.Text.Json
@using MatrixRoomUtils.Core.Extensions
@using MatrixRoomUtils.Core.Responses
-@using MatrixRoomUtils.Web.Shared.SimpleComponents
-@using System.Reflection
-@using System.Runtime.Intrinsics.X86
+@using System.Text.Json
@using System.Text.Json.Serialization
+@using System.Reflection
@using MatrixRoomUtils.Web.Classes.RoomCreationTemplates
+@* ReSharper disable once RedundantUsingDirective - Must not remove this, Rider marks this as "unused" when it's not *@
+@using MatrixRoomUtils.Web.Shared.SimpleComponents
+
<h3>Room Manager - Create Room</h3>
@* <pre Contenteditable="true" @onkeypress="@JsonChanged" ="JsonString">@JsonString</pre> *@
@@ -20,15 +21,13 @@
<td style="padding-bottom: 16px;">Preset:</td>
<td style="padding-bottom: 16px;">
<InputSelect @bind-Value="@RoomPreset">
- @foreach (var createRoomRequest in Presets)
- {
+ @foreach (var createRoomRequest in Presets) {
<option value="@createRoomRequest.Key">@createRoomRequest.Key</option>
}
</InputSelect>
</td>
</tr>
- @if (creationEvent != null)
- {
+ @if (creationEvent != null) {
<tr>
<td>Room name:</td>
<td>
@@ -89,8 +88,7 @@
<td>Permissions:</td>
<details>
<summary>@creationEvent.PowerLevelContentOverride.Users.Count members</summary>
- @foreach (var user in creationEvent.PowerLevelContentOverride.Events.Keys)
- {
+ @foreach (var user in creationEvent.PowerLevelContentOverride.Events.Keys) {
var _event = user;
<tr>
<td><FancyTextBox Formatter="@GetPermissionFriendlyName" Value="@_event" ValueChanged="val => { creationEvent.PowerLevelContentOverride.Events.ChangeKey(_event, val); }"></FancyTextBox>:</td>
@@ -99,8 +97,7 @@
</td>
</tr>
}
- @foreach (var user in creationEvent.PowerLevelContentOverride.Users.Keys)
- {
+ @foreach (var user in creationEvent.PowerLevelContentOverride.Users.Keys) {
var _user = user;
<tr>
<td><FancyTextBox Value="@_user" ValueChanged="val => { creationEvent.PowerLevelContentOverride.Users.ChangeKey(_user, val); creationEvent.PowerLevelContentOverride.Users = creationEvent.PowerLevelContentOverride.Users.OrderByDescending(x => x.Value).ThenBy(x => x.Key).ToDictionary(x => x.Key, x => x.Value); }"></FancyTextBox>:</td>
@@ -131,8 +128,7 @@
<details>
<summary>@creationEvent.InitialState.Count(x => x.Type == "m.room.member") members</summary>
<button @onclick="() => { RuntimeCache.LoginSessions.Select(x => x.Value.LoginResponse.UserId).ToList().ForEach(InviteMember); }">Invite all logged in accounts</button>
- @foreach (var member in creationEvent.InitialState.Where(x => x.Type == "m.room.member" && x.StateKey != RuntimeCache.CurrentHomeServer.UserId))
- {
+ @foreach (var member in creationEvent.InitialState.Where(x => x.Type == "m.room.member" && x.StateKey != RuntimeCache.CurrentHomeServer.UserId)) {
<UserListItem UserId="@member.StateKey"></UserListItem>
}
</details>
@@ -154,13 +150,11 @@
<summary>@creationEvent.InitialState.Count(x => !ImplementedStates.Contains(x.Type)) custom states</summary>
<table>
- @foreach (var initialState in creationEvent.InitialState.Where(x => !ImplementedStates.Contains(x.Type)))
- {
+ @foreach (var initialState in creationEvent.InitialState.Where(x => !ImplementedStates.Contains(x.Type))) {
<tr>
<td style="vertical-align: top;">
@(initialState.Type):
- @if (!string.IsNullOrEmpty(initialState.StateKey))
- {
+ @if (!string.IsNullOrEmpty(initialState.StateKey)) {
<br/>
<span>(@initialState.StateKey)</span>
}
@@ -176,8 +170,7 @@
<details>
<summary>@creationEvent.InitialState.Count initial states</summary>
<table>
- @foreach (var initialState in creationEvent.InitialState)
- {
+ @foreach (var initialState in creationEvent.InitialState) {
var _state = initialState;
<tr>
<td style="vertical-align: top;">
@@ -214,25 +207,21 @@
@code {
- private string RoomPreset
- {
- get
- {
- if (Presets.ContainsValue(creationEvent))
- {
+ private string RoomPreset {
+ get {
+ if (Presets.ContainsValue(creationEvent)) {
return Presets.First(x => x.Value == creationEvent).Key;
}
return "Not a preset";
}
- set
- {
+ set {
creationEvent = Presets[value];
JsonChanged();
OverwriteWrappedPropertiesFromEvent();
creationEvent.PowerLevelContentOverride.Events = creationEvent.PowerLevelContentOverride.Events.OrderByDescending(x => x.Value).ThenBy(x => x.Key).ToDictionary(x => x.Key, x => x.Value);
creationEvent.PowerLevelContentOverride.Users = creationEvent.PowerLevelContentOverride.Users.OrderByDescending(x => x.Value).ThenBy(x => x.Key).ToDictionary(x => x.Key, x => x.Value);
guestAccessEvent = creationEvent["m.room.guest_access"].As<GuestAccessContent>().Content;
-
+
Console.WriteLine($"Creation event uncasted: {creationEvent["m.room.guest_access"].ToJson()}");
Console.WriteLine($"Creation event casted: {creationEvent["m.room.guest_access"].As<GuestAccessContent>().ToJson()}");
creationEvent["m.room.guest_access"].As<GuestAccessContent>().Content.IsGuestAccessEnabled = true;
@@ -251,21 +240,18 @@
private Dictionary<string, CreateRoomRequest> Presets { get; set; } = new();
- protected override async Task OnInitializedAsync()
- {
+ protected override async Task OnInitializedAsync() {
await LocalStorageWrapper.LoadFromLocalStorage(LocalStorage);
//creationEvent = Presets["Default room"] =
- foreach (var x in Assembly.GetExecutingAssembly().GetTypes().Where(x => x.IsClass && !x.IsAbstract && x.GetInterfaces().Contains(typeof(IRoomCreationTemplate))).ToList())
- {
+ foreach (var x in Assembly.GetExecutingAssembly().GetTypes().Where(x => x.IsClass && !x.IsAbstract && x.GetInterfaces().Contains(typeof(IRoomCreationTemplate))).ToList()) {
Console.WriteLine($"Found room creation template in class: {x.FullName}");
var instance = (IRoomCreationTemplate)Activator.CreateInstance(x);
Presets[instance.Name] = instance.CreateRoomRequest;
}
Presets = Presets.OrderBy(x => x.Key).ToDictionary(x => x.Key, x => x.Value);
- if (!Presets.ContainsKey("Default"))
- {
+ if (!Presets.ContainsKey("Default")) {
Console.WriteLine($"No default room found in {Presets.Count} presets: {string.Join(", ", Presets.Keys)}");
}
else RoomPreset = "Default";
@@ -273,30 +259,23 @@
await base.OnInitializedAsync();
}
- private void JsonChanged()
- {
- Console.WriteLine(creationEvent.ToJson());
- }
-
+ private void JsonChanged() => Console.WriteLine(creationEvent.ToJson());
//wrappers
private List<string> ServerACLAllowRules { get; set; } = new();
private List<string> ServerACLDenyRules { get; set; } = new();
- private void OverwriteWrappedPropertiesFromEvent()
- {
+ private void OverwriteWrappedPropertiesFromEvent() {
Console.WriteLine("Overwriting wrapped properties from event");
ServerACLAllowRules = creationEvent.ServerACLs.Allow;
ServerACLDenyRules = creationEvent.ServerACLs.Deny;
}
- private async Task OverwriteWrappedProperties()
- {
+ private async Task OverwriteWrappedProperties() {
Console.WriteLine("Overwriting wrapped properties");
Console.WriteLine($"Allow: {ServerACLAllowRules.Count}: {string.Join(", ", ServerACLAllowRules)}");
Console.WriteLine($"Deny: {ServerACLDenyRules.Count}: {string.Join(", ", ServerACLDenyRules)}");
- creationEvent.ServerACLs = new()
- {
+ creationEvent.ServerACLs = new ServerACL {
Allow = ServerACLAllowRules,
Deny = ServerACLDenyRules,
AllowIpLiterals = creationEvent.ServerACLs.AllowIpLiterals
@@ -305,16 +284,14 @@
StateHasChanged();
}
- private async Task RoomIconFilePicked(InputFileChangeEventArgs obj)
- {
+ private async Task RoomIconFilePicked(InputFileChangeEventArgs obj) {
var res = await RuntimeCache.CurrentHomeServer.UploadFile(obj.File.Name, obj.File.OpenReadStream(), obj.File.ContentType);
Console.WriteLine(res);
creationEvent.RoomIcon = res;
StateHasChanged();
}
- private async Task CreateRoom()
- {
+ private async Task CreateRoom() {
Console.WriteLine("Create room");
Console.WriteLine(creationEvent.ToJson());
creationEvent.CreationContent.Add("rory.gay.created_using", "Rory&::MatrixRoomUtils (https://mru.rory.gay)");
@@ -323,22 +300,18 @@
// NavigationManager.NavigateTo($"/RoomManager/{id.RoomId.Replace('.','~')}");
}
- private void InviteMember(string mxid)
- {
+ private void InviteMember(string mxid) {
if (!creationEvent.InitialState.Any(x => x.Type == "m.room.member" && x.StateKey == mxid) && RuntimeCache.CurrentHomeServer.UserId != mxid)
- creationEvent.InitialState.Add(new()
- {
+ creationEvent.InitialState.Add(new StateEvent {
Type = "m.room.member",
StateKey = mxid,
- Content = new
- {
+ Content = new {
membership = "invite",
reason = "Automatically invited at room creation time."
}
});
}
-
private string GetStateFriendlyName(string key) => key switch {
"m.room.history_visibility" => "History visibility",
"m.room.guest_access" => "Guest access",
@@ -363,19 +336,14 @@
_ => key
};
- public class GuestAccessContent
- {
+ public class GuestAccessContent {
[JsonPropertyName("guest_access")]
public string GuestAccess { get; set; }
- public bool IsGuestAccessEnabled
- {
+ public bool IsGuestAccessEnabled {
get => GuestAccess == "can_join";
set => GuestAccess = value ? "can_join" : "forbidden";
}
}
-
-
}
-
diff --git a/MatrixRoomUtils.Web/Pages/RoomManager/RoomManagerSpace.razor b/MatrixRoomUtils.Web/Pages/RoomManager/RoomManagerSpace.razor
index 1e7e065..c5e1569 100644
--- a/MatrixRoomUtils.Web/Pages/RoomManager/RoomManagerSpace.razor
+++ b/MatrixRoomUtils.Web/Pages/RoomManager/RoomManagerSpace.razor
@@ -4,8 +4,7 @@
<h3>Room manager - Viewing Space</h3>
<button onclick="@JoinAllRooms">Join all rooms</button>
-@foreach (var room in Rooms)
-{
+@foreach (var room in Rooms) {
<RoomListItem Room="room" ShowOwnProfile="true"></RoomListItem>
}
@@ -13,8 +12,7 @@
<br/>
<details style="background: #0002;">
<summary style="background: #fff1;">State list</summary>
- @foreach (var stateEvent in States.OrderBy(x => x.StateKey).ThenBy(x => x.Type))
- {
+ @foreach (var stateEvent in States.OrderBy(x => x.StateKey).ThenBy(x => x.Type)) {
<p>@stateEvent.StateKey/@stateEvent.Type:</p>
<pre>@stateEvent.Content.ToJson()</pre>
}
@@ -24,61 +22,52 @@
[Parameter]
public string RoomId { get; set; } = "invalid!!!!!!";
-
+
private Room? Room { get; set; }
-
+
private StateEventResponse<object>[] States { get; set; } = Array.Empty<StateEventResponse<object>>();
- private List<Room> Rooms { get; set; } = new();
- private List<string> ServersInSpace { get; set; } = new();
-
- protected override async Task OnInitializedAsync()
- {
+ private List<Room> Rooms { get; } = new();
+ private List<string> ServersInSpace { get; } = 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());
+ if (state != null) {
+ // Console.WriteLine(state.Value.ToJson());
States = state.Value.Deserialize<StateEventResponse<object>[]>()!;
-
- foreach (var stateEvent in States)
- {
- if (stateEvent.Type == "m.space.child")
- {
- // if (stateEvent.Content.ToJson().Length < 5) return;
+
+ foreach (var stateEvent in States) {
+ if (stateEvent.Type == "m.space.child") {
+ // if (stateEvent.Content.ToJson().Length < 5) return;
var roomId = stateEvent.StateKey;
var room = await RuntimeCache.CurrentHomeServer.GetRoom(roomId);
- if (room != null)
- {
+ if (room != null) {
Rooms.Add(room);
}
}
- else if (stateEvent.Type == "m.room.member")
- {
+ else if (stateEvent.Type == "m.room.member") {
var serverName = stateEvent.StateKey.Split(':').Last();
- if (!ServersInSpace.Contains(serverName))
- {
+ if (!ServersInSpace.Contains(serverName)) {
ServersInSpace.Add(serverName);
}
}
}
-
- // 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!");
- // }
+
+ // 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)
- {
+
+ private async Task JoinAllRooms() {
+ foreach (var room in Rooms) {
room.JoinAsync(ServersInSpace.ToArray());
}
}
diff --git a/MatrixRoomUtils.Web/Pages/RoomManager/RoomManagerTimeline.razor b/MatrixRoomUtils.Web/Pages/RoomManager/RoomManagerTimeline.razor
index a8a7fc2..2db7cab 100644
--- a/MatrixRoomUtils.Web/Pages/RoomManager/RoomManagerTimeline.razor
+++ b/MatrixRoomUtils.Web/Pages/RoomManager/RoomManagerTimeline.razor
@@ -1,12 +1,10 @@
@page "/RoomManager/Timeline/{RoomId}"
@using MatrixRoomUtils.Web.Shared.TimelineComponents
-@using MatrixRoomUtils.Core.Extensions
<h3>RoomManagerTimeline</h3>
<hr/>
<p>Loaded @Events.Count events...</p>
-@foreach (var evt in Events)
-{
+@foreach (var evt in Events) {
<div type="@evt.Type" key="@evt.StateKey" itemid="@evt.EventId">
<DynamicComponent Type="@ComponentType(evt)" Parameters="@(new Dictionary<string, object> { { "Event", evt }, { "Events", Events } })"></DynamicComponent>
</div>
@@ -17,18 +15,16 @@
[Parameter]
public string RoomId { get; set; } = "invalid!!!!!!";
- private List<MessagesResponse> Messages { get; set; } = new();
- private List<StateEventResponse> Events { get; set; } = new();
+ private List<MessagesResponse> Messages { get; } = new();
+ private List<StateEventResponse> Events { get; } = new();
- protected override async Task OnInitializedAsync()
- {
+ protected override async Task OnInitializedAsync() {
await LocalStorageWrapper.LoadFromLocalStorage(LocalStorage);
RoomId = RoomId.Replace('~', '.');
Console.WriteLine("RoomId: " + RoomId);
var room = await RuntimeCache.CurrentHomeServer.GetRoom(RoomId);
MessagesResponse? msgs = null;
- do
- {
+ do {
msgs = await room.GetMessagesAsync(limit: 250, from: msgs?.End, dir: "b");
Messages.Add(msgs);
Console.WriteLine($"Got {msgs.Chunk.Count} messages");
@@ -37,13 +33,11 @@
StateHasChanged();
} while (msgs.End != null);
-
await base.OnInitializedAsync();
}
private StateEventResponse GetProfileEventBefore(StateEventResponse Event) => Events.TakeWhile(x => x != Event).Last(e => e.Type == "m.room.member" && e.StateKey == Event.Sender);
-
private Type ComponentType(StateEventResponse Event) => Event.Type switch {
"m.room.message" => typeof(TimelineMessageItem),
"m.room.member" => typeof(TimelineMemberItem),
diff --git a/MatrixRoomUtils.Web/Pages/RoomState/RoomStateEditorPage.razor b/MatrixRoomUtils.Web/Pages/RoomState/RoomStateEditorPage.razor
index 3037dcc..74f4f92 100644
--- a/MatrixRoomUtils.Web/Pages/RoomState/RoomStateEditorPage.razor
+++ b/MatrixRoomUtils.Web/Pages/RoomState/RoomStateEditorPage.razor
@@ -12,8 +12,7 @@
<br/>
<InputSelect @bind-Value="shownStateKey">
<option value="">-- State key --</option>
- @foreach (var stateEvent in FilteredEvents.Where(x => x.StateKey != "").Select(x => x.StateKey).Distinct().OrderBy(x => x))
- {
+ @foreach (var stateEvent in FilteredEvents.Where(x => x.StateKey != "").Select(x => x.StateKey).Distinct().OrderBy(x => x)) {
<option value="@stateEvent">@stateEvent</option>
Console.WriteLine(stateEvent);
}
@@ -21,8 +20,7 @@
<br/>
<InputSelect @bind-Value="shownType">
<option value="">-- Type --</option>
- @foreach (var stateEvent in FilteredEvents.Where(x => x.StateKey != shownStateKey).Select(x => x.Type).Distinct().OrderBy(x => x))
- {
+ @foreach (var stateEvent in FilteredEvents.Where(x => x.StateKey != shownStateKey).Select(x => x.Type).Distinct().OrderBy(x => x)) {
<option value="@stateEvent">@stateEvent</option>
}
</InputSelect>
@@ -45,12 +43,10 @@
public List<StateEventResponse> Events { get; set; } = new();
public string status = "";
- protected override async Task OnInitializedAsync()
- {
+ protected override async Task OnInitializedAsync() {
await LocalStorageWrapper.LoadFromLocalStorage(LocalStorage);
await base.OnInitializedAsync();
- if (RuntimeCache.CurrentHomeServer != null)
- {
+ if (RuntimeCache.CurrentHomeServer != null) {
NavigationManager.NavigateTo("/Login");
return;
}
@@ -61,34 +57,29 @@
private DateTime _lastUpdate = DateTime.Now;
- private async Task LoadStatesAsync()
- {
- int StateLoaded = 0;
+ private async Task LoadStatesAsync() {
+ var StateLoaded = 0;
using var client = new HttpClient();
- //TODO: can this be improved?
+ //TODO: can this be improved?
client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", RuntimeCache.CurrentHomeServer.AccessToken);
var response = await client.GetAsync($"{RuntimeCache.CurrentHomeServer.FullHomeServerDomain}/_matrix/client/r0/rooms/{RoomId}/state");
// var response = await client.GetAsync($"http://localhost:5117/matrix-hq-state.json");
//var _events = await response.Content.ReadFromJsonAsync<Queue<StateEventStruct>>();
var _data = await response.Content.ReadAsStreamAsync();
var __events = JsonSerializer.DeserializeAsyncEnumerable<StateEventResponse>(_data);
- await foreach (var _ev in __events)
- {
- var e = new StateEventResponse()
- {
+ await foreach (var _ev in __events) {
+ var e = new StateEventResponse {
Type = _ev.Type,
StateKey = _ev.StateKey,
OriginServerTs = _ev.OriginServerTs,
Content = _ev.Content
};
Events.Add(e);
- if (string.IsNullOrEmpty(e.StateKey))
- {
+ if (string.IsNullOrEmpty(e.StateKey)) {
FilteredEvents.Add(e);
}
StateLoaded++;
- if ((DateTime.Now - _lastUpdate).TotalMilliseconds > 100)
- {
+ if ((DateTime.Now - _lastUpdate).TotalMilliseconds > 100) {
_lastUpdate = DateTime.Now;
status = $"Loaded {StateLoaded} state events";
StateHasChanged();
@@ -99,8 +90,7 @@
StateHasChanged();
}
- private async Task RebuildFilteredData()
- {
+ private async Task RebuildFilteredData() {
status = "Rebuilding filtered data...";
StateHasChanged();
await Task.Delay(1);
@@ -112,16 +102,14 @@
StateHasChanged();
await Task.Delay(1);
FilteredEvents = _FilteredEvents;
-
- if(_shownType != null)
+
+ if (_shownType != null)
shownEventJson = _FilteredEvents.Where(x => x.Type == _shownType).First().Content.ToJson(indent: true, ignoreNull: true);
-
+
StateHasChanged();
}
-
- public struct PreRenderedStateEvent
- {
+ public struct PreRenderedStateEvent {
public string content { get; set; }
public long origin_server_ts { get; set; }
public string state_key { get; set; }
@@ -132,11 +120,9 @@
// public string ReplacesState { get; set; }
}
- public bool ShowMembershipEvents
- {
+ public bool ShowMembershipEvents {
get => _showMembershipEvents;
- set
- {
+ set {
_showMembershipEvents = value;
RebuildFilteredData();
}
@@ -146,21 +132,17 @@
private string _shownStateKey;
private string _shownType;
- private string shownStateKey
- {
+ private string shownStateKey {
get => _shownStateKey;
- set
- {
+ set {
_shownStateKey = value;
RebuildFilteredData();
}
}
- private string shownType
- {
+ private string shownType {
get => _shownType;
- set
- {
+ set {
_shownType = value;
RebuildFilteredData();
}
diff --git a/MatrixRoomUtils.Web/Pages/RoomState/RoomStateRoomList.razor b/MatrixRoomUtils.Web/Pages/RoomState/RoomStateRoomList.razor
index c654b13..82b5d75 100644
--- a/MatrixRoomUtils.Web/Pages/RoomState/RoomStateRoomList.razor
+++ b/MatrixRoomUtils.Web/Pages/RoomState/RoomStateRoomList.razor
@@ -3,16 +3,15 @@
@inject NavigationManager NavigationManager
<h3>Room state viewer - Room list</h3>
<hr/>
-@if (Rooms.Count == 0)
-{
+@if (Rooms.Count == 0) {
<p>You are not in any rooms!</p>
@* <p>Loading progress: @checkedRoomCount/@totalRoomCount</p> *@
}
-else
-{
- @foreach (var room in Rooms)
- {
- <a style="color: unset; text-decoration: unset;" href="/RoomStateViewer/@room.Replace('.','~')"><RoomListItem RoomId="@room"></RoomListItem></a>
+else {
+ @foreach (var room in Rooms) {
+ <a style="color: unset; text-decoration: unset;" href="/RoomStateViewer/@room.Replace('.', '~')">
+ <RoomListItem RoomId="@room"></RoomListItem>
+ </a>
}
<div style="margin-bottom: 4em;"></div>
}
@@ -21,16 +20,16 @@ else
@code {
public List<string> Rooms { get; set; } = new();
- protected override async Task OnInitializedAsync()
- {
+
+ protected override async Task OnInitializedAsync() {
await LocalStorageWrapper.LoadFromLocalStorage(LocalStorage);
await base.OnInitializedAsync();
- if (RuntimeCache.CurrentHomeServer == null)
- {
+ if (RuntimeCache.CurrentHomeServer == null) {
NavigationManager.NavigateTo("/Login");
return;
}
- Rooms = (await RuntimeCache.CurrentHomeServer.GetJoinedRooms()).Select(x=>x.RoomId).ToList();
+ Rooms = (await RuntimeCache.CurrentHomeServer.GetJoinedRooms()).Select(x => x.RoomId).ToList();
Console.WriteLine("Fetched joined rooms!");
}
-}
\ No newline at end of file
+
+}
\ No newline at end of file
diff --git a/MatrixRoomUtils.Web/Pages/RoomState/RoomStateViewerPage.razor b/MatrixRoomUtils.Web/Pages/RoomState/RoomStateViewerPage.razor
index c7f9f3c..bfd4d10 100644
--- a/MatrixRoomUtils.Web/Pages/RoomState/RoomStateViewerPage.razor
+++ b/MatrixRoomUtils.Web/Pages/RoomState/RoomStateViewerPage.razor
@@ -1,7 +1,7 @@
@page "/RoomStateViewer/{RoomId}"
+@using MatrixRoomUtils.Core.Extensions
@using System.Net.Http.Headers
@using System.Text.Json
-@using MatrixRoomUtils.Core.Extensions
@inject ILocalStorageService LocalStorage
@inject NavigationManager NavigationManager
<h3>Room state viewer - Viewing @RoomId</h3>
@@ -19,8 +19,7 @@
</tr>
</thead>
<tbody>
- @foreach (var stateEvent in FilteredEvents.Where(x => x.state_key == "").OrderBy(x => x.origin_server_ts))
- {
+ @foreach (var stateEvent in FilteredEvents.Where(x => x.state_key == "").OrderBy(x => x.origin_server_ts)) {
<tr>
<td>@stateEvent.type</td>
<td style="max-width: fit-Content;">
@@ -31,8 +30,7 @@
</tbody>
</table>
-@foreach (var group in FilteredEvents.GroupBy(x => x.state_key).OrderBy(x => x.Key).Where(x => x.Key != ""))
-{
+@foreach (var group in FilteredEvents.GroupBy(x => x.state_key).OrderBy(x => x.Key).Where(x => x.Key != "")) {
<details>
<summary>@group.Key</summary>
<table class="table table-striped table-hover" style="width: fit-Content;">
@@ -43,8 +41,7 @@
</tr>
</thead>
<tbody>
- @foreach (var stateEvent in group.OrderBy(x => x.origin_server_ts))
- {
+ @foreach (var stateEvent in group.OrderBy(x => x.origin_server_ts)) {
<tr>
<td>@stateEvent.type</td>
<td style="max-width: fit-Content;">
@@ -72,12 +69,10 @@
public List<PreRenderedStateEvent> Events { get; set; } = new();
public string status = "";
- protected override async Task OnInitializedAsync()
- {
+ protected override async Task OnInitializedAsync() {
await LocalStorageWrapper.LoadFromLocalStorage(LocalStorage);
await base.OnInitializedAsync();
- if (RuntimeCache.CurrentHomeServer == null)
- {
+ if (RuntimeCache.CurrentHomeServer == null) {
NavigationManager.NavigateTo("/Login");
return;
}
@@ -85,56 +80,50 @@
await LoadStatesAsync();
Console.WriteLine("Policy list editor initialized!");
}
+
private DateTime _lastUpdate = DateTime.Now;
- private async Task LoadStatesAsync()
- {
- int StateLoaded = 0;
- //TODO: can we improve this?
+ private async Task LoadStatesAsync() {
+ var StateLoaded = 0;
+ //TODO: can we improve this?
using var client = new HttpClient();
client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", RuntimeCache.CurrentHomeServer.AccessToken);
- var response = await client.GetAsync($"{RuntimeCache.CurrentHomeServer.FullHomeServerDomain}/_matrix/client/r0/rooms/{RoomId}/state");
- // var response = await client.GetAsync($"http://localhost:5117/matrix-hq-state.json");
+ var response = await client.GetAsync($"{RuntimeCache.CurrentHomeServer.FullHomeServerDomain}/_matrix/client/r0/rooms/{RoomId}/state");
+ // var response = await client.GetAsync($"http://localhost:5117/matrix-hq-state.json");
//var _events = await response.Content.ReadFromJsonAsync<Queue<StateEventStruct>>();
var _data = await response.Content.ReadAsStreamAsync();
var __events = JsonSerializer.DeserializeAsyncEnumerable<StateEventStruct>(_data);
- await foreach (var _ev in __events)
- {
- var e = new PreRenderedStateEvent()
- {
+ await foreach (var _ev in __events) {
+ var e = new PreRenderedStateEvent {
type = _ev.type,
state_key = _ev.state_key,
origin_server_ts = _ev.origin_server_ts,
- content = _ev.content.ToJson(indent: true, ignoreNull: true),
+ content = _ev.content.ToJson(true, true)
};
Events.Add(e);
- if (string.IsNullOrEmpty(e.state_key))
- {
+ if (string.IsNullOrEmpty(e.state_key)) {
FilteredEvents.Add(e);
}
StateLoaded++;
- if ((DateTime.Now - _lastUpdate).TotalMilliseconds > 100)
- {
+ if ((DateTime.Now - _lastUpdate).TotalMilliseconds > 100) {
_lastUpdate = DateTime.Now;
status = $"Loaded {StateLoaded} state events";
StateHasChanged();
await Task.Delay(0);
}
-
}
StateHasChanged();
}
- private async Task RebuildFilteredData()
- {
+ private async Task RebuildFilteredData() {
status = "Rebuilding filtered data...";
StateHasChanged();
await Task.Delay(1);
var _FilteredEvents = Events;
if (!ShowMembershipEvents)
_FilteredEvents = _FilteredEvents.Where(x => x.type != "m.room.member").ToList();
-
+
status = "Done, rerendering!";
StateHasChanged();
await Task.Delay(1);
@@ -142,9 +131,7 @@
StateHasChanged();
}
-
- public struct PreRenderedStateEvent
- {
+ public struct PreRenderedStateEvent {
public string content { get; set; }
public long origin_server_ts { get; set; }
public string state_key { get; set; }
@@ -155,11 +142,9 @@
// public string ReplacesState { get; set; }
}
- public bool ShowMembershipEvents
- {
+ public bool ShowMembershipEvents {
get => _showMembershipEvents;
- set
- {
+ set {
_showMembershipEvents = value;
RebuildFilteredData();
}
|