From b75135d8cdb702423d693558ffaec3f025264b98 Mon Sep 17 00:00:00 2001 From: TheArcaneBrony Date: Thu, 26 Oct 2023 13:09:05 +0000 Subject: split client and server http client for homeservers --- LibMatrix/RoomTypes/GenericRoom.cs | 35 +++++++++++++++++++++++++++-------- 1 file changed, 27 insertions(+), 8 deletions(-) (limited to 'LibMatrix/RoomTypes/GenericRoom.cs') diff --git a/LibMatrix/RoomTypes/GenericRoom.cs b/LibMatrix/RoomTypes/GenericRoom.cs index 1398f14..96bcefd 100644 --- a/LibMatrix/RoomTypes/GenericRoom.cs +++ b/LibMatrix/RoomTypes/GenericRoom.cs @@ -18,7 +18,7 @@ public class GenericRoom { if (string.IsNullOrWhiteSpace(roomId)) throw new ArgumentException("Room ID cannot be null or whitespace", nameof(roomId)); Homeserver = homeserver; - _httpClient = homeserver._httpClient; + _httpClient = homeserver.ClientHttpClient; RoomId = roomId; if (GetType() != typeof(SpaceRoom)) AsSpace = new SpaceRoom(homeserver, RoomId); @@ -83,11 +83,7 @@ public class GenericRoom { return res ?? new MessagesResponse(); } - // TODO: should we even error handle here? - public async Task GetNameAsync() { - var res = await GetStateAsync("m.room.name"); - return res?.Name; - } + public async Task GetNameAsync() => (await GetStateAsync("m.room.name"))?.Name; public async Task JoinAsync(string[]? homeservers = null, string? reason = null) { var join_url = $"/_matrix/client/v3/join/{HttpUtility.UrlEncode(RoomId)}"; @@ -100,7 +96,7 @@ public class GenericRoom { return await res.Content.ReadFromJsonAsync() ?? throw new Exception("Failed to join room?"); } - // TODO: rewrite (members endpoint?) + public async IAsyncEnumerable GetMembersAsync(bool joinedOnly = true) { // var res = GetFullStateAsync(); // await foreach (var member in res) { @@ -108,7 +104,7 @@ public class GenericRoom { // if (joinedOnly && (member.TypedContent as RoomMemberEventContent)?.Membership is not "join") continue; // yield return member; // } - var res = await _httpClient.GetAsync($"/_matrix/client/v3/rooms/{RoomId}/members?limit=2"); + var res = await _httpClient.GetAsync($"/_matrix/client/v3/rooms/{RoomId}/members"); var resText = await res.Content.ReadAsStringAsync(); var result = await JsonSerializer.DeserializeAsync(await res.Content.ReadAsStreamAsync()); foreach (var resp in result.Chunk) { @@ -157,6 +153,29 @@ public class GenericRoom { public async Task GetPowerLevelsAsync() => await GetStateAsync("m.room.power_levels"); + public async Task GetNameOrFallbackAsync() { + try { + return await GetNameAsync(); + } + catch { + try { + var members = GetMembersAsync(); + var memberList = new List(); + int memberCount = 0; + await foreach (var member in members) + memberList.Add((member.TypedContent is RoomMemberEventContent memberEvent ? memberEvent.DisplayName : "") ?? ""); + memberCount = memberList.Count; + memberList.RemoveAll(string.IsNullOrWhiteSpace); + if (memberList.Count >= 3) + return string.Join(", ", memberList.Take(2)) + " and " + (memberCount - 2) + " others."; + return string.Join(", ", memberList); + } + catch { + return RoomId; + } + } + } + #endregion public async Task ForgetAsync() => -- cgit 1.4.1