about summary refs log tree commit diff
path: root/LibMatrix/Homeservers/FederationClient.cs
diff options
context:
space:
mode:
authorEmma [it/its]@Rory& <root@rory.gay>2024-01-15 02:11:36 +0100
committerEmma [it/its]@Rory& <root@rory.gay>2024-01-15 02:11:36 +0100
commitcb92b267f46113f3c0a6138729ac584be6ae9399 (patch)
tree30031f273907a06be9a4709e757efac090c5930a /LibMatrix/Homeservers/FederationClient.cs
parentSynchelper: better initial sync detection (diff)
downloadLibMatrix-cb92b267f46113f3c0a6138729ac584be6ae9399.tar.xz
Abstract FederationClient from RemoteHomeserver
Diffstat (limited to 'LibMatrix/Homeservers/FederationClient.cs')
-rw-r--r--LibMatrix/Homeservers/FederationClient.cs67
1 files changed, 67 insertions, 0 deletions
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<FederationClient?> 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<FederationClient> 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<ServerVersionResponse> GetServerVersionAsync() {
+        return await HttpClient.GetFromJsonAsync<ServerVersionResponse>("/_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