@page "/PolicyListEditor/{RoomId}" @using MatrixRoomUtils.Authentication @using MatrixRoomUtils.Web.Classes @using Blazored.LocalStorage @using System.Net.Http.Headers @using System.Text.Json @using MatrixRoomUtils.Extensions @using MatrixRoomUtils.StateEventTypes @inject ILocalStorageService LocalStorage @inject NavigationManager NavigationManager

Policy list editor

This policy list contains @PolicyEvents.Count(x => x.type == "m.policy.rule.server") server bans, @PolicyEvents.Count(x => x.type == "m.policy.rule.room") room bans and @PolicyEvents.Count(x => x.type == "m.policy.rule.user") user bans.

@if (!PolicyEvents.Any(x => x.type == "m.policy.rule.server")) {

No server policies

} else {

Server policies


@foreach (var policyEvent in PolicyEvents.Where(x => x.type == "m.policy.rule.server" && x.content.Entity != null)) { }
Server Reason Expires Actions
Entity: @policyEvent.content.Entity
State: @policyEvent.state_key
@policyEvent.content.Reason @policyEvent.content.ExpiryDateTime
Invalid events @foreach (var policyEvent in PolicyEvents.Where(x => x.type == "m.policy.rule.server" && x.content.Entity == null)) { }
State key Serialised contents
@policyEvent.state_key @policyEvent.content.ToJson(indent: false, ignoreNull: true)
} @if (!PolicyEvents.Any(x => x.type == "m.policy.rule.room")) {

No room policies

} else {

Room policies


@foreach (var policyEvent in PolicyEvents.Where(x => x.type == "m.policy.rule.room" && x.content.Entity != null)) { }
Room Reason Expires Actions
Entity: @policyEvent.content.Entity
State: @policyEvent.state_key
@policyEvent.content.Reason @policyEvent.content.ExpiryDateTime
Invalid events @foreach (var policyEvent in PolicyEvents.Where(x => x.type == "m.policy.rule.room" && x.content.Entity == null)) { }
State key Serialised contents
@policyEvent.state_key @policyEvent.content.ToJson(indent: false, ignoreNull: true)
} @if (!PolicyEvents.Any(x => x.type == "m.policy.rule.user")) {

No user policies

} else {

User policies


@foreach (var policyEvent in PolicyEvents.Where(x => x.type == "m.policy.rule.user" && x.content.Entity != null)) { }
User Reason Expires Actions
Entity: @string.Join("", policyEvent.content.Entity.Take(64))
State: @string.Join("",policyEvent.state_key.Take(64))
@policyEvent.content.Reason @policyEvent.content.ExpiryDateTime
Invalid events @foreach (var policyEvent in PolicyEvents.Where(x => x.type == "m.policy.rule.user" && x.content.Entity == null)) { }
State key Serialised contents
@policyEvent.state_key @policyEvent.content.ToJson(indent: false, ignoreNull: true)
} @code { //get room list // - sync withroom list filter // type = support.feline.msc3784 //support.feline.policy.lists.msc.v1 [Parameter] public string? RoomId { get; set; } public List> PolicyEvents { get; set; } = new(); protected override async Task OnInitializedAsync() { if (!RuntimeStorage.WasLoaded) await RuntimeStorage.LoadFromLocalStorage(LocalStorage); await base.OnInitializedAsync(); if(RuntimeStorage.AccessToken == null || RuntimeStorage.CurrentHomeserver == null) { NavigationManager.NavigateTo("/Login"); return; } RoomId = RoomId.Replace('~', '.'); await LoadStatesAsync(); Console.WriteLine("Policy list editor initialized!"); } private async Task LoadStatesAsync() { using var client = new HttpClient(); client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", RuntimeStorage.AccessToken); var response = await client.GetAsync($"{RuntimeStorage.CurrentHomeserver}/_matrix/client/r0/rooms/{RoomId}/state"); var content = await response.Content.ReadAsStringAsync(); // Console.WriteLine(JsonSerializer.Deserialize(content).ToJson()); var stateEvents = JsonSerializer.Deserialize>(content); PolicyEvents = stateEvents.Where(x => x.type.StartsWith("m.policy.rule")) .Select(x => JsonSerializer.Deserialize>(JsonSerializer.Serialize(x))).ToList(); StateHasChanged(); // foreach (var stateEvent in PolicyEvents.Where(x => x.replaces_state != "" && x.replaces_state != null)) // { // Console.WriteLine($"{stateEvent.replaces_state} -> {PolicyEvents.Any(x => x.state_key == stateEvent.replaces_state)}"); // } // foreach (var policyEvent in PolicyEvents) // { // Console.WriteLine(policyEvent.ToJson()); // } } }