@page "/Moderation/DraupnirProtectedRoomsEditor"
@page "/Tools/Moderation/DraupnirProtectedRoomsEditor"
@page "/Tools/Moderation/Draupnir/ProtectedRoomsEditor"
@using LibMatrix
@using LibMatrix.EventTypes.Interop.Draupnir
@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) {
Currently protected room IDs
@foreach (var room in data.Rooms) {
- @room
}
Tickyboxes
}
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(DraupnirProtectedRoomsData.EventId);
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 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);
}
}