+
+@code {
+
+}
\ No newline at end of file
diff --git a/MatrixUtils.Web/Pages/HSAdmin/Synapse/Components/SynapseRoomShutdownWindowContent.razor b/MatrixUtils.Web/Pages/HSAdmin/Synapse/Components/SynapseRoomShutdownWindowContent.razor
new file mode 100644
index 0000000..d5daf75
--- /dev/null
+++ b/MatrixUtils.Web/Pages/HSAdmin/Synapse/Components/SynapseRoomShutdownWindowContent.razor
@@ -0,0 +1,113 @@
+@using LibMatrix.Homeservers.Extensions.NamedCaches
+@using LibMatrix.Homeservers.ImplementationDetails.Synapse.Models.Requests
+
+@if (string.IsNullOrWhiteSpace(Context.DeleteId)) {
+ Media options
+
+
+ Quarantine local media:
+
+
+ Quarantine remote media:
+
+
+ Delete remote media:
+
+
+
+ User options
+
+
+ Suspend local users:
+
+
+ Quarantine ALL local user media:
+
+
+ Delete ALL local user media:
+
+
+
+ Room deletion options
+
+
+ Block room:
+
+
+ Purge room:
+
+
+ Force purge room (unsafe):
+
+
+ Warning room User ID (optional):
+
+
+ @if (!string.IsNullOrWhiteSpace(Context.DeleteRequest.NewRoomUserId)) {
+ Warning room name:
+
+
+ Warning room message (plaintext):
+
+
+ }
+
+ Execute
+}
+
+@code {
+
+ [Parameter]
+ public required RoomShutdownContext Context { get; set; }
+
+ [Parameter]
+ public required AuthenticatedHomeserverSynapse Homeserver { get; set; }
+
+ private NamedCache TaskMap { get; set; } = null!;
+
+ protected override async Task OnInitializedAsync() {
+ TaskMap = new NamedCache(Homeserver, "gay.rory.matrixutils.synapse_room_shutdown_tasks");
+ }
+
+ public class RoomShutdownContext {
+ public required string RoomId { get; set; }
+ public string? DeleteId { get; set; }
+ public ExtraDeleteOptions ExtraOptions { get; set; } = new();
+
+ public SynapseAdminRoomDeleteRequest DeleteRequest { get; set; } = new() {
+ Block = true,
+ Purge = true,
+ ForcePurge = false
+ };
+
+ public class ExtraDeleteOptions {
+ // room options
+ public bool QuarantineLocalMedia { get; set; }
+ public bool QuarantineRemoteMedia { get; set; }
+
+ public bool DeleteRemoteMedia { get; set; }
+
+ // user options
+ public bool SuspendLocalUsers { get; set; }
+ public bool QuarantineLocalUserMedia { get; set; }
+ public bool DeleteLocalUserMedia { get; set; }
+ }
+ }
+
+ public async Task OnComplete() {
+ await OnCompleteLock.WaitAsync();
+ try {
+ await TaskMap.RemoveValueAsync(Context.DeleteId!);
+ }
+ finally {
+ OnCompleteLock.Release();
+ }
+ }
+
+ public async Task DeleteRoom() {
+ await TaskMap.SetValueAsync(Context.RoomId, Context);
+ }
+
+ private static readonly SemaphoreSlim OnCompleteLock = new(1, 1);
+
+}
\ No newline at end of file
diff --git a/MatrixUtils.Web/Pages/HSAdmin/Synapse/RoomQuery.razor b/MatrixUtils.Web/Pages/HSAdmin/Synapse/RoomQuery.razor
index 07af1dc..0a93df8 100644
--- a/MatrixUtils.Web/Pages/HSAdmin/Synapse/RoomQuery.razor
+++ b/MatrixUtils.Web/Pages/HSAdmin/Synapse/RoomQuery.razor
@@ -1,7 +1,10 @@
@page "/HSAdmin/Synapse/RoomQuery"
-@using LibMatrix.Responses.Admin
-@using LibMatrix.Filters
+@using Microsoft.AspNetCore.WebUtilities
@using ArcaneLibs.Extensions
+@using LibMatrix.Homeservers.ImplementationDetails.Synapse.Models.Filters
+@using LibMatrix.Homeservers.ImplementationDetails.Synapse.Models.Requests
+@using LibMatrix.Homeservers.ImplementationDetails.Synapse.Models.Responses
+@using MatrixUtils.Web.Pages.HSAdmin.Synapse.Components
Homeserver Administration - Room Query
@@ -48,13 +51,17 @@
Ranges
- state events
+ state events
- members
+ members
- local members
+ local members
@@ -98,41 +105,84 @@
}
+
+ Delete room
+
+
@res.StateEvents state events
- @res.JoinedMembers members, of which @res.JoinedLocalMembers are on this server
+ @if (res.LocalMembers is null) {
+ @res.JoinedMembers members, of which @res.JoinedLocalMembers are on this server
+ }
+ else {
+ @res.JoinedMembers members, of which @res.JoinedLocalMembers are on this server: @(string.Join(", ", res.LocalMembers))
+ }
Full result data