about summary refs log tree commit diff
path: root/LibMatrix
diff options
context:
space:
mode:
authorRory& <root@rory.gay>2024-11-22 06:38:42 +0100
committerRory& <root@rory.gay>2024-11-22 06:38:42 +0100
commitbb0c00531dfacd30ecef1ac4444c2e3281fa36b8 (patch)
tree8c96bfc792370a0385a0e4acec80da90192f1471 /LibMatrix
parentHSE updates (diff)
downloadLibMatrix-master.tar.xz
Extra draupnir/policy event work HEAD github/master master
Diffstat (limited to '')
-rw-r--r--LibMatrix.EventTypes/Interop/Draupnir/DraupnirProtectedRoomsData.cs11
-rw-r--r--LibMatrix.EventTypes/Spec/State/Policy/PolicyRuleStateEventContent.cs9
-rw-r--r--LibMatrix/Helpers/SyncHelper.cs8
3 files changed, 26 insertions, 2 deletions
diff --git a/LibMatrix.EventTypes/Interop/Draupnir/DraupnirProtectedRoomsData.cs b/LibMatrix.EventTypes/Interop/Draupnir/DraupnirProtectedRoomsData.cs
new file mode 100644
index 0000000..1917239
--- /dev/null
+++ b/LibMatrix.EventTypes/Interop/Draupnir/DraupnirProtectedRoomsData.cs
@@ -0,0 +1,11 @@
+using System.Text.Json.Serialization;
+
+namespace LibMatrix.EventTypes.Interop.Draupnir;
+
+[MatrixEvent(EventName = EventId)]
+public class DraupnirProtectedRoomsData : EventContent {
+    public const string EventId = "org.matrix.mjolnir.protected_rooms";
+
+    [JsonPropertyName("rooms")]
+    public List<string> Rooms { get; set; } = new();
+}
\ No newline at end of file
diff --git a/LibMatrix.EventTypes/Spec/State/Policy/PolicyRuleStateEventContent.cs b/LibMatrix.EventTypes/Spec/State/Policy/PolicyRuleStateEventContent.cs
index 5bfd77b..0569477 100644
--- a/LibMatrix.EventTypes/Spec/State/Policy/PolicyRuleStateEventContent.cs
+++ b/LibMatrix.EventTypes/Spec/State/Policy/PolicyRuleStateEventContent.cs
@@ -1,5 +1,6 @@
 using System.Security.Cryptography;
 using System.Text.Json.Serialization;
+using System.Text.RegularExpressions;
 using ArcaneLibs.Attributes;
 using ArcaneLibs.Extensions;
 
@@ -91,6 +92,14 @@ public abstract class PolicyRuleEventContent : EventContent {
     }
 
     public string GetDraupnir2StateKey() => Convert.ToBase64String(SHA256.HashData($"{Entity}{Recommendation}".AsBytes().ToArray()));
+
+    public Regex GetEntityRegex() => new(Entity.Replace(".", "\\.").Replace("*", ".*").Replace("?", "."));
+
+    public bool EntityMatches(string entity) =>
+        Entity == entity
+        || (Entity.Contains("*") || Entity.Contains("?")
+            ? GetEntityRegex().IsMatch(entity)
+            : entity == Entity);
 }
 
 public static class PolicyRecommendationTypes {
diff --git a/LibMatrix/Helpers/SyncHelper.cs b/LibMatrix/Helpers/SyncHelper.cs
index c9ca85d..aed56a7 100644
--- a/LibMatrix/Helpers/SyncHelper.cs
+++ b/LibMatrix/Helpers/SyncHelper.cs
@@ -1,5 +1,7 @@
 using System.Diagnostics;
 using System.Net.Http.Json;
+using System.Text.Json;
+using ArcaneLibs.Collections;
 using ArcaneLibs.Extensions;
 using LibMatrix.Filters;
 using LibMatrix.Homeservers;
@@ -90,9 +92,11 @@ public class SyncHelper(AuthenticatedHomeserverGeneric homeserver, ILogger? logg
             if (httpResp is null) throw new NullReferenceException("Failed to send HTTP request");
             logger?.LogTrace("Got sync response: {} bytes, {} elapsed", httpResp.GetContentLength(), sw.Elapsed);
             var deserializeSw = Stopwatch.StartNew();
-            var resp = await httpResp.Content.ReadFromJsonAsync<SyncResponse>(cancellationToken: cancellationToken ?? CancellationToken.None,
+            var stream = await httpResp.Content.ReadAsStreamAsync();
+            await using var seekableStream = new SeekableStream(stream);
+            var resp = await JsonSerializer.DeserializeAsync<SyncResponse>(seekableStream, cancellationToken: cancellationToken ?? CancellationToken.None,
                 jsonTypeInfo: SyncResponseSerializerContext.Default.SyncResponse);
-            logger?.LogInformation("Deserialized sync response: {} bytes, {} elapsed, {} total", httpResp.GetContentLength(), deserializeSw.Elapsed, sw.Elapsed);
+            logger?.LogInformation("Deserialized sync response: {} bytes, {} elapsed, {} total", seekableStream.Position, deserializeSw.Elapsed, sw.Elapsed);
             var timeToWait = MinimumDelay.Subtract(sw.Elapsed);
             if (timeToWait.TotalMilliseconds > 0)
                 await Task.Delay(timeToWait);