From d0d11db2209a8be65c27e15ca9d8a3b594f1a352 Mon Sep 17 00:00:00 2001 From: Rory& Date: Fri, 23 Feb 2024 13:57:06 +0100 Subject: Add eons of work because I forgot to push --- MatrixUtils.Abstractions/RoomInfo.cs | 48 ++++++++++++++++++++++++++---------- 1 file changed, 35 insertions(+), 13 deletions(-) (limited to 'MatrixUtils.Abstractions') diff --git a/MatrixUtils.Abstractions/RoomInfo.cs b/MatrixUtils.Abstractions/RoomInfo.cs index 877246b..53acbee 100644 --- a/MatrixUtils.Abstractions/RoomInfo.cs +++ b/MatrixUtils.Abstractions/RoomInfo.cs @@ -11,16 +11,17 @@ using LibMatrix.RoomTypes; namespace MatrixUtils.Abstractions; public class RoomInfo : NotifyPropertyChanged { - public required GenericRoom Room { get; set; } - public ObservableCollection StateEvents { get; } = new(); + public readonly GenericRoom Room; + public ObservableCollection StateEvents { get; private set; } = new(); private static ConcurrentBag homeserversWithoutEventFormatSupport = new(); - + private static SvgIdenticonGenerator identiconGenerator = new(); + public async Task GetStateEvent(string type, string stateKey = "") { if (homeserversWithoutEventFormatSupport.Contains(Room.Homeserver)) return await GetStateEventForged(type, stateKey); var @event = StateEvents.FirstOrDefault(x => x?.Type == type && x.StateKey == stateKey); if (@event is not null) return @event; - + try { @event = await Room.GetStateEventOrNullAsync(type, stateKey); StateEvents.Add(@event); @@ -30,6 +31,7 @@ public class RoomInfo : NotifyPropertyChanged { homeserversWithoutEventFormatSupport.Add(Room.Homeserver); return await GetStateEventForged(type, stateKey); } + Console.Error.WriteLine(e); await Task.Delay(1000); return await GetStateEvent(type, stateKey); @@ -79,7 +81,7 @@ public class RoomInfo : NotifyPropertyChanged { } public string? RoomIcon { - get => _roomIcon ?? "https://api.dicebear.com/6.x/identicon/svg?seed=" + Room.RoomId; + get => _roomIcon ?? _fallbackIcon; set => SetField(ref _roomIcon, value); } @@ -93,18 +95,17 @@ public class RoomInfo : NotifyPropertyChanged { set => SetField(ref _creationEventContent, value); } + private string? _roomCreator; + public string? RoomCreator { get => _roomCreator; set => SetField(ref _roomCreator, value); } - // public string? GetRoomIcon() => (StateEvents.FirstOrDefault(x => x?.Type == RoomAvatarEventContent.EventId)?.TypedContent as RoomAvatarEventContent)?.Url ?? - // "mxc://rory.gay/dgP0YPjJEWaBwzhnbyLLwGGv"; - private string? _roomIcon; + private readonly string _fallbackIcon; private string? _roomName; private RoomCreateEventContent? _creationEventContent; - private string? _roomCreator; private string? _overrideRoomType; private string? _defaultRoomName; private RoomMemberEventContent? _ownMembership; @@ -130,11 +131,25 @@ public class RoomInfo : NotifyPropertyChanged { set => SetField(ref _ownMembership, value); } - public RoomInfo() { + public RoomInfo(GenericRoom room) { + Room = room; + _fallbackIcon = identiconGenerator.GenerateAsDataUri(room.RoomId); + registerEventListener(); + } + + public RoomInfo(GenericRoom room, List? stateEvents) { + Room = room; + _fallbackIcon = identiconGenerator.GenerateAsDataUri(room.RoomId); + if (stateEvents is { Count: > 0 }) StateEvents = new(stateEvents!); + registerEventListener(); + } + + private void registerEventListener() { StateEvents.CollectionChanged += (_, args) => { if (args.NewItems is { Count: > 0 }) - foreach (StateEventResponse? newState in args.NewItems) { // TODO: switch statement benchmark? - if(newState is null) continue; + foreach (StateEventResponse? newState in args.NewItems) { + // TODO: switch statement benchmark? + if (newState is null) continue; if (newState.Type == RoomNameEventContent.EventId && newState.TypedContent is RoomNameEventContent roomNameContent) RoomName = roomNameContent.Name; else if (newState is { Type: RoomAvatarEventContent.EventId, TypedContent: RoomAvatarEventContent roomAvatarContent }) @@ -146,4 +161,11 @@ public class RoomInfo : NotifyPropertyChanged { } }; } -} + + public async Task FetchAllStateAsync() { + var stateEvents = Room.GetFullStateAsync(); + await foreach (var stateEvent in stateEvents) { + StateEvents.Add(stateEvent); + } + } +} \ No newline at end of file -- cgit 1.4.1