From 3558ba25896876b0c546f4c2decbb0671187745b Mon Sep 17 00:00:00 2001 From: Rory& Date: Fri, 14 Nov 2025 10:48:26 +0100 Subject: StateEvent -> MatrixEvent --- .../Controllers/LegacyController.cs | 2 +- .../Controllers/Rooms/RoomAccountDataController.cs | 6 ++-- .../Controllers/Rooms/RoomMembersController.cs | 4 +-- .../Controllers/Rooms/RoomStateController.cs | 4 +-- .../Controllers/Rooms/RoomTimelineController.cs | 22 ++++++------- .../Extensions/EventExtensions.cs | 6 ++-- .../Services/PaginationTokenResolverService.cs | 4 +-- .../Services/RoomStore.cs | 36 +++++++++++----------- .../Services/UserStore.cs | 9 +++--- 9 files changed, 46 insertions(+), 47 deletions(-) (limited to 'Utilities/LibMatrix.HomeserverEmulator') 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 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 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 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 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> GetMembers(string roomId, string? at = null, string? membership = null, string? not_membership = null) { + public async Task> 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 logger, TokenService tokenService, UserStore userStore, RoomStore roomStore) : ControllerBase { [HttpGet("")] - public async Task> GetState(string roomId) { + public async Task> GetState(string roomId) { var token = tokenService.GetAccessTokenOrNull(HttpContext); if (token == null) throw new MatrixException() { @@ -104,7 +104,7 @@ public class RoomStateController(ILogger 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 GetEvent(string roomId, string eventId) { + public async Task 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 GetRelations(string roomId, string eventId, [FromQuery] string? dir = "b", [FromQuery] string? from = null, + public async Task 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 GetRelations(string roomId, string eventId, string relationType, [FromQuery] string? dir = "b", + public async Task 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 GetRelations(string roomId, string eventId, string relationType, string eventType, [FromQuery] string? dir = "b", + public async Task 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> GetRelationsInternal(string roomId, string eventId, string dir, string? from, int? limit, bool? recurse, string? to) { + private async Task> 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 GetCalculatedState(this IEnumerable events) { + public static List GetCalculatedState(this IEnumerable 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 ResolveTokenToEvent(string token, RoomStore.Room room) { + public Task 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 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(null); + return Task.FromResult(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 _timeline; - private ObservableDictionary> _accountData; + private ObservableCollection _timeline; + private ObservableDictionary> _accountData; private ObservableDictionary _readMarkers; - private FrozenSet _stateCache; + private FrozenSet _stateCache; private int _timelineHash; public Room(string roomId) { @@ -129,9 +129,9 @@ public class RoomStore { public string RoomId { get; set; } - public FrozenSet State => _timelineHash == _timeline.GetHashCode() ? _stateCache : RebuildState(); + public FrozenSet State => _timelineHash == _timeline.GetHashCode() ? _stateCache : RebuildState(); - public ObservableCollection Timeline { + public ObservableCollection 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> AccountData { + public ObservableDictionary> AccountData { get => _accountData; set { if (Equals(value, _accountData)) return; @@ -164,7 +164,7 @@ public class RoomStore { } } - public ImmutableList JoinedMembers => + public ImmutableList JoinedMembers => State.Where(s => s is { Type: RoomMemberEventContent.EventId, TypedContent: RoomMemberEventContent { Membership: "join" } }).ToImmutableList(); public ObservableDictionary 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 RebuildState() { + private FrozenSet 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? timeline = null; + List? timeline = null; lock (_timeline) { - timeline = Timeline.OfType().ToList(); + timeline = Timeline.OfType().ToList(); } foreach (var evt in timeline) { @@ -284,7 +284,7 @@ public class RoomStore { } } - public List GetRoomsByMember(string userId) { + public List 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 _accessTokens; private ObservableDictionary _filters; private ObservableDictionary _profile; - private ObservableCollection _accountData; + private ObservableCollection _accountData; private ObservableDictionary _roomKeys; private ObservableDictionary _authorizedSessions; @@ -174,7 +173,7 @@ public class UserStore { } } - public ObservableCollection AccountData { + public ObservableCollection AccountData { get => _accountData; set { if (value == _accountData) return; -- cgit 1.5.1