@page "/Moderation/DraupnirProtectedRoomsEditor"
@page "/Tools/Moderation/DraupnirProtectedRoomsEditor"
@using System.Text.Json.Serialization
@using LibMatrix.EventTypes.Spec.State
@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
@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 RMUStorage.GetCurrentSessionOrNavigate();
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);
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);
}
}