@page "/Tools/Moderation/Draupnir/ProtectionsEditor" @using System.Text.Json.Serialization @using LibMatrix @using LibMatrix.EventTypes.Spec.State.RoomInfo @using LibMatrix.RoomTypes

Edit Draupnir protected rooms


Note: You will need to restart Draupnir after applying changes!

Minor note: This should also work with Mjolnir, but this hasn't been tested, and as such functionality cannot be guaranteed.

@if (data is not null) {

Current rooms


Tickyboxes

@* Checkbox column *@ @* PL > kick *@ @* PL > ban *@ @* PL > m.room.server_acls event *@ @foreach (var room in Rooms.OrderBy(x => x.RoomName)) { }
Kick?Ban?ACL?Room ID Room name
@(room.PowerLevels.Kick <= room.PowerLevels.GetUserPowerLevel(hs.UserId) ? "X" : "") @(room.PowerLevels.Ban <= room.PowerLevels.GetUserPowerLevel(hs.UserId) ? "X" : "") @(room.PowerLevels.UserHasStatePermission(hs.UserId, RoomServerAclEventContent.EventId) ? "X" : "") @room.Room.RoomId @room.RoomName
}
Apply @code { private DraupnirProtectedRoomsData data { get; set; } = new(); private List Rooms { get; set; } = new(); private AuthenticatedHomeserverGeneric hs { get; set; } protected override async Task OnInitializedAsync() { hs = await sessionStore.GetCurrentHomeserver(navigateOnFailure: true); if (hs is null) return; data = await hs.GetAccountDataAsync("org.matrix.mjolnir.protected_rooms"); StateHasChanged(); var tasks = (await hs.GetJoinedRooms()).Select(async room => { var plTask = room.GetPowerLevelsAsync(); var roomNameTask = room.GetNameOrFallbackAsync(); var EditorRoomInfo = new EditorRoomInfo { Room = room, IsProtected = data.Rooms.Contains(room.RoomId), RoomName = await roomNameTask, PowerLevels = await plTask }; Rooms.Add(EditorRoomInfo); StateHasChanged(); return Task.CompletedTask; }).ToList(); await Task.WhenAll(tasks); await Task.Delay(500); foreach (var protectedRoomId in data.Rooms) { if (Rooms.Any(x => x.Room.RoomId == protectedRoomId)) continue; var room = hs.GetRoom(protectedRoomId); var editorRoomInfo = new EditorRoomInfo { Room = room, IsProtected = true }; try { var pl = await room.GetPowerLevelsAsync(); editorRoomInfo.PowerLevels = pl; } catch (MatrixException e) { Console.WriteLine($"Failed to get power levels for {room.RoomId}: {e}"); } try { editorRoomInfo.RoomName = await room.GetNameOrFallbackAsync(); } catch (MatrixException e) { Console.WriteLine($"Failed to get name for {room.RoomId}: {e}"); } try { var membership = await room.GetStateEventOrNullAsync(hs.UserId); if (membership is not null) { editorRoomInfo.RoomName = $"(!! {membership.ContentAs()?.Membership ?? "null"} !!) {editorRoomInfo.RoomName}"; } } catch (MatrixException e) { Console.WriteLine($"Failed to get membership for {room.RoomId}: {e}"); } Rooms.Add(editorRoomInfo); } StateHasChanged(); } private class DraupnirProtectedRoomsData { [JsonPropertyName("rooms")] public List Rooms { get; set; } = new(); } private class EditorRoomInfo { public GenericRoom Room { get; set; } public bool IsProtected { get; set; } public string RoomName { get; set; } public RoomPowerLevelEventContent PowerLevels { get; set; } } private async Task Apply() { Console.WriteLine(string.Join('\n', Rooms.Where(x => x.IsProtected).Select(x => x.Room.RoomId))); data.Rooms = Rooms.Where(x => x.IsProtected).Select(x => x.Room.RoomId).ToList(); await hs.SetAccountDataAsync("org.matrix.mjolnir.protected_rooms", data); } }