diff options
Diffstat (limited to 'LibMatrix/Homeservers')
-rw-r--r-- | LibMatrix/Homeservers/AuthenticatedHomeserverGeneric.cs | 38 | ||||
-rw-r--r-- | LibMatrix/Homeservers/RemoteHomeServer.cs | 4 |
2 files changed, 20 insertions, 22 deletions
diff --git a/LibMatrix/Homeservers/AuthenticatedHomeserverGeneric.cs b/LibMatrix/Homeservers/AuthenticatedHomeserverGeneric.cs index c1d6461..6fcd8e8 100644 --- a/LibMatrix/Homeservers/AuthenticatedHomeserverGeneric.cs +++ b/LibMatrix/Homeservers/AuthenticatedHomeserverGeneric.cs @@ -16,37 +16,41 @@ using LibMatrix.Services; namespace LibMatrix.Homeservers; public class AuthenticatedHomeserverGeneric(string serverName, string accessToken) : RemoteHomeserver(serverName) { - public static async Task<T> Create<T>(string serverName, string accessToken, string? proxy = null) where T : AuthenticatedHomeserverGeneric { - var instance = Activator.CreateInstance(typeof(T), serverName, accessToken) as T - ?? throw new InvalidOperationException($"Failed to create instance of {typeof(T).Name}"); - HomeserverResolverService.WellKnownUris? urls = null; - if (proxy is null) - urls = await new HomeserverResolverService().ResolveHomeserverFromWellKnown(serverName); - + public static async Task<T> Create<T>(string serverName, string accessToken, string? proxy = null) where T : AuthenticatedHomeserverGeneric => + await Create(typeof(T), serverName, accessToken, proxy) as T ?? throw new InvalidOperationException($"Failed to create instance of {typeof(T).Name}"); + public static async Task<AuthenticatedHomeserverGeneric> Create(Type type, string serverName, string accessToken, string? proxy = null) { + if(!type.IsAssignableTo(typeof(AuthenticatedHomeserverGeneric))) throw new ArgumentException("Type must be a subclass of AuthenticatedHomeserverGeneric", nameof(type)); + var instance = Activator.CreateInstance(type, serverName, accessToken) as AuthenticatedHomeserverGeneric + ?? throw new InvalidOperationException($"Failed to create instance of {type.Name}"); + instance.ClientHttpClient = new() { - BaseAddress = new Uri(proxy ?? urls?.Client - ?? throw new InvalidOperationException("Failed to resolve homeserver")), Timeout = TimeSpan.FromMinutes(15), DefaultRequestHeaders = { Authorization = new AuthenticationHeaderValue("Bearer", accessToken) } }; instance.ServerHttpClient = new() { - BaseAddress = new Uri(proxy ?? urls?.Server - ?? throw new InvalidOperationException("Failed to resolve homeserver")), Timeout = TimeSpan.FromMinutes(15), DefaultRequestHeaders = { Authorization = new AuthenticationHeaderValue("Bearer", accessToken) } }; - instance.WhoAmI = await instance.ClientHttpClient.GetFromJsonAsync<WhoAmIResponse>("/_matrix/client/v3/account/whoami"); - - if (proxy is not null) { + if (string.IsNullOrWhiteSpace(proxy)) { + HomeserverResolverService.WellKnownUris? urls = await new HomeserverResolverService().ResolveHomeserverFromWellKnown(serverName); + instance.ClientHttpClient.BaseAddress = new Uri(urls?.Client ?? throw new InvalidOperationException("Failed to resolve homeserver")); + instance.ServerHttpClient.BaseAddress = new Uri(urls?.Server ?? throw new InvalidOperationException("Failed to resolve homeserver")); + } + else { + instance.ClientHttpClient.BaseAddress = new Uri(proxy); + instance.ServerHttpClient.BaseAddress = new Uri(proxy); instance.ClientHttpClient.DefaultRequestHeaders.Add("MXAE_UPSTREAM", serverName); instance.ServerHttpClient.DefaultRequestHeaders.Add("MXAE_UPSTREAM", serverName); } + instance.WhoAmI = await instance.ClientHttpClient.GetFromJsonAsync<WhoAmIResponse>("/_matrix/client/v3/account/whoami"); + + return instance; } @@ -55,12 +59,6 @@ public class AuthenticatedHomeserverGeneric(string serverName, string accessToke public string UserLocalpart => UserId.Split(":")[0][1..]; public string ServerName => UserId.Split(":", 2)[1]; - // public virtual async Task<WhoAmIResponse> WhoAmI() { - // if (_whoAmI is not null) return _whoAmI; - // _whoAmI = await _httpClient.GetFromJsonAsync<WhoAmIResponse>("/_matrix/client/v3/account/whoami"); - // return _whoAmI; - // } - public string AccessToken { get; set; } = accessToken; public GenericRoom GetRoom(string roomId) { diff --git a/LibMatrix/Homeservers/RemoteHomeServer.cs b/LibMatrix/Homeservers/RemoteHomeServer.cs index a47b731..a461d6e 100644 --- a/LibMatrix/Homeservers/RemoteHomeServer.cs +++ b/LibMatrix/Homeservers/RemoteHomeServer.cs @@ -37,9 +37,9 @@ public class RemoteHomeserver(string baseUrl) { public MatrixHttpClient ServerHttpClient { get; set; } = null!; public HomeserverResolverService.WellKnownUris WellKnownUris { get; set; } = null!; - public async Task<UserProfileResponse> GetProfileAsync(string mxid) { + public async Task<UserProfileResponse> GetProfileAsync(string mxid, bool useCache = false) { if (mxid is null) throw new ArgumentNullException(nameof(mxid)); - if (_profileCache.TryGetValue(mxid, out var value)) { + if (useCache && _profileCache.TryGetValue(mxid, out var value)) { if (value is SemaphoreSlim s) await s.WaitAsync(); if (value is UserProfileResponse p) return p; } |