Deduplicate bans on mass policy add
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();
}
|