about summary refs log tree commit diff
path: root/LibMatrix/Homeservers/ImplementationDetails/Synapse/Models
diff options
context:
space:
mode:
Diffstat (limited to 'LibMatrix/Homeservers/ImplementationDetails/Synapse/Models')
-rw-r--r--LibMatrix/Homeservers/ImplementationDetails/Synapse/Models/Filters/SynapseAdminLocalRoomQueryFilter.cs109
-rw-r--r--LibMatrix/Homeservers/ImplementationDetails/Synapse/Models/Responses/RoomListResult.cs52
2 files changed, 138 insertions, 23 deletions
diff --git a/LibMatrix/Homeservers/ImplementationDetails/Synapse/Models/Filters/SynapseAdminLocalRoomQueryFilter.cs b/LibMatrix/Homeservers/ImplementationDetails/Synapse/Models/Filters/SynapseAdminLocalRoomQueryFilter.cs

index b8929a0..97c4bbf 100644 --- a/LibMatrix/Homeservers/ImplementationDetails/Synapse/Models/Filters/SynapseAdminLocalRoomQueryFilter.cs +++ b/LibMatrix/Homeservers/ImplementationDetails/Synapse/Models/Filters/SynapseAdminLocalRoomQueryFilter.cs
@@ -1,27 +1,90 @@ namespace LibMatrix.Homeservers.ImplementationDetails.Synapse.Models.Filters; public class SynapseAdminLocalRoomQueryFilter { - public string RoomIdContains { get; set; } = ""; - public string NameContains { get; set; } = ""; - public string CanonicalAliasContains { get; set; } = ""; - public string VersionContains { get; set; } = ""; - public string CreatorContains { get; set; } = ""; - public string EncryptionContains { get; set; } = ""; - public string JoinRulesContains { get; set; } = ""; - public string GuestAccessContains { get; set; } = ""; - public string HistoryVisibilityContains { get; set; } = ""; - - public bool Federatable { get; set; } = true; - public bool Public { get; set; } = true; - - public int JoinedMembersGreaterThan { get; set; } - public int JoinedMembersLessThan { get; set; } = int.MaxValue; - - public int JoinedLocalMembersGreaterThan { get; set; } - public int JoinedLocalMembersLessThan { get; set; } = int.MaxValue; - public int StateEventsGreaterThan { get; set; } - public int StateEventsLessThan { get; set; } = int.MaxValue; - - public bool CheckFederation { get; set; } - public bool CheckPublic { get; set; } + public StringFilter RoomId { get; set; } = new(); + public StringFilter Name { get; set; } = new(); + public StringFilter CanonicalAlias { get; set; } = new(); + public StringFilter Version { get; set; } = new(); + public StringFilter Creator { get; set; } = new(); + public StringFilter Encryption { get; set; } = new(); + public StringFilter JoinRules { get; set; } = new(); + public StringFilter GuestAccess { get; set; } = new(); + public StringFilter HistoryVisibility { get; set; } = new(); + public StringFilter RoomType { get; set; } = new(); + public StringFilter Topic { get; set; } = new(); + + public IntFilter JoinedMembers { get; set; } = new() { + GreaterThan = 0, + LessThan = int.MaxValue + }; + + public IntFilter JoinedLocalMembers { get; set; } = new() { + GreaterThan = 0, + LessThan = int.MaxValue + }; + + public IntFilter StateEvents { get; set; } = new() { + GreaterThan = 0, + LessThan = int.MaxValue + }; + + public BoolFilter Federation { get; set; } = new(); + public BoolFilter Public { get; set; } = new(); + public BoolFilter Tombstone { get; set; } = new(); +} + +public class OptionalFilter { + public bool Enabled { get; set; } +} + +public class StringFilter : OptionalFilter { + public bool CheckValueContains { get; set; } + public string? ValueContains { get; set; } + + public bool CheckValueEquals { get; set; } + public string? ValueEquals { get; set; } + + public bool Matches(string? value, StringComparison comparison = StringComparison.Ordinal) { + if (!Enabled) return true; + + if (CheckValueEquals) { + if (!string.Equals(value, ValueEquals, comparison)) return false; + } + + if (CheckValueContains && ValueContains != null) { + if (value != null && !value.Contains(ValueContains, comparison)) return false; + } + + return true; + } +} + +public class IntFilter : OptionalFilter { + public bool CheckGreaterThan { get; set; } + public int GreaterThan { get; set; } + public bool CheckLessThan { get; set; } + public int LessThan { get; set; } + + public bool Matches(int value) { + if (!Enabled) return true; + + if (CheckGreaterThan) { + if (value <= GreaterThan) return false; + } + + if (CheckLessThan) { + if (value >= LessThan) return false; + } + + return true; + } +} + +public class BoolFilter : OptionalFilter { + public bool Value { get; set; } + + public bool Matches(bool value) { + if (!Enabled) return true; + return value == Value; + } } \ No newline at end of file diff --git a/LibMatrix/Homeservers/ImplementationDetails/Synapse/Models/Responses/RoomListResult.cs b/LibMatrix/Homeservers/ImplementationDetails/Synapse/Models/Responses/RoomListResult.cs
index d84c89b..3bc1f47 100644 --- a/LibMatrix/Homeservers/ImplementationDetails/Synapse/Models/Responses/RoomListResult.cs +++ b/LibMatrix/Homeservers/ImplementationDetails/Synapse/Models/Responses/RoomListResult.cs
@@ -1,4 +1,5 @@ using System.Text.Json.Serialization; +using LibMatrix.EventTypes.Spec.State.RoomInfo; namespace LibMatrix.Homeservers.ImplementationDetails.Synapse.Models.Responses; @@ -60,5 +61,56 @@ public class SynapseAdminRoomListResult { [JsonPropertyName("state_events")] public int StateEvents { get; set; } + + [JsonPropertyName("gay.rory.synapse_admin_extensions.tombstone")] + public StateEventResponse? TombstoneEvent { get; set; } + + [JsonPropertyName("gay.rory.synapse_admin_extensions.create")] + public StateEventResponse? CreateEvent { get; set; } + + [JsonPropertyName("gay.rory.synapse_admin_extensions.topic")] + public StateEventResponse? TopicEvent { get; set; } + + public async Task<StateEventResponse?> GetCreateEventAsync(AuthenticatedHomeserverSynapse hs) { + if (CreateEvent != null) return CreateEvent; + + try { + var events = (await hs.Admin.GetRoomStateAsync(RoomId, RoomCreateEventContent.EventId)); + CreateEvent = events.Events.SingleOrDefault(x => x.StateKey == ""); + } + catch (Exception e) { + Console.WriteLine($"Failed to fetch room create event for {RoomId}: {e}"); + } + + return null; + } + + public async Task<StateEventResponse?> GetTombstoneEventAsync(AuthenticatedHomeserverSynapse hs) { + if (TombstoneEvent != null) return TombstoneEvent; + + try { + var events = (await hs.Admin.GetRoomStateAsync(RoomId, RoomTombstoneEventContent.EventId)); + TombstoneEvent = events.Events.SingleOrDefault(x => x.StateKey == ""); + } + catch (Exception e) { + Console.WriteLine($"Failed to fetch room tombstone event for {RoomId}: {e}"); + } + + return null; + } + + public async Task<StateEventResponse?> GetTopicEventAsync(AuthenticatedHomeserverSynapse hs) { + if (TopicEvent != null) return TopicEvent; + + try { + var events = await hs.Admin.GetRoomStateAsync(RoomId, RoomTopicEventContent.EventId); + TopicEvent = events.Events.SingleOrDefault(x => x.StateKey == ""); + } + catch (Exception e) { + Console.WriteLine($"Failed to fetch room topic event for {RoomId}: {e}"); + } + + return null; + } } } \ No newline at end of file