diff --git a/MatrixRoomUtils.Web/Pages/HSAdmin/HSAdmin.razor b/MatrixRoomUtils.Web/Pages/HSAdmin/HSAdmin.razor
deleted file mode 100644
index d1a2df5..0000000
--- a/MatrixRoomUtils.Web/Pages/HSAdmin/HSAdmin.razor
+++ /dev/null
@@ -1,34 +0,0 @@
-@page "/HSAdmin"
-@using LibMatrix.Homeservers
-@using ArcaneLibs.Extensions
-<h3>Homeserver Admininistration</h3>
-<hr/>
-
-@if (Homeserver is null) {
- <p>Homeserver is null...</p>
-}
-else {
- @if (Homeserver is AuthenticatedHomeserverSynapse) {
- <h4>Synapse tools</h4>
- <hr/>
- <a href="/HSAdmin/RoomQuery">Query rooms</a>
- }
- else {
- <p>Homeserver type @Homeserver.GetType().Name does not have any administration tools in MRU.</p>
- <p>Server info:</p>
- <pre>@ServerVersionResponse?.ToJson(ignoreNull: true)</pre>
- }
-}
-
-@code {
- public AuthenticatedHomeserverGeneric? Homeserver { get; set; }
- public ServerVersionResponse? ServerVersionResponse { get; set; }
-
- protected override async Task OnInitializedAsync() {
- Homeserver = await MRUStorage.GetCurrentSessionOrNavigate();
- if (Homeserver is null) return;
- ServerVersionResponse = await (Homeserver.FederationClient?.GetServerVersionAsync() ?? Task.FromResult<ServerVersionResponse?>(null));
- await base.OnInitializedAsync();
- }
-
-}
\ No newline at end of file
diff --git a/MatrixRoomUtils.Web/Pages/HSAdmin/RoomQuery.razor b/MatrixRoomUtils.Web/Pages/HSAdmin/RoomQuery.razor
deleted file mode 100644
index 7e4058b..0000000
--- a/MatrixRoomUtils.Web/Pages/HSAdmin/RoomQuery.razor
+++ /dev/null
@@ -1,200 +0,0 @@
-@page "/HSAdmin/RoomQuery"
-@using LibMatrix.Responses.Admin
-@using LibMatrix.Filters
-@using LibMatrix.Homeservers
-@using ArcaneLibs.Extensions
-
-<h3>Homeserver Administration - Room Query</h3>
-
-<label>Search name: </label>
-<InputText @bind-Value="SearchTerm"/><br/>
-<label>Order by: </label>
-<select @bind="OrderBy">
- @foreach (var item in validOrderBy) {
- <option value="@item.Key">@item.Value</option>
- }
-</select><br/>
-<label>Ascending: </label>
-<InputCheckbox @bind-Value="Ascending"/><br/>
-<details>
- <summary>
- <span>Local filtering (slow)</span>
-
- </summary>
- <div style="margin-left: 8px; margin-bottom: 8px;">
- <u style="display: block;">String contains</u>
- <span class="tile tile280">Room ID: <FancyTextBox @bind-Value="@Filter.RoomIdContains"></FancyTextBox></span>
- <span class="tile tile280">Room name: <FancyTextBox @bind-Value="@Filter.NameContains"></FancyTextBox></span>
- <span class="tile tile280">Canonical alias: <FancyTextBox @bind-Value="@Filter.CanonicalAliasContains"></FancyTextBox></span>
- <span class="tile tile280">Creator: <FancyTextBox @bind-Value="@Filter.CreatorContains"></FancyTextBox></span>
- <span class="tile tile280">Room version: <FancyTextBox @bind-Value="@Filter.VersionContains"></FancyTextBox></span>
- <span class="tile tile280">Encryption algorithm: <FancyTextBox @bind-Value="@Filter.EncryptionContains"></FancyTextBox></span>
- <span class="tile tile280">Join rules: <FancyTextBox @bind-Value="@Filter.JoinRulesContains"></FancyTextBox></span>
- <span class="tile tile280">Guest access: <FancyTextBox @bind-Value="@Filter.GuestAccessContains"></FancyTextBox></span>
- <span class="tile tile280">History visibility: <FancyTextBox @bind-Value="@Filter.HistoryVisibilityContains"></FancyTextBox></span>
-
- <u style="display: block;">Optional checks</u>
- <span class="tile tile150">
- <InputCheckbox @bind-Value="@Filter.CheckFederation"></InputCheckbox> Is federated:
- @if (Filter.CheckFederation) {
- <InputCheckbox @bind-Value="@Filter.Federatable"></InputCheckbox>
- }
- </span>
- <span class="tile tile150">
- <InputCheckbox @bind-Value="@Filter.CheckPublic"></InputCheckbox> Is public:
- @if (Filter.CheckPublic) {
- <InputCheckbox @bind-Value="@Filter.Public"></InputCheckbox>
- }
- </span>
-
- <u style="display: block;">Ranges</u>
- <span class="tile center-children">
- <InputNumber max="@int.MaxValue" class="int-input" TValue="int" @bind-Value="@Filter.StateEventsGreaterThan"></InputNumber><span class="range-sep">state events</span><InputNumber max="@int.MaxValue" class="int-input" TValue="int" @bind-Value="@Filter.StateEventsLessThan"></InputNumber>
- </span>
- <span class="tile center-children">
- <InputNumber max="@int.MaxValue" class="int-input" TValue="int" @bind-Value="@Filter.JoinedMembersGreaterThan"></InputNumber><span class="range-sep">members</span><InputNumber max="@int.MaxValue" class="int-input" TValue="int" @bind-Value="@Filter.JoinedMembersLessThan"></InputNumber>
- </span>
- <span class="tile center-children">
- <InputNumber max="@int.MaxValue" class="int-input" TValue="int" @bind-Value="@Filter.JoinedLocalMembersGreaterThan"></InputNumber><span class="range-sep">local members</span><InputNumber max="@int.MaxValue" class="int-input" TValue="int" @bind-Value="@Filter.JoinedLocalMembersLessThan"></InputNumber>
- </span>
- </div>
-</details>
-<button class="btn btn-primary" @onclick="Search">Search</button>
-<br/>
-
-@if (Results.Count > 0) {
- <p>Found @Results.Count rooms</p>
- <details>
- <summary>TSV data (copy/paste)</summary>
- <pre style="font-size: 0.6em;">
- <table>
- @foreach (var res in Results) {
- <tr>
- <td style="padding: 8px;">@res.RoomId@("\t")</td>
- <td style="padding: 8px;">@res.CanonicalAlias@("\t")</td>
- <td style="padding: 8px;">@res.Creator@("\t")</td>
- <td style="padding: 8px;">@res.Name</td>
- </tr>
- }
- </table>
- </pre>
- </details>
-}
-
-@foreach (var res in Results) {
- <div style="background-color: #ffffff11; border-radius: 0.5em; display: block; margin-top: 4px; padding: 4px;">
- <RoomListItem RoomName="@res.Name" RoomId="@res.RoomId"></RoomListItem>
- <p>
- @if (!string.IsNullOrWhiteSpace(res.CanonicalAlias)) {
- <span>@res.CanonicalAlias (@res.RoomId)</span>
- <br/>
- }
- else {
- <span>@res.RoomId</span>
- <br/>
- }
- @if (!string.IsNullOrWhiteSpace(res.Creator)) {
- <span>Created by <InlineUserItem UserId="@res.Creator"></InlineUserItem></span>
- <br/>
- }
- </p>
- <span>@res.StateEvents state events</span><br/>
- <span>@res.JoinedMembers members, of which @res.JoinedLocalMembers are on this server</span>
- <details>
- <summary>Full result data</summary>
- <pre>@res.ToJson(ignoreNull: true)</pre>
- </details>
- </div>
-}
-
-<style>
- .int-input {
- width: 128px;
- }
- .tile {
- display: inline-block;
- padding: 4px;
- border: 1px solid #ffffff22;
- }
- .tile280 {
- min-width: 280px;
- }
- .tile150 {
- min-width: 150px;
- }
- .range-sep {
- display: inline-block;
- padding: 4px;
- width: 150px;
- }
- .range-sep::before {
- content: "@("<") ";
- }
- .range-sep::after {
- content: " @("<")";
- }
- .center-children {
- text-align: center;
- }
-</style>
-
-@code {
-
- [Parameter]
- [SupplyParameterFromQuery(Name = "order_by")]
- public string? OrderBy { get; set; }
-
- [Parameter]
- [SupplyParameterFromQuery(Name = "name_search")]
- public string SearchTerm { get; set; }
-
- [Parameter]
- [SupplyParameterFromQuery(Name = "ascending")]
- public bool Ascending { get; set; }
-
- public List<AdminRoomListingResult.AdminRoomListingResultRoom> Results { get; set; } = new();
-
- private string Status { get; set; }
-
- public LocalRoomQueryFilter Filter { get; set; } = new();
-
- protected override Task OnParametersSetAsync() {
- if (Ascending == null)
- Ascending = true;
- OrderBy ??= "name";
- return Task.CompletedTask;
- }
-
- private async Task Search() {
- Results.Clear();
- var hs = await MRUStorage.GetCurrentSessionOrNavigate();
- if (hs is AuthenticatedHomeserverSynapse synapse) {
- var searchRooms = synapse.Admin.SearchRoomsAsync(orderBy: OrderBy!, dir: Ascending ? "f" : "b", searchTerm: SearchTerm, localFilter: Filter).GetAsyncEnumerator();
- while (await searchRooms.MoveNextAsync()) {
- var room = searchRooms.Current;
- Console.WriteLine("Hit: " + room.ToJson(false));
- Results.Add(room);
- if (Results.Count % 10 == 0)
- StateHasChanged();
- }
- }
-
- }
-
- private readonly Dictionary<string, string> validOrderBy = new() {
- { "name", "Room name" },
- { "canonical_alias", "Main alias address" },
- { "joined_members", "Number of members (reversed)" },
- { "joined_local_members", "Number of local members (reversed)" },
- { "version", "Room version" },
- { "creator", "Creator of the room" },
- { "encryption", "End-to-end encryption algorithm" },
- { "federatable", "Is room federated" },
- { "public", "Visibility in room list" },
- { "join_rules", "Join rules" },
- { "guest_access", "Guest access" },
- { "history_visibility", "Visibility of history" },
- { "state_events", "Number of state events" }
- };
-
-}
diff --git a/MatrixRoomUtils.Web/Pages/HSAdmin/RoomQuery.razor.css b/MatrixRoomUtils.Web/Pages/HSAdmin/RoomQuery.razor.css
deleted file mode 100644
index e69de29..0000000
--- a/MatrixRoomUtils.Web/Pages/HSAdmin/RoomQuery.razor.css
+++ /dev/null
|