From cb92b267f46113f3c0a6138729ac584be6ae9399 Mon Sep 17 00:00:00 2001 From: "Emma [it/its]@Rory&" Date: Mon, 15 Jan 2024 02:11:36 +0100 Subject: Abstract FederationClient from RemoteHomeserver --- LibMatrix/Homeservers/FederationClient.cs | 67 +++++++++++++++++++++++++++++++ 1 file changed, 67 insertions(+) create mode 100644 LibMatrix/Homeservers/FederationClient.cs (limited to 'LibMatrix/Homeservers/FederationClient.cs') diff --git a/LibMatrix/Homeservers/FederationClient.cs b/LibMatrix/Homeservers/FederationClient.cs new file mode 100644 index 0000000..6001862 --- /dev/null +++ b/LibMatrix/Homeservers/FederationClient.cs @@ -0,0 +1,67 @@ +using System.Net.Http.Json; +using System.Text.Json; +using System.Text.Json.Serialization; +using System.Web; +using ArcaneLibs.Extensions; +using LibMatrix.Extensions; +using LibMatrix.Responses; +using LibMatrix.Services; + +namespace LibMatrix.Homeservers; + +public class FederationClient(string baseUrl) { + public static async Task TryCreate(string baseUrl, string? proxy = null) { + try { + return await Create(baseUrl, proxy); + } + catch (Exception e) { + Console.WriteLine($"Failed to create homeserver {baseUrl}: {e.Message}"); + return null; + } + } + + public static async Task Create(string baseUrl, string? proxy = null) { + var homeserver = new FederationClient(baseUrl); + homeserver.WellKnownUris = await new HomeserverResolverService().ResolveHomeserverFromWellKnown(baseUrl); + if(string.IsNullOrWhiteSpace(proxy) && string.IsNullOrWhiteSpace(homeserver.WellKnownUris.Client)) + Console.WriteLine($"Failed to resolve homeserver client URI for {baseUrl}"); + if(string.IsNullOrWhiteSpace(proxy) && string.IsNullOrWhiteSpace(homeserver.WellKnownUris.Server)) + Console.WriteLine($"Failed to resolve homeserver server URI for {baseUrl}"); + + if (!string.IsNullOrWhiteSpace(homeserver.WellKnownUris.Server)) + homeserver.HttpClient = new() { + BaseAddress = new Uri(proxy ?? homeserver.WellKnownUris.Server ?? throw new InvalidOperationException($"Failed to resolve homeserver server URI for {baseUrl}")), + Timeout = TimeSpan.FromSeconds(120) + }; + + if (proxy is not null) { + homeserver.HttpClient.DefaultRequestHeaders.Add("MXAE_UPSTREAM", baseUrl); + } + + return homeserver; + } + + public string BaseUrl { get; } = baseUrl; + + public MatrixHttpClient HttpClient { get; set; } = null!; + public HomeserverResolverService.WellKnownUris WellKnownUris { get; set; } = null!; + + public async Task GetServerVersionAsync() { + return await HttpClient.GetFromJsonAsync("/_matrix/federation/v1/version"); + } + +} + +public class ServerVersionResponse { + [JsonPropertyName("server")] + public required ServerInfo Server { get; set; } + + // ReSharper disable once ClassNeverInstantiated.Global + public class ServerInfo { + [JsonPropertyName("name")] + public string Name { get; set; } + + [JsonPropertyName("version")] + public string Version { get; set; } + } +} \ No newline at end of file -- cgit 1.4.1