From 03fff12b37c54e4bc12b7411635b537c4dbbf7f6 Mon Sep 17 00:00:00 2001 From: Rory& Date: Thu, 8 May 2025 21:37:53 +0200 Subject: Deduplicate bans on mass policy add --- .../MassPolicyEditorModal.razor | 69 ++++++++++++++++++---- 1 file 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 - + Policy type:
- + Reason: -
- + +
+ Recommendation: -
+ +
Entities:
-
- - + +
+ + @*
*@ @* JSON data *@ @*
 *@
     @*             $1$ @PolicyEvent.ToJson(true, true) #1# *@
     @*     
*@ @*
*@ - Cancel - Save + Cancel + + Save +
@@ -56,6 +68,10 @@ private static Dictionary PolicyTypes = KnownPolicyTypes .ToDictionary(x => x.GetCustomAttributes().First(y => !string.IsNullOrWhiteSpace(y.EventName)).EventName, x => x); + private static FrozenSet AllKnownPolicyTypes = KnownPolicyTypes + .SelectMany(x => x.GetCustomAttributes().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(); } -- cgit 1.5.1