about summary refs log tree commit diff
path: root/Utilities/LibMatrix.HomeserverEmulator
diff options
context:
space:
mode:
authorRory& <root@rory.gay>2025-11-14 10:48:26 +0100
committerRory& <root@rory.gay>2025-11-14 10:48:26 +0100
commit3558ba25896876b0c546f4c2decbb0671187745b (patch)
tree4e1a21a109726bbd7768e8a63b36f720c36f97f9 /Utilities/LibMatrix.HomeserverEmulator
parentHandle some non-browser network errors, clean up some well known resolver stuff (diff)
downloadLibMatrix-3558ba25896876b0c546f4c2decbb0671187745b.tar.xz
StateEvent -> MatrixEvent
Diffstat (limited to 'Utilities/LibMatrix.HomeserverEmulator')
-rw-r--r--Utilities/LibMatrix.HomeserverEmulator/Controllers/LegacyController.cs2
-rw-r--r--Utilities/LibMatrix.HomeserverEmulator/Controllers/Rooms/RoomAccountDataController.cs6
-rw-r--r--Utilities/LibMatrix.HomeserverEmulator/Controllers/Rooms/RoomMembersController.cs4
-rw-r--r--Utilities/LibMatrix.HomeserverEmulator/Controllers/Rooms/RoomStateController.cs4
-rw-r--r--Utilities/LibMatrix.HomeserverEmulator/Controllers/Rooms/RoomTimelineController.cs22
-rw-r--r--Utilities/LibMatrix.HomeserverEmulator/Extensions/EventExtensions.cs6
-rw-r--r--Utilities/LibMatrix.HomeserverEmulator/Services/PaginationTokenResolverService.cs4
-rw-r--r--Utilities/LibMatrix.HomeserverEmulator/Services/RoomStore.cs36
-rw-r--r--Utilities/LibMatrix.HomeserverEmulator/Services/UserStore.cs9
9 files changed, 46 insertions, 47 deletions
diff --git a/Utilities/LibMatrix.HomeserverEmulator/Controllers/LegacyController.cs b/Utilities/LibMatrix.HomeserverEmulator/Controllers/LegacyController.cs

