Fix bug removing all policies that arent user added, theoretically fix missing room_id bugfix
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": { },
|