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!;
}
|