about summary refs log tree commit diff
path: root/LibMatrix/Homeservers
diff options
context:
space:
mode:
authorTheArcaneBrony <myrainbowdash949@gmail.com>2023-09-19 00:16:36 +0200
committerTheArcaneBrony <myrainbowdash949@gmail.com>2023-09-19 00:16:36 +0200
commitf5447484512d726f4403f0d7725777d0a95601fb (patch)
tree47fe88a4c021f62ff42663f6d8c5229e71d21813 /LibMatrix/Homeservers
parentImprove README (diff)
downloadLibMatrix-f5447484512d726f4403f0d7725777d0a95601fb.tar.xz
Add more stuff, add unit tests
Diffstat (limited to 'LibMatrix/Homeservers')
-rw-r--r--LibMatrix/Homeservers/AuthenticatedHomeserverGeneric.cs23
-rw-r--r--LibMatrix/Homeservers/AuthenticatedHomeserverMxApiExtended.cs2
-rw-r--r--LibMatrix/Homeservers/AuthenticatedHomeserverSynapse.cs2
-rw-r--r--LibMatrix/Homeservers/RemoteHomeServer.cs27
4 files changed, 41 insertions, 13 deletions
diff --git a/LibMatrix/Homeservers/AuthenticatedHomeserverGeneric.cs b/LibMatrix/Homeservers/AuthenticatedHomeserverGeneric.cs
index a280c54..b881e6c 100644
--- a/LibMatrix/Homeservers/AuthenticatedHomeserverGeneric.cs
+++ b/LibMatrix/Homeservers/AuthenticatedHomeserverGeneric.cs
@@ -12,25 +12,26 @@ using LibMatrix.Services;
 namespace LibMatrix.Homeservers;
 
 public class AuthenticatedHomeserverGeneric : RemoteHomeServer {
-    public AuthenticatedHomeserverGeneric(TieredStorageService storage, string canonicalHomeServerDomain, string accessToken) : base(canonicalHomeServerDomain) {
-        Storage = storage;
+    public AuthenticatedHomeserverGeneric(string canonicalHomeServerDomain, string accessToken) : base(canonicalHomeServerDomain) {
         AccessToken = accessToken.Trim();
-        SyncHelper = new SyncHelper(this, storage);
+        SyncHelper = new SyncHelper(this);
     }
 
-    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 virtual GenericRoom GetRoom(string roomId) {
+        if(roomId is null || !roomId.StartsWith("!")) throw new ArgumentException("Room ID must start with !", nameof(roomId));
+        return new GenericRoom(this, roomId);
+    }
 
     public virtual async Task<List<GenericRoom>> GetJoinedRooms() {
         var roomQuery = await _httpClient.GetAsync("/_matrix/client/v3/joined_rooms");
 
         var roomsJson = await roomQuery.Content.ReadFromJsonAsync<JsonElement>();
-        var rooms = roomsJson.GetProperty("joined_rooms").EnumerateArray().Select(room => new GenericRoom(this, room.GetString()!)).ToList();
+        var rooms = roomsJson.GetProperty("joined_rooms").EnumerateArray().Select(room => GetRoom(room.GetString()!)).ToList();
 
         Console.WriteLine($"Fetched {rooms.Count} rooms");
 
@@ -58,7 +59,7 @@ public class AuthenticatedHomeserverGeneric : RemoteHomeServer {
             throw new InvalidDataException($"Failed to create room: {await res.Content.ReadAsStringAsync()}");
         }
 
-        var room = await GetRoom((await res.Content.ReadFromJsonAsync<JsonObject>())!["room_id"]!.ToString());
+        var room = GetRoom((await res.Content.ReadFromJsonAsync<JsonObject>())!["room_id"]!.ToString());
 
         foreach (var user in creationEvent.Invite) {
             await room.InviteUser(user);
@@ -67,6 +68,14 @@ public class AuthenticatedHomeserverGeneric : RemoteHomeServer {
         return room;
     }
 
+    public virtual async Task Logout() {
+        var res = await _httpClient.PostAsync("/_matrix/client/v3/logout", null);
+        if (!res.IsSuccessStatusCode) {
+            Console.WriteLine($"Failed to logout: {await res.Content.ReadAsStringAsync()}");
+            throw new InvalidDataException($"Failed to logout: {await res.Content.ReadAsStringAsync()}");
+        }
+    }
+
 #region Utility Functions
     public virtual async IAsyncEnumerable<GenericRoom> GetJoinedRoomsByType(string type) {
         var rooms = await GetJoinedRooms();
diff --git a/LibMatrix/Homeservers/AuthenticatedHomeserverMxApiExtended.cs b/LibMatrix/Homeservers/AuthenticatedHomeserverMxApiExtended.cs
index e44d727..5319f46 100644
--- a/LibMatrix/Homeservers/AuthenticatedHomeserverMxApiExtended.cs
+++ b/LibMatrix/Homeservers/AuthenticatedHomeserverMxApiExtended.cs
@@ -4,5 +4,5 @@ using LibMatrix.Services;
 
 namespace LibMatrix.Homeservers;
 
-public class AuthenticatedHomeserverMxApiExtended(TieredStorageService storage, string canonicalHomeServerDomain, string accessToken) : AuthenticatedHomeserverGeneric(storage, canonicalHomeServerDomain,
+public class AuthenticatedHomeserverMxApiExtended(string canonicalHomeServerDomain, string accessToken) : AuthenticatedHomeserverGeneric(canonicalHomeServerDomain,
     accessToken);
diff --git a/LibMatrix/Homeservers/AuthenticatedHomeserverSynapse.cs b/LibMatrix/Homeservers/AuthenticatedHomeserverSynapse.cs
index 218ded0..ae26f69 100644
--- a/LibMatrix/Homeservers/AuthenticatedHomeserverSynapse.cs
+++ b/LibMatrix/Homeservers/AuthenticatedHomeserverSynapse.cs
@@ -102,7 +102,7 @@ public class AuthenticatedHomeserverSynapse : AuthenticatedHomeserverGeneric {
         }
     }
 
-    public AuthenticatedHomeserverSynapse(TieredStorageService storage, string canonicalHomeServerDomain, string accessToken) : base(storage, canonicalHomeServerDomain, accessToken) {
+    public AuthenticatedHomeserverSynapse(string canonicalHomeServerDomain, string accessToken) : base(canonicalHomeServerDomain, accessToken) {
         Admin = new(this);
     }
 }
diff --git a/LibMatrix/Homeservers/RemoteHomeServer.cs b/LibMatrix/Homeservers/RemoteHomeServer.cs
index caed397..ab3ab51 100644
--- a/LibMatrix/Homeservers/RemoteHomeServer.cs
+++ b/LibMatrix/Homeservers/RemoteHomeServer.cs
@@ -1,7 +1,9 @@
 using System.Net.Http.Json;
+using System.Text.Json.Serialization;
+using ArcaneLibs.Extensions;
+using LibMatrix.EventTypes.Spec.State;
 using LibMatrix.Extensions;
 using LibMatrix.Responses;
-using LibMatrix.StateEventTypes.Spec;
 
 namespace LibMatrix.Homeservers;
 
@@ -13,12 +15,13 @@ public class RemoteHomeServer(string canonicalHomeServerDomain) {
     public string FullHomeServerDomain { get; set; }
     public MatrixHttpClient _httpClient { get; set; } = new();
 
-    public async Task<ProfileResponseEventContent> GetProfile(string mxid) {
-        if(mxid is null) throw new ArgumentNullException(nameof(mxid));
+    public async Task<ProfileResponseEventContent> GetProfileAsync(string mxid) {
+        if (mxid is null) throw new ArgumentNullException(nameof(mxid));
         if (_profileCache.TryGetValue(mxid, out var value)) {
             if (value is SemaphoreSlim s) await s.WaitAsync();
             if (value is ProfileResponseEventContent p) return p;
         }
+
         _profileCache[mxid] = new SemaphoreSlim(1);
 
         var resp = await _httpClient.GetAsync($"/_matrix/client/v3/profile/{mxid}");
@@ -29,10 +32,26 @@ public class RemoteHomeServer(string canonicalHomeServerDomain) {
         return data;
     }
 
-    public async Task<ClientVersionsResponse> GetClientVersions() {
+    public async Task<ClientVersionsResponse> GetClientVersionsAsync() {
         var resp = await _httpClient.GetAsync($"/_matrix/client/versions");
         var data = await resp.Content.ReadFromJsonAsync<ClientVersionsResponse>();
         if (!resp.IsSuccessStatusCode) Console.WriteLine("ClientVersions: " + data);
         return data;
     }
+
+    public async Task<AliasResult> ResolveRoomAliasAsync(string alias) {
+        var resp = await _httpClient.GetAsync($"/_matrix/client/v3/directory/room/{alias.Replace("#", "%23")}");
+        var data = await resp.Content.ReadFromJsonAsync<AliasResult>();
+        var text = await resp.Content.ReadAsStringAsync();
+        if (!resp.IsSuccessStatusCode) Console.WriteLine("ResolveAlias: " + data.ToJson());
+        return data;
+    }
+}
+
+public class AliasResult {
+    [JsonPropertyName("room_id")]
+    public string RoomId { get; set; } = null!;
+
+    [JsonPropertyName("servers")]
+    public List<string> Servers { get; set; } = null!;
 }