diff options
Diffstat (limited to 'LibMatrix/Homeservers/AuthenticatedHomeserverGeneric.cs')
-rw-r--r-- | LibMatrix/Homeservers/AuthenticatedHomeserverGeneric.cs | 52 |
1 files changed, 37 insertions, 15 deletions
diff --git a/LibMatrix/Homeservers/AuthenticatedHomeserverGeneric.cs b/LibMatrix/Homeservers/AuthenticatedHomeserverGeneric.cs index 0b3201c..a280c54 100644 --- a/LibMatrix/Homeservers/AuthenticatedHomeserverGeneric.cs +++ b/LibMatrix/Homeservers/AuthenticatedHomeserverGeneric.cs @@ -2,6 +2,7 @@ using System.Net.Http.Json; using System.Text.Json; using System.Text.Json.Nodes; using System.Text.Json.Serialization; +using ArcaneLibs.Extensions; using LibMatrix.Extensions; using LibMatrix.Helpers; using LibMatrix.Responses; @@ -14,21 +15,18 @@ public class AuthenticatedHomeserverGeneric : RemoteHomeServer { public AuthenticatedHomeserverGeneric(TieredStorageService storage, string canonicalHomeServerDomain, string accessToken) : base(canonicalHomeServerDomain) { Storage = storage; AccessToken = accessToken.Trim(); - HomeServerDomain = canonicalHomeServerDomain.Trim(); SyncHelper = new SyncHelper(this, storage); - _httpClient = new MatrixHttpClient(); } - public TieredStorageService Storage { get; set; } - public SyncHelper SyncHelper { get; init; } - public WhoAmIResponse WhoAmI { get; set; } = null!; - public string UserId => WhoAmI.UserId; - public string AccessToken { get; set; } + public virtual TieredStorageService Storage { get; set; } + public virtual SyncHelper SyncHelper { get; init; } + public virtual WhoAmIResponse WhoAmI { get; set; } = null!; + public virtual string UserId => WhoAmI.UserId; + public virtual string AccessToken { get; set; } + public virtual Task<GenericRoom> GetRoom(string roomId) => Task.FromResult<GenericRoom>(new(this, roomId)); - public Task<GenericRoom> GetRoom(string roomId) => Task.FromResult<GenericRoom>(new(this, roomId)); - - public async Task<List<GenericRoom>> GetJoinedRooms() { + public virtual async Task<List<GenericRoom>> GetJoinedRooms() { var roomQuery = await _httpClient.GetAsync("/_matrix/client/v3/joined_rooms"); var roomsJson = await roomQuery.Content.ReadFromJsonAsync<JsonElement>(); @@ -39,7 +37,7 @@ public class AuthenticatedHomeserverGeneric : RemoteHomeServer { return rooms; } - public async Task<string> UploadFile(string fileName, Stream fileStream, string contentType = "application/octet-stream") { + public virtual async Task<string> UploadFile(string fileName, Stream fileStream, string contentType = "application/octet-stream") { var res = await _httpClient.PostAsync($"/_matrix/media/v3/upload?filename={fileName}", new StreamContent(fileStream)); if (!res.IsSuccessStatusCode) { Console.WriteLine($"Failed to upload file: {await res.Content.ReadAsStringAsync()}"); @@ -50,7 +48,7 @@ public class AuthenticatedHomeserverGeneric : RemoteHomeServer { return resJson.GetProperty("content_uri").GetString()!; } - public async Task<GenericRoom> CreateRoom(CreateRoomRequest creationEvent) { + public virtual async Task<GenericRoom> CreateRoom(CreateRoomRequest creationEvent) { creationEvent.CreationContent["creator"] = UserId; var res = await _httpClient.PostAsJsonAsync("/_matrix/client/v3/createRoom", creationEvent, new JsonSerializerOptions { DefaultIgnoreCondition = JsonIgnoreCondition.WhenWritingNull @@ -60,12 +58,36 @@ public class AuthenticatedHomeserverGeneric : RemoteHomeServer { throw new InvalidDataException($"Failed to create room: {await res.Content.ReadAsStringAsync()}"); } - return await GetRoom((await res.Content.ReadFromJsonAsync<JsonObject>())!["room_id"]!.ToString()); + var room = await GetRoom((await res.Content.ReadFromJsonAsync<JsonObject>())!["room_id"]!.ToString()); + + foreach (var user in creationEvent.Invite) { + await room.InviteUser(user); + } + + return room; + } + +#region Utility Functions + public virtual async IAsyncEnumerable<GenericRoom> GetJoinedRoomsByType(string type) { + var rooms = await GetJoinedRooms(); + var tasks = rooms.Select(async room => { + var roomType = await room.GetRoomType(); + if (roomType == type) { + return room; + } + + return null; + }).ToAsyncEnumerable(); + + await foreach (var result in tasks) { + if (result is not null) yield return result; + } } +#endregion #region Account Data - public async Task<T> GetAccountData<T>(string key) { + public virtual async Task<T> GetAccountData<T>(string key) { // var res = await _httpClient.GetAsync($"/_matrix/client/v3/user/{UserId}/account_data/{key}"); // if (!res.IsSuccessStatusCode) { // Console.WriteLine($"Failed to get account data: {await res.Content.ReadAsStringAsync()}"); @@ -76,7 +98,7 @@ public class AuthenticatedHomeserverGeneric : RemoteHomeServer { return await _httpClient.GetFromJsonAsync<T>($"/_matrix/client/v3/user/{UserId}/account_data/{key}"); } - public async Task SetAccountData(string key, object data) { + public virtual async Task SetAccountData(string key, object data) { var res = await _httpClient.PutAsJsonAsync($"/_matrix/client/v3/user/{UserId}/account_data/{key}", data); if (!res.IsSuccessStatusCode) { Console.WriteLine($"Failed to set account data: {await res.Content.ReadAsStringAsync()}"); |