diff --git a/LibMatrix/Homeservers/AuthenticatedHomeserverGeneric.cs b/LibMatrix/Homeservers/AuthenticatedHomeserverGeneric.cs
index 727c0ea..afa6a6c 100644
--- a/LibMatrix/Homeservers/AuthenticatedHomeserverGeneric.cs
+++ b/LibMatrix/Homeservers/AuthenticatedHomeserverGeneric.cs
@@ -14,49 +14,35 @@ using LibMatrix.Responses;
using LibMatrix.RoomTypes;
using LibMatrix.Services;
using LibMatrix.Utilities;
+using Microsoft.Extensions.Logging.Abstractions;
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 =>
- 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 (string.IsNullOrWhiteSpace(proxy))
- 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 MatrixHttpClient {
- Timeout = TimeSpan.FromMinutes(15),
- DefaultRequestHeaders = {
- Authorization = new AuthenticationHeaderValue("Bearer", accessToken)
- }
- };
- instance.FederationClient = await FederationClient.TryCreate(serverName, proxy);
+public class AuthenticatedHomeserverGeneric : RemoteHomeserver {
+ public AuthenticatedHomeserverGeneric(string serverName, HomeserverResolverService.WellKnownUris wellKnownUris, ref string? proxy, string accessToken) : base(serverName,
+ wellKnownUris, ref proxy) {
+ AccessToken = accessToken;
+ ClientHttpClient.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", accessToken);
- if (string.IsNullOrWhiteSpace(proxy)) {
- var urls = await new HomeserverResolverService().ResolveHomeserverFromWellKnown(serverName);
- instance.ClientHttpClient.BaseAddress = new Uri(urls?.Client ?? throw new InvalidOperationException("Failed to resolve homeserver"));
- }
- else {
- instance.ClientHttpClient.BaseAddress = new Uri(proxy);
- instance.ClientHttpClient.DefaultRequestHeaders.Add("MXAE_UPSTREAM", serverName);
- }
+ NamedCaches = new HsNamedCaches(this);
+ }
+
+ public async Task Initialise() {
+ WhoAmI = await ClientHttpClient.GetFromJsonAsync<WhoAmIResponse>("/_matrix/client/v3/account/whoami");
+ }
- instance.WhoAmI = await instance.ClientHttpClient.GetFromJsonAsync<WhoAmIResponse>("/_matrix/client/v3/account/whoami");
- instance.NamedCaches = new HsNamedCaches(instance);
+ private WhoAmIResponse? _whoAmI;
- return instance;
+ public WhoAmIResponse WhoAmI {
+ get => _whoAmI ?? throw new Exception("Initialise was not called or awaited, WhoAmI is null!");
+ private set => _whoAmI = value;
}
- public WhoAmIResponse WhoAmI { get; set; }
public string UserId => WhoAmI.UserId;
public string UserLocalpart => UserId.Split(":")[0][1..];
public string ServerName => UserId.Split(":", 2)[1];
- public string AccessToken { get; set; } = accessToken;
+ public string AccessToken { get; set; }
public HsNamedCaches NamedCaches { get; set; } = null!;
|