index 245770e..4c4e970 100644 --- a/Utilities/LibMatrix.HomeserverEmulator/Controllers/LegacyController.cs +++ b/Utilities/LibMatrix.HomeserverEmulator/Controllers/LegacyController.cs
@@ -42,7 +42,7 @@ public class LegacyController(ILogger<LegacyController> logger, TokenService tok room_id = room.RoomId, state = room.State.ToList(), visibility = "public", - messages = new PaginatedChunkedStateEventResponse() { + messages = new PaginatedChunkedMatrixEventResponse() { Chunk = timelineChunk, End = timelineChunk.Last().EventId, Start = timelineChunk.Count >= limit ? timelineChunk.First().EventId : null diff --git a/Utilities/LibMatrix.HomeserverEmulator/Controllers/Rooms/RoomAccountDataController.cs b/Utilities/LibMatrix.HomeserverEmulator/Controllers/Rooms/RoomAccountDataController.cs
index bac803f..7bab143 100644 --- a/Utilities/LibMatrix.HomeserverEmulator/Controllers/Rooms/RoomAccountDataController.cs +++ b/Utilities/LibMatrix.HomeserverEmulator/Controllers/Rooms/RoomAccountDataController.cs
@@ -38,7 +38,7 @@ public class RoomAccountDataController(ILogger<RoomAccountDataController> logger if (!room.AccountData.ContainsKey(user.UserId)) room.AccountData[user.UserId] = new(); - room.AccountData[user.UserId].Add(new StateEventResponse() { + room.AccountData[user.UserId].Add(new MatrixEventResponse() { Type = "m.fully_read", StateKey = user.UserId, RawContent = new() { @@ -46,7 +46,7 @@ public class RoomAccountDataController(ILogger<RoomAccountDataController> logger } }); - room.AccountData[user.UserId].Add(new StateEventResponse() { + room.AccountData[user.UserId].Add(new MatrixEventResponse() { Type = "m.read", StateKey = user.UserId, RawContent = new() { @@ -54,7 +54,7 @@ public class RoomAccountDataController(ILogger<RoomAccountDataController> logger } }); - room.AccountData[user.UserId].Add(new StateEventResponse() { + room.AccountData[user.UserId].Add(new MatrixEventResponse() { Type = "m.read.private", StateKey = user.UserId, RawContent = new() { diff --git a/Utilities/LibMatrix.HomeserverEmulator/Controllers/Rooms/RoomMembersController.cs b/Utilities/LibMatrix.HomeserverEmulator/Controllers/Rooms/RoomMembersController.cs
index 6c57cc4..f599e5e 100644 --- a/Utilities/LibMatrix.HomeserverEmulator/Controllers/Rooms/RoomMembersController.cs +++ b/Utilities/LibMatrix.HomeserverEmulator/Controllers/Rooms/RoomMembersController.cs
@@ -13,7 +13,7 @@ public class RoomMembersController( RoomStore roomStore, PaginationTokenResolverService paginationTokenResolver) : ControllerBase { [HttpGet("members")] - public async Task<List<StateEventResponse>> GetMembers(string roomId, string? at = null, string? membership = null, string? not_membership = null) { + public async Task<List<MatrixEventResponse>> GetMembers(string roomId, string? at = null, string? membership = null, string? not_membership = null) { var token = tokenService.GetAccessTokenOrNull(HttpContext); if (token == null) throw new MatrixException() { @@ -44,7 +44,7 @@ public class RoomMembersController( members = members.Where(x => (x.TypedContent as RoomMemberEventContent)?.Membership != not_membership).ToList(); if (at != null) { - StateEventResponse? evt = null; + MatrixEventResponse? evt = null; if (at.StartsWith('$')) evt = await paginationTokenResolver.ResolveTokenToEvent(at, room); diff --git a/Utilities/LibMatrix.HomeserverEmulator/Controllers/Rooms/RoomStateController.cs b/Utilities/LibMatrix.HomeserverEmulator/Controllers/Rooms/RoomStateController.cs
index 485c028..bc17b06 100644 --- a/Utilities/LibMatrix.HomeserverEmulator/Controllers/Rooms/RoomStateController.cs +++ b/Utilities/LibMatrix.HomeserverEmulator/Controllers/Rooms/RoomStateController.cs
@@ -11,7 +11,7 @@ namespace LibMatrix.HomeserverEmulator.Controllers.Rooms; [Route("/_matrix/client/{version}/rooms/{roomId}/state")] public class RoomStateController(ILogger<RoomStateController> logger, TokenService tokenService, UserStore userStore, RoomStore roomStore) : ControllerBase { [HttpGet("")] - public async Task<FrozenSet<StateEventResponse>> GetState(string roomId) { + public async Task<FrozenSet<MatrixEventResponse>> GetState(string roomId) { var token = tokenService.GetAccessTokenOrNull(HttpContext); if (token == null) throw new MatrixException() { @@ -104,7 +104,7 @@ public class RoomStateController(ILogger<RoomStateController> logger, TokenServi ErrorCode = "M_NOT_FOUND", Error = "Room not found" }; - var evt = room.SetStateInternal(new StateEvent() { Type = eventType, StateKey = stateKey, RawContent = request }.ToStateEvent(user, room)); + var evt = room.SetStateInternal(new MatrixEvent() { Type = eventType, StateKey = stateKey, RawContent = request }.ToStateEvent(user, room)); evt.Type = eventType; evt.StateKey = stateKey; return new EventIdResponse() { diff --git a/Utilities/LibMatrix.HomeserverEmulator/Controllers/Rooms/RoomTimelineController.cs b/Utilities/LibMatrix.HomeserverEmulator/Controllers/Rooms/RoomTimelineController.cs
index 61195b8..d05554c 100644 --- a/Utilities/LibMatrix.HomeserverEmulator/Controllers/Rooms/RoomTimelineController.cs +++ b/Utilities/LibMatrix.HomeserverEmulator/Controllers/Rooms/RoomTimelineController.cs
@@ -35,7 +35,7 @@ public class RoomTimelineController( Error = "Room not found" }; - var evt = new StateEvent() { + var evt = new MatrixEvent() { RawContent = content, Type = eventType }.ToStateEvent(user, room); @@ -100,7 +100,7 @@ public class RoomTimelineController( } [HttpGet("event/{eventId}")] - public async Task<StateEventResponse> GetEvent(string roomId, string eventId) { + public async Task<MatrixEventResponse> GetEvent(string roomId, string eventId) { var token = tokenService.GetAccessToken(HttpContext); var user = await userStore.GetUserByToken(token); @@ -128,7 +128,7 @@ public class RoomTimelineController( } [HttpGet("relations/{eventId}")] - public async Task<RecursedBatchedChunkedStateEventResponse> GetRelations(string roomId, string eventId, [FromQuery] string? dir = "b", [FromQuery] string? from = null, + public async Task<RecursedBatchedChunkedMatrixEventResponse> GetRelations(string roomId, string eventId, [FromQuery] string? dir = "b", [FromQuery] string? from = null, [FromQuery] int? limit = 100, [FromQuery] bool? recurse = false, [FromQuery] string? to = null) { var token = tokenService.GetAccessToken(HttpContext); var user = await userStore.GetUserByToken(token); @@ -161,7 +161,7 @@ public class RoomTimelineController( } [HttpGet("relations/{eventId}/{relationType}")] - public async Task<RecursedBatchedChunkedStateEventResponse> GetRelations(string roomId, string eventId, string relationType, [FromQuery] string? dir = "b", + public async Task<RecursedBatchedChunkedMatrixEventResponse> GetRelations(string roomId, string eventId, string relationType, [FromQuery] string? dir = "b", [FromQuery] string? from = null, [FromQuery] int? limit = 100, [FromQuery] bool? recurse = false, [FromQuery] string? to = null) { var token = tokenService.GetAccessToken(HttpContext); var user = await userStore.GetUserByToken(token); @@ -194,7 +194,7 @@ public class RoomTimelineController( } [HttpGet("relations/{eventId}/{relationType}/{eventType}")] - public async Task<RecursedBatchedChunkedStateEventResponse> GetRelations(string roomId, string eventId, string relationType, string eventType, [FromQuery] string? dir = "b", + public async Task<RecursedBatchedChunkedMatrixEventResponse> GetRelations(string roomId, string eventId, string relationType, string eventType, [FromQuery] string? dir = "b", [FromQuery] string? from = null, [FromQuery] int? limit = 100, [FromQuery] bool? recurse = false, [FromQuery] string? to = null) { var token = tokenService.GetAccessToken(HttpContext); var user = await userStore.GetUserByToken(token); @@ -226,7 +226,7 @@ public class RoomTimelineController( }; } - private async Task<IEnumerable<StateEventResponse>> GetRelationsInternal(string roomId, string eventId, string dir, string? from, int? limit, bool? recurse, string? to) { + private async Task<IEnumerable<MatrixEventResponse>> GetRelationsInternal(string roomId, string eventId, string dir, string? from, int? limit, bool? recurse, string? to) { var room = roomStore.GetRoomById(roomId); var evt = room.Timeline.SingleOrDefault(x => x.EventId == eventId); if (evt == null) @@ -254,7 +254,7 @@ public class RoomTimelineController( private void InternalSendMessage(RoomStore.Room room, RoomMessageEventContent content) { logger.LogInformation("Sending internal message: {content}", content.Body); - room.Timeline.Add(new StateEventResponse() { + room.Timeline.Add(new MatrixEventResponse() { Type = RoomMessageEventContent.EventId, TypedContent = content, // Sender = $"@hse:{tokenService.GenerateServerName(HttpContext)}", @@ -265,7 +265,7 @@ public class RoomTimelineController( }); } - private async Task HandleHseCommand(StateEventResponse evt, RoomStore.Room room, UserStore.User user) { + private async Task HandleHseCommand(MatrixEventResponse evt, RoomStore.Room room, UserStore.User user) { logger.LogWarning("Handling HSE command for {0}: {1}", user.UserId, evt.RawContent.ToJson(false, true)); try { var msgContent = evt.TypedContent as RoomMessageEventContent; @@ -332,7 +332,7 @@ public class RoomTimelineController( if (Random.Shared.Next(100) > 75) { crq.CreationContent["type"] = "m.space"; foreach (var item in Random.Shared.GetItems(roomStore._rooms.ToArray(), 50)) { - crq.InitialState!.Add(new StateEvent() { + crq.InitialState!.Add(new MatrixEvent() { Type = "m.space.child", StateKey = item.RoomId, TypedContent = new SpaceChildEventContent() { @@ -384,7 +384,7 @@ public class RoomTimelineController( } } - private async Task HandleImportNhekoProfilesCommand(string[] args, StateEventResponse evt, RoomStore.Room room, UserStore.User user) { + private async Task HandleImportNhekoProfilesCommand(string[] args, MatrixEventResponse evt, RoomStore.Room room, UserStore.User user) { var msgContent = evt.TypedContent as RoomMessageEventContent; var parts = msgContent.Body.Split('\n'); @@ -422,7 +422,7 @@ public class RoomTimelineController( } } - private async Task HandleImportCommand(string[] args, StateEventResponse evt, RoomStore.Room room, UserStore.User user) { + private async Task HandleImportCommand(string[] args, MatrixEventResponse evt, RoomStore.Room room, UserStore.User user) { var roomId = args[0]; var profile = args[1]; diff --git a/Utilities/LibMatrix.HomeserverEmulator/Extensions/EventExtensions.cs b/Utilities/LibMatrix.HomeserverEmulator/Extensions/EventExtensions.cs
index d938b1b..15e41d4 100644 --- a/Utilities/LibMatrix.HomeserverEmulator/Extensions/EventExtensions.cs +++ b/Utilities/LibMatrix.HomeserverEmulator/Extensions/EventExtensions.cs
@@ -3,8 +3,8 @@ using LibMatrix.HomeserverEmulator.Services; namespace LibMatrix.HomeserverEmulator.Extensions; public static class EventExtensions { - public static StateEventResponse ToStateEvent(this StateEvent stateEvent, UserStore.User user, RoomStore.Room room) { - return new StateEventResponse { + public static MatrixEventResponse ToStateEvent(this StateEvent stateEvent, UserStore.User user, RoomStore.Room room) { + return new MatrixEventResponse { RawContent = stateEvent.RawContent, EventId = "$" + string.Join("", Random.Shared.GetItems("abcdefghijklmnopqrstuvwxyzABCDEFGHIJLKMNOPQRSTUVWXYZ0123456789".ToCharArray(), 100)), RoomId = room.RoomId, @@ -15,7 +15,7 @@ public static class EventExtensions { }; } - public static List<StateEventResponse> GetCalculatedState(this IEnumerable<StateEventResponse> events) { + public static List<MatrixEventResponse> GetCalculatedState(this IEnumerable<MatrixEventResponse> events) { return events.Where(s => s.StateKey != null) .OrderByDescending(s => s.OriginServerTs) .DistinctBy(x => (x.Type, x.StateKey)) diff --git a/Utilities/LibMatrix.HomeserverEmulator/Services/PaginationTokenResolverService.cs b/Utilities/LibMatrix.HomeserverEmulator/Services/PaginationTokenResolverService.cs
index 0603a2d..7324bd8 100644 --- a/Utilities/LibMatrix.HomeserverEmulator/Services/PaginationTokenResolverService.cs +++ b/Utilities/LibMatrix.HomeserverEmulator/Services/PaginationTokenResolverService.cs
@@ -35,7 +35,7 @@ public class PaginationTokenResolverService(ILogger<PaginationTokenResolverServi } } - public Task<StateEventResponse?> ResolveTokenToEvent(string token, RoomStore.Room room) { + public Task<MatrixEventResponse?> ResolveTokenToEvent(string token, RoomStore.Room room) { if (token.StartsWith('$')) { //we have an event ID logger.LogTrace("ResolveTokenToEvent(EventId({token}), Room({room})): searching for event...", token, room.RoomId); @@ -43,7 +43,7 @@ public class PaginationTokenResolverService(ILogger<PaginationTokenResolverServi var evt = room.Timeline.SingleOrDefault(x => x.EventId == token); if (evt is not null) return Task.FromResult(evt); logger.LogTrace("ResolveTokenToEvent({token}, Room({room})): event not in requested room...", token, room.RoomId); - return Task.FromResult<StateEventResponse?>(null); + return Task.FromResult<MatrixEventResponse?>(null); } else { // we have a sync token diff --git a/Utilities/LibMatrix.HomeserverEmulator/Services/RoomStore.cs b/Utilities/LibMatrix.HomeserverEmulator/Services/RoomStore.cs
index b6fe7c2..232863f 100644 --- a/Utilities/LibMatrix.HomeserverEmulator/Services/RoomStore.cs +++ b/Utilities/LibMatrix.HomeserverEmulator/Services/RoomStore.cs
@@ -51,7 +51,7 @@ public class RoomStore { public Room CreateRoom(CreateRoomRequest request, UserStore.User? user = null) { var room = new Room(roomId: $"!{Guid.NewGuid().ToString()}"); - var newCreateEvent = new StateEvent() { + var newCreateEvent = new MatrixEvent() { Type = RoomCreateEventContent.EventId, RawContent = new() }; @@ -78,7 +78,7 @@ public class RoomStore { } if (!string.IsNullOrWhiteSpace(request.Name)) - room.SetStateInternal(new StateEvent() { + room.SetStateInternal(new MatrixEvent() { Type = RoomNameEventContent.EventId, TypedContent = new RoomNameEventContent() { Name = request.Name @@ -86,7 +86,7 @@ public class RoomStore { }); if (!string.IsNullOrWhiteSpace(request.RoomAliasName)) - room.SetStateInternal(new StateEvent() { + room.SetStateInternal(new MatrixEvent() { Type = RoomCanonicalAliasEventContent.EventId, TypedContent = new RoomCanonicalAliasEventContent() { Alias = $"#{request.RoomAliasName}:localhost" @@ -112,10 +112,10 @@ public class RoomStore { public class Room : NotifyPropertyChanged { private CancellationTokenSource _debounceCts = new(); - private ObservableCollection<StateEventResponse> _timeline; - private ObservableDictionary<string, List<StateEventResponse>> _accountData; + private ObservableCollection<MatrixEventResponse> _timeline; + private ObservableDictionary<string, List<MatrixEventResponse>> _accountData; private ObservableDictionary<string, ReadMarkersData> _readMarkers; - private FrozenSet<StateEventResponse> _stateCache; + private FrozenSet<MatrixEventResponse> _stateCache; private int _timelineHash; public Room(string roomId) { @@ -129,9 +129,9 @@ public class RoomStore { public string RoomId { get; set; } - public FrozenSet<StateEventResponse> State => _timelineHash == _timeline.GetHashCode() ? _stateCache : RebuildState(); + public FrozenSet<MatrixEventResponse> State => _timelineHash == _timeline.GetHashCode() ? _stateCache : RebuildState(); - public ObservableCollection<StateEventResponse> Timeline { + public ObservableCollection<MatrixEventResponse> Timeline { get => _timeline; set { if (Equals(value, _timeline)) return; @@ -140,7 +140,7 @@ public class RoomStore { // we dont want to do this as it's rebuilt when the state is accessed // if (args.Action == NotifyCollectionChangedAction.Add) { - // foreach (StateEventResponse state in args.NewItems) { + // foreach (MatrixEventResponse state in args.NewItems) { // if (state.StateKey is not null) // // we want state to be deduplicated by type and key, and we want the latest state to be the one that is returned // RebuildState(); @@ -154,7 +154,7 @@ public class RoomStore { } } - public ObservableDictionary<string, List<StateEventResponse>> AccountData { + public ObservableDictionary<string, List<MatrixEventResponse>> AccountData { get => _accountData; set { if (Equals(value, _accountData)) return; @@ -164,7 +164,7 @@ public class RoomStore { } } - public ImmutableList<StateEventResponse> JoinedMembers => + public ImmutableList<MatrixEventResponse> JoinedMembers => State.Where(s => s is { Type: RoomMemberEventContent.EventId, TypedContent: RoomMemberEventContent { Membership: "join" } }).ToImmutableList(); public ObservableDictionary<string, ReadMarkersData> ReadMarkers { @@ -177,8 +177,8 @@ public class RoomStore { } } - internal StateEventResponse SetStateInternal(StateEvent request, string? senderId = null, UserStore.User? user = null) { - var state = request as StateEventResponse ?? new StateEventResponse() { + internal MatrixEventResponse SetStateInternal(MatrixEvent request, string? senderId = null, UserStore.User? user = null) { + var state = request as MatrixEventResponse ?? new MatrixEventResponse() { Type = request.Type, StateKey = request.StateKey ?? "", EventId = "$" + Guid.NewGuid().ToString(), @@ -195,7 +195,7 @@ public class RoomStore { return state; } - public StateEventResponse AddUser(string userId) { + public MatrixEventResponse AddUser(string userId) { var state = SetStateInternal(new() { Type = RoomMemberEventContent.EventId, StateKey = userId, @@ -245,15 +245,15 @@ public class RoomStore { private SemaphoreSlim stateRebuildSemaphore = new(1, 1); - private FrozenSet<StateEventResponse> RebuildState() { + private FrozenSet<MatrixEventResponse> RebuildState() { stateRebuildSemaphore.Wait(); while (true) try { Console.WriteLine($"Rebuilding state for room {RoomId}"); // ReSharper disable once RedundantEnumerableCastCall - This sometimes happens when the collection is modified during enumeration - List<StateEventResponse>? timeline = null; + List<MatrixEventResponse>? timeline = null; lock (_timeline) { - timeline = Timeline.OfType<StateEventResponse>().ToList(); + timeline = Timeline.OfType<MatrixEventResponse>().ToList(); } foreach (var evt in timeline) { @@ -284,7 +284,7 @@ public class RoomStore { } } - public List<StateEventResponse> GetRoomsByMember(string userId) { + public List<MatrixEventResponse> GetRoomsByMember(string userId) { // return _rooms // // .Where(r => r.State.Any(s => s.Type == RoomMemberEventContent.EventId && s.StateKey == userId)) // .Select(r => (Room: r, MemberEvent: r.State.SingleOrDefault(s => s.Type == RoomMemberEventContent.EventId && s.StateKey == userId))) diff --git a/Utilities/LibMatrix.HomeserverEmulator/Services/UserStore.cs b/Utilities/LibMatrix.HomeserverEmulator/Services/UserStore.cs
index 7f211e3..124a082 100644 --- a/Utilities/LibMatrix.HomeserverEmulator/Services/UserStore.cs +++ b/Utilities/LibMatrix.HomeserverEmulator/Services/UserStore.cs
@@ -75,19 +75,18 @@ public class UserStore { UserId = $"@{localPart}:{_config.ServerName}", IsGuest = kind == "guest", AccountData = new() { - new StateEventResponse() { + new MatrixEventResponse() { Type = "im.vector.analytics", RawContent = new JsonObject() { ["pseudonymousAnalyticsOptIn"] = false }, }, - new StateEventResponse() { + new MatrixEventResponse() { Type = "im.vector.web.settings", RawContent = new JsonObject() { ["developerMode"] = true, ["alwaysShowTimestamps"] = true, ["SpotlightSearch.showNsfwPublicRooms"] = true, - } }, new() { @@ -135,7 +134,7 @@ public class UserStore { private ObservableDictionary<string, SessionInfo> _accessTokens; private ObservableDictionary<string, SyncFilter> _filters; private ObservableDictionary<string, object> _profile; - private ObservableCollection<StateEventResponse> _accountData; + private ObservableCollection<MatrixEventResponse> _accountData; private ObservableDictionary<string, RoomKeysResponse> _roomKeys; private ObservableDictionary<string, LoginResponse> _authorizedSessions; @@ -174,7 +173,7 @@ public class UserStore { } } - public ObservableCollection<StateEventResponse> AccountData { + public ObservableCollection<MatrixEventResponse> AccountData { get => _accountData; set { if (value == _accountData) return;