about summary refs log tree commit diff
path: root/MatrixUtils.Web/Pages/Moderation/DraupnirProtectedRoomsEditor.razor
blob: f9cbfa2ab2740b4080d7c735784753dd8a0ef965 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
@page "/Moderation/DraupnirProtectedRoomsEditor"
@using System.Text.Json.Serialization
@using LibMatrix.EventTypes.Spec.State
@using LibMatrix.RoomTypes
<h3>Edit Draupnir protected rooms</h3>
<hr/>

@if (data is not null) {
    <div class="row">
        <div class="col-12">
            <h4>Current rooms</h4>
            <ul>
                @foreach (var room in data.Rooms) {
                    <li>@room</li>
                }
            </ul>
            <hr/>
            <h4>Tickyboxes</h4>
            <table class="table">
                <thead>
                    <tr>
                        <th></th> @* Checkbox column *@
                        <th>Kick?</th> @* PL > kick *@
                        <th>Ban?</th> @* PL > ban *@
                        <th>ACL?</th> @* PL > m.room.server_acls event *@
                        <th>Room ID</th>
                        <th>Room name</th>
                    </tr>
                </thead>
                <tbody>
                    @foreach (var room in Rooms.OrderBy(x => x.RoomName)) {
                        <tr>
                            <td>
                                <input type="checkbox" @bind="room.IsProtected"/>
                            </td>
                            <td>@(room.PowerLevels.Kick <= room.PowerLevels.GetUserPowerLevel(hs.UserId) ? "X" : "")</td>
                            <td>@(room.PowerLevels.Ban <= room.PowerLevels.GetUserPowerLevel(hs.UserId) ? "X" : "")</td>
                            <td>@(room.PowerLevels.UserHasStatePermission(hs.UserId, RoomServerACLEventContent.EventId) ? "X" : "")</td>
                            <td>@room.Room.RoomId</td>
                            <td>@room.RoomName</td>
                        </tr>
                    }
                </tbody>
            </table>
        </div>
    </div>
}
<br/>
<LinkButton OnClick="@Apply">Apply</LinkButton>


@code {
    private DraupnirProtectedRoomsData data { get; set; } = new();
    private List<EditorRoomInfo> 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<DraupnirProtectedRoomsData>("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<string> 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);
    }

}