about summary refs log tree commit diff
diff options
context:
space:
mode:
authorRory& <root@rory.gay>2025-05-15 18:26:57 +0200
committerRory& <root@rory.gay>2025-05-15 18:26:57 +0200
commita8acdee82810351c4f438286b535c215f318df3f (patch)
treeaaa718b660450cadcffb8da71ed3bc534f15ea53
parentUpdate ArcaneLibs (diff)
downloadMatrixAntiDmSpam-a8acdee82810351c4f438286b535c215f318df3f.tar.xz
Fix bug removing all policies that arent user added, theoretically fix missing room_id bugfix
-rw-r--r--MatrixAntiDmSpam.Core/PolicyExecutor.cs51
-rw-r--r--MatrixAntiDmSpam/appsettings.Development.json2
2 files changed, 29 insertions, 24 deletions
diff --git a/MatrixAntiDmSpam.Core/PolicyExecutor.cs b/MatrixAntiDmSpam.Core/PolicyExecutor.cs

index 8a24995..96ec344 100644 --- a/MatrixAntiDmSpam.Core/PolicyExecutor.cs +++ b/MatrixAntiDmSpam.Core/PolicyExecutor.cs
@@ -99,31 +99,35 @@ public class PolicyExecutor( await homeserver.SetAccountDataAsync(IgnoredUserListEventContent.EventId, ignoreListContent); } - + private async Task<IgnoredUserListEventContent> FilterInvalidIgnoreListEntries() { - var ignoreList = await homeserver.GetAccountDataOrNullAsync<IgnoredUserListEventContent>(IgnoredUserListEventContent.EventId); - if (ignoreList != null) { - ignoreList.IgnoredUsers.RemoveAll((id, ignoredUserData) => { - if (ignoredUserData.AdditionalData is null) return false; - if (!ignoredUserData.AdditionalData.ContainsKey(MadsIgnoreMetadataContent.EventId)) return false; - var metadata = ignoredUserData.GetAdditionalData<JsonObject>(MadsIgnoreMetadataContent.EventId)!; - - if (metadata.ContainsKey("policies")) { - var policies = metadata["policies"]!.AsArray(); - - bool IsPolicyEntryValid(JsonNode? p) => - p!["room_id"]?.GetValue<string>() != null && p["type"]?.GetValue<string>() != null && p["state_key"]?.GetValue<string>() != null; - - if (policies.Any(x => !IsPolicyEntryValid(x))) { - logger.LogWarning("Found invalid policy reference in ignore list, removing! {policy}", - policies.Where(x => !IsPolicyEntryValid(x)).Select(x => x.ToJson(ignoreNull: true))); - metadata["policies"] = new JsonArray(policies.Where(IsPolicyEntryValid).ToArray()); - } + var ignoreList = await homeserver.GetAccountDataOrNullAsync<IgnoredUserListEventContent>(IgnoredUserListEventContent.EventId) + ?? throw new InvalidOperationException("Ignore list is null"); + + ignoreList.IgnoredUsers.RemoveAll((id, ignoredUserData) => { + if (ignoredUserData.AdditionalData is null) return false; + if (!ignoredUserData.AdditionalData.ContainsKey(MadsIgnoreMetadataContent.EventId)) return false; + var metadata = ignoredUserData.GetAdditionalData<JsonObject>(MadsIgnoreMetadataContent.EventId)!; + + if (metadata.ContainsKey("policies")) { + var policies = metadata["policies"]!.AsArray(); + + static bool IsPolicyEntryValid(JsonNode? p) => + p?["room_id"]?.GetValue<string>() != null + && p["type"]?.GetValue<string>() != null + && p["state_key"]?.GetValue<string>() != null; + + if (policies.Any(x => !IsPolicyEntryValid(x))) { + logger.LogWarning("Found invalid policy reference in ignore list, removing! {policy}", + policies.Where(x => !IsPolicyEntryValid(x)).Select(x => x.ToJson(ignoreNull: true))); + metadata["policies"] = new JsonArray(policies.Where(IsPolicyEntryValid).ToArray()); + ignoredUserData.AdditionalData[MadsIgnoreMetadataContent.EventId] = metadata; } + } - return metadata["was_user_added"]?.GetValue<bool>() is null or false; - }); - } + return metadata["was_user_added"]?.GetValue<bool>() is null or false + && metadata["policies"]?.AsArray().Count == 0; + }); return ignoreList; } @@ -146,10 +150,11 @@ public class PolicyExecutor( logger.LogError(e, "Failed to parse ignore list entry for {}", id); } } - + foreach (var id in idsToRemove) { ignoreList.IgnoredUsers.Remove(id); } + await homeserver.SetAccountDataAsync(IgnoredUserListEventContent.EventId, ignoreList); } diff --git a/MatrixAntiDmSpam/appsettings.Development.json b/MatrixAntiDmSpam/appsettings.Development.json
index 4cfb975..00d6dd4 100644 --- a/MatrixAntiDmSpam/appsettings.Development.json +++ b/MatrixAntiDmSpam/appsettings.Development.json
@@ -23,7 +23,7 @@ // What presence value to set // Defaults to "online" if null or not set - // "Presence": "online", + "Presence": "offline", // Filter to apply to the sync request. Useful if you want custom data to be sent. // "Filter": { },