about summary refs log tree commit diff
diff options
context:
space:
mode:
authorRory& <root@rory.gay>2025-12-09 15:11:40 +0100
committerRory& <root@rory.gay>2025-12-09 19:01:20 +0100
commitf5d8b466ba5d0b3a23efb4f07fb8d118bf165d73 (patch)
treef103f88b12f6ebb0bd5fee630a32e32f138fba4e
parentSupport getting/setting room dir visibility (diff)
downloadLibMatrix-f5d8b466ba5d0b3a23efb4f07fb8d118bf165d73.tar.xz
Room directory listing filter support
-rw-r--r--LibMatrix/Homeservers/RemoteHomeServer.cs64
1 files changed, 55 insertions, 9 deletions
diff --git a/LibMatrix/Homeservers/RemoteHomeServer.cs b/LibMatrix/Homeservers/RemoteHomeServer.cs

index a14e674..54f5937 100644 --- a/LibMatrix/Homeservers/RemoteHomeServer.cs +++ b/LibMatrix/Homeservers/RemoteHomeServer.cs
@@ -60,23 +60,44 @@ public class RemoteHomeserver { return data ?? throw new InvalidOperationException($"Could not resolve alias {alias}"); } - public Task<PublicRoomDirectoryResult> GetPublicRoomsAsync(int limit = 100, string? server = null, string? since = null) { - var url = $"/_matrix/client/v3/publicRooms?limit={limit}"; - if (!string.IsNullOrWhiteSpace(server)) { - url += $"&server={server}"; + public async Task<PublicRoomDirectoryResult> GetPublicRoomsAsync(int limit = 100, string? server = null, string? since = null, string? thirdPartyInstanceId = null, + bool? includeAllNetworks = null, RoomDirectoryFilter? filter = null) { + if (thirdPartyInstanceId is null && includeAllNetworks is null && filter is null) { + var url = $"/_matrix/client/v3/publicRooms?limit={limit}"; + if (!string.IsNullOrWhiteSpace(server)) { + url += $"&server={server}"; + } + + if (!string.IsNullOrWhiteSpace(since)) { + url += $"&since={since}"; + } + + return await ClientHttpClient.GetFromJsonAsync<PublicRoomDirectoryResult>(url); } - if (!string.IsNullOrWhiteSpace(since)) { - url += $"&since={since}"; + // this technically requires authentication... TODO: move to AuthenticatedHomeserver? + var postUrl = "/_matrix/client/v3/publicRooms"; + if (!string.IsNullOrWhiteSpace(server)) { + postUrl += $"?server={HttpUtility.UrlEncode(server)}"; } - return ClientHttpClient.GetFromJsonAsync<PublicRoomDirectoryResult>(url); + var postData = new RoomDirectoryFilteredRequest { + Limit = limit, + Since = since, + ThirdPartyInstanceId = thirdPartyInstanceId, + IncludeAllNetworks = includeAllNetworks, + Filter = filter + }; + + return await (await ClientHttpClient.PostAsJsonAsync(postUrl, postData)).EnsureSuccessStatusCode() + .Content.ReadFromJsonAsync<PublicRoomDirectoryResult>() ?? throw new InvalidOperationException(); } - public async IAsyncEnumerable<PublicRoomDirectoryResult> EnumeratePublicRoomsAsync(int limit = int.MaxValue, string? server = null, string? since = null, int chunkSize = 100) { + public async IAsyncEnumerable<PublicRoomDirectoryResult> EnumeratePublicRoomsAsync(int limit = int.MaxValue, string? server = null, string? since = null, + string? thirdPartyInstanceId = null, bool? includeAllNetworks = null, RoomDirectoryFilter? filter = null, int chunkSize = 100) { PublicRoomDirectoryResult res; do { - res = await GetPublicRoomsAsync(chunkSize, server, since); + res = await GetPublicRoomsAsync(chunkSize, server, since, thirdPartyInstanceId, includeAllNetworks, filter); yield return res; if (res.NextBatch is null || res.NextBatch == since || res.Chunk.Count == 0) break; since = res.NextBatch; @@ -124,6 +145,31 @@ public class RemoteHomeserver { public UserInteractiveAuthClient Auth; } +public class RoomDirectoryFilteredRequest { + [JsonPropertyName("filter")] + public RoomDirectoryFilter? Filter { get; set; } + + [JsonPropertyName("include_all_networks")] + public bool? IncludeAllNetworks { get; set; } + + [JsonPropertyName("limit")] + public int Limit { get; set; } + + [JsonPropertyName("since")] + public string? Since { get; set; } + + [JsonPropertyName("third_party_instance_id")] + public string? ThirdPartyInstanceId { get; set; } +} + +public class RoomDirectoryFilter { + [JsonPropertyName("generic_search_term")] + public string? GenericSearchTerm { get; set; } + + [JsonPropertyName("room_types")] + public List<string?>? RoomTypes { get; set; } +} + public class RoomDirectoryVisibilityResponse { [JsonPropertyName("visibility")] public VisibilityValue Visibility { get; set; }