about summary refs log tree commit diff
diff options
context:
space:
mode:
authorRory& <root@rory.gay>2025-05-08 21:37:53 +0200
committerRory& <root@rory.gay>2025-05-08 21:37:53 +0200
commit03fff12b37c54e4bc12b7411635b537c4dbbf7f6 (patch)
tree36fbfa74c4e618764622da58c210b54e2165fca4
parentFix room shutdown, room query (WIP) (diff)
downloadMatrixUtils-03fff12b37c54e4bc12b7411635b537c4dbbf7f6.tar.xz
Deduplicate bans on mass policy add
-rw-r--r--MatrixUtils.Web/Shared/PolicyEditorComponents/MassPolicyEditorModal.razor69
1 files changed, 56 insertions, 13 deletions
diff --git a/MatrixUtils.Web/Shared/PolicyEditorComponents/MassPolicyEditorModal.razor b/MatrixUtils.Web/Shared/PolicyEditorComponents/MassPolicyEditorModal.razor

index 11ba18a..4ab899c 100644 --- a/MatrixUtils.Web/Shared/PolicyEditorComponents/MassPolicyEditorModal.razor +++ b/MatrixUtils.Web/Shared/PolicyEditorComponents/MassPolicyEditorModal.razor
@@ -5,8 +5,9 @@ @using System.Collections.Frozen @using LibMatrix.EventTypes @using LibMatrix.RoomTypes -<ModalWindow Title="@("Creating many new " + (PolicyTypes.ContainsKey(MappedType??"") ? PolicyTypes[MappedType!].GetFriendlyNamePluralOrNull()?.ToLower() ?? PolicyTypes[MappedType!].Name : "event"))" - OnCloseClicked="@OnClose" X="60" Y="60" MinWidth="600"> +<ModalWindow + Title="@("Creating many new " + (PolicyTypes.ContainsKey(MappedType ?? "") ? PolicyTypes[MappedType!].GetFriendlyNamePluralOrNull()?.ToLower() ?? PolicyTypes[MappedType!].Name : "event"))" + OnCloseClicked="@OnClose" X="60" Y="60" MinWidth="600"> <span>Policy type:</span> <select @bind="@MappedType"> <option>Select a value</option> @@ -14,25 +15,36 @@ <option value="@type">@mappedType.GetFriendlyName().ToLower()</option> } </select><br/> - + <span>Reason:</span> - <FancyTextBox @bind-Value="@Reason"></FancyTextBox><br/> - + <FancyTextBox @bind-Value="@Reason"></FancyTextBox> + <br/> + <span>Recommendation:</span> - <FancyTextBox @bind-Value="@Recommendation"></FancyTextBox><br/> + <FancyTextBox @bind-Value="@Recommendation"></FancyTextBox> + <br/> <span>Entities:</span><br/> - <InputTextArea @bind-Value="@Users" style="width: 500px;"></InputTextArea><br/> - - + <InputTextArea @bind-Value="@Users" style="width: 500px;"></InputTextArea> + <br/> + + @* <details> *@ @* <summary>JSON data</summary> *@ @* <pre> *@ @* $1$ @PolicyEvent.ToJson(true, true) #1# *@ @* </pre> *@ @* </details> *@ - <LinkButton OnClick="@(() => { OnClose.Invoke(); return Task.CompletedTask; })"> Cancel </LinkButton> - <LinkButton OnClick="@(() => { _ = Save(); return Task.CompletedTask; })"> Save </LinkButton> + <LinkButton OnClick="@(() => { + OnClose.Invoke(); + return Task.CompletedTask; + })"> Cancel + </LinkButton> + <LinkButton OnClick="@(() => { + _ = Save(); + return Task.CompletedTask; + })"> Save + </LinkButton> </ModalWindow> @@ -56,6 +68,10 @@ private static Dictionary<string, Type> PolicyTypes = KnownPolicyTypes .ToDictionary(x => x.GetCustomAttributes<MatrixEventAttribute>().First(y => !string.IsNullOrWhiteSpace(y.EventName)).EventName, x => x); + private static FrozenSet<string> AllKnownPolicyTypes = KnownPolicyTypes + .SelectMany(x => x.GetCustomAttributes<MatrixEventAttribute>().Select(y => y.EventName)) + .ToFrozenSet(); + private string? MappedType { get; set; } private async Task Save() { @@ -68,12 +84,39 @@ } private async Task DoActualSave() { + if (string.IsNullOrWhiteSpace(MappedType)) { + Console.WriteLine("No type selected"); + return; + } + + if (string.IsNullOrWhiteSpace(Users)) { + Console.WriteLine("No users selected"); + return; + } + Console.WriteLine($"Saving ---"); Console.WriteLine($"Users = {Users}"); - var users = Users.Split("\n").Select(x => x.Trim()).Where(x => x.StartsWith('@')).ToList(); + + var users = Users.Split("\n") + .Select(x => x.Trim()) + .Where(x => x.StartsWith('@')) + .Distinct() + .ToList(); + await foreach (var evt in Room.GetFullStateAsync()) { + if (evt is null + || !AllKnownPolicyTypes.Contains(evt.Type) + || !evt.TypedContent!.GetType().IsAssignableTo(PolicyTypes[MappedType!]) + ) continue; + + if (evt.TypedContent is PolicyRuleEventContent content && content.Recommendation == Recommendation && content.Reason == Reason) { + if (content.Entity != null && users.Contains(content.Entity)) + users.Remove(content.Entity); + } + } + var tasks = users.Select(x => ExecuteBan(Room, x)).ToList(); await Task.WhenAll(tasks); - + OnSaved.Invoke(); }