From 373e3a481e9b16b328002426d416344a87ef1058 Mon Sep 17 00:00:00 2001 From: Rory& Date: Tue, 18 Feb 2025 07:41:20 +0100 Subject: Some cleanup --- Benchmarks/Program.cs | 5 +- LibMatrix | 2 +- MatrixUtils.Abstractions/RoomInfo.cs | 8 +-- MatrixUtils.Web/Classes/RMUStorageWrapper.cs | 37 +++++----- MatrixUtils.Web/MatrixUtils.Web.csproj | 38 +++++----- MatrixUtils.Web/Pages/Index.razor | 5 +- .../Client/ClientComponents/ClientRoomList.razor | 2 +- .../Client/ClientComponents/ClientStatusList.razor | 2 +- .../Client/ClientComponents/MatrixClient.razor | 2 +- .../MainTabComponents/MainTabSpaceItem.razor | 11 +-- .../RoomsIndex2ByRoomTypeTab.razor | 2 +- .../Index2Components/RoomsIndex2DMsTab.razor | 2 +- .../Index2Components/RoomsIndex2MainTab.razor | 2 +- .../RoomsIndex2SyncContainer.razor | 4 +- MatrixUtils.Web/Pages/Rooms/Index.razor | 22 +++--- MatrixUtils.Web/Pages/Rooms/PolicyList.razor | 2 +- MatrixUtils.Web/Pages/Rooms/PolicyList2.razor | 2 +- MatrixUtils.Web/Pages/StreamTest.razor | 2 +- .../Pages/Tools/Moderation/InviteCounter.razor | 24 +++---- .../Pages/Tools/Moderation/MembershipHistory.razor | 7 +- .../Pages/Tools/Moderation/UserTrace.razor | 3 + MatrixUtils.Web/Pages/User/Profile.razor | 4 +- MatrixUtils.Web/Shared/InlineUserItem.razor | 1 - MatrixUtils.Web/Shared/MxcAvatar.razor | 52 ++++++-------- MatrixUtils.Web/Shared/MxcImage.razor | 82 +++++++++++----------- MatrixUtils.Web/Shared/RoomList.razor | 5 +- .../RoomListComponents/RoomListCategory.razor | 11 +-- .../Shared/RoomListComponents/RoomListSpace.razor | 11 ++- MatrixUtils.Web/Shared/RoomListItem.razor | 20 ++++-- MatrixUtils.Web/Shared/UserListItem.razor | 7 +- 30 files changed, 207 insertions(+), 170 deletions(-) diff --git a/Benchmarks/Program.cs b/Benchmarks/Program.cs index b85fc24..90d004a 100644 --- a/Benchmarks/Program.cs +++ b/Benchmarks/Program.cs @@ -1,7 +1,10 @@ // See https://aka.ms/new-console-template for more information +using System; using System.Collections.Frozen; +using System.Collections.Generic; using System.Collections.Immutable; +using System.Linq; using BenchmarkDotNet.Attributes; using BenchmarkDotNet.Configs; using BenchmarkDotNet.Engines; @@ -262,7 +265,7 @@ public class Program { if (!DoDisambiguate || !DisambiguateKnockActions || !DisambiguateKnockRejected) _map[MembershipTransition.KnockRejected] = MembershipTransition.Leave; if (!DoDisambiguate || !DisambiguateKnockActions || !DisambiguateKnockRetracted) _map[MembershipTransition.KnockRetracted] = MembershipTransition.Leave; FrozenDictionary map = _map.ToFrozenDictionary(); - _map = null!; + // _map foreach (var entry in entries) { var newState = map.TryGetValue(entry.State, out var value) ? value : entry.State; yield return newState == entry.State ? entry : entry with { State = newState }; diff --git a/LibMatrix b/LibMatrix index ca3e687..8673cb2 160000 --- a/LibMatrix +++ b/LibMatrix @@ -1 +1 @@ -Subproject commit ca3e6878422b7b55ae52b43f49f89a19546ea51c +Subproject commit 8673cb236f427ba6af6382e3b5702a134f1afe2e diff --git a/MatrixUtils.Abstractions/RoomInfo.cs b/MatrixUtils.Abstractions/RoomInfo.cs index 81ce388..4b2a53c 100644 --- a/MatrixUtils.Abstractions/RoomInfo.cs +++ b/MatrixUtils.Abstractions/RoomInfo.cs @@ -12,13 +12,13 @@ namespace MatrixUtils.Abstractions; public class RoomInfo : NotifyPropertyChanged { public RoomInfo(GenericRoom room) { Room = room; - _fallbackIcon = identiconGenerator.GenerateAsDataUri(room.RoomId); + // _fallbackIcon = identiconGenerator.GenerateAsDataUri(room.RoomId); RegisterEventListener(); } public RoomInfo(GenericRoom room, List? stateEvents) { Room = room; - _fallbackIcon = identiconGenerator.GenerateAsDataUri(room.RoomId); + // _fallbackIcon = identiconGenerator.GenerateAsDataUri(room.RoomId); if (stateEvents is { Count: > 0 }) StateEvents = new(stateEvents!); RegisterEventListener(); ProcessNewItems(stateEvents!); @@ -29,7 +29,7 @@ public class RoomInfo : NotifyPropertyChanged { public ObservableCollection Timeline { get; private set; } = new(); private static ConcurrentBag homeserversWithoutEventFormatSupport = new(); - private static SvgIdenticonGenerator identiconGenerator = new(); + // private static SvgIdenticonGenerator identiconGenerator = new(); public async Task GetStateEvent(string type, string stateKey = "") { if (homeserversWithoutEventFormatSupport.Contains(Room.Homeserver)) return await GetStateEventForged(type, stateKey); @@ -95,7 +95,7 @@ public class RoomInfo : NotifyPropertyChanged { } public string? RoomIcon { - get => _roomIcon ?? _fallbackIcon; + get => _roomIcon; set => SetField(ref _roomIcon, value); } diff --git a/MatrixUtils.Web/Classes/RMUStorageWrapper.cs b/MatrixUtils.Web/Classes/RMUStorageWrapper.cs index e63c28e..1fc4dd1 100644 --- a/MatrixUtils.Web/Classes/RMUStorageWrapper.cs +++ b/MatrixUtils.Web/Classes/RMUStorageWrapper.cs @@ -5,15 +5,19 @@ using Microsoft.AspNetCore.Components; namespace MatrixUtils.Web.Classes; -public class RMUStorageWrapper(ILogger logger, TieredStorageService storageService, HomeserverProviderService homeserverProviderService, NavigationManager navigationManager) { +public class RMUStorageWrapper( + ILogger logger, + TieredStorageService storageService, + HomeserverProviderService homeserverProviderService, + NavigationManager navigationManager) { public async Task?> GetAllTokens() { logger.LogTrace("Getting all tokens."); return await storageService.DataStorageProvider.LoadObjectAsync>("rmu.tokens") ?? new List(); } - public async Task GetCurrentToken() { - logger.LogTrace("Getting current token."); + public async Task GetCurrentToken(bool log = true) { + if (log) logger.LogTrace("Getting current token."); var currentToken = await storageService.DataStorageProvider.LoadObjectAsync("rmu.token"); var allTokens = await GetAllTokens(); if (allTokens is null or { Count: 0 }) { @@ -44,9 +48,9 @@ public class RMUStorageWrapper(ILogger logger, TieredStorageS await storageService.DataStorageProvider.SaveObjectAsync("rmu.tokens", tokens); } - private async Task GetCurrentSession() { - logger.LogTrace("Getting current session."); - var token = await GetCurrentToken(); + private async Task GetCurrentSession(bool log = true) { + if (log) logger.LogTrace("Getting current session."); + var token = await GetCurrentToken(log: false); if (token == null) { return null; } @@ -54,8 +58,8 @@ public class RMUStorageWrapper(ILogger logger, TieredStorageS return await GetSession(token); } - public async Task GetSession(UserAuth userAuth) { - logger.LogTrace("Getting session."); + public async Task GetSession(UserAuth userAuth, bool log = true) { + if (log) logger.LogTrace("Getting session."); AuthenticatedHomeserverGeneric hs; try { hs = await homeserverProviderService.GetAuthenticatedWithToken(userAuth.Homeserver, userAuth.AccessToken, userAuth.Proxy); @@ -65,11 +69,12 @@ public class RMUStorageWrapper(ILogger logger, TieredStorageS logger.LogError("Continuing with server-less session"); hs = await homeserverProviderService.GetAuthenticatedWithToken(userAuth.Homeserver, userAuth.AccessToken, userAuth.Proxy, useGeneric: true, enableServer: false); } + return hs; } - public async Task GetCurrentSessionOrNavigate() { - logger.LogTrace("Getting current session or navigating."); + public async Task GetCurrentSessionOrNavigate(bool log = true) { + if (log) logger.LogTrace("Getting current session or navigating."); AuthenticatedHomeserverGeneric? session = null; try { @@ -124,23 +129,23 @@ public class RMUStorageWrapper(ILogger logger, TieredStorageS public async Task MigrateFromMRU() { logger.LogInformation("Migrating from MRU token namespace!"); var dsp = storageService.DataStorageProvider!; - if(await dsp.ObjectExistsAsync("token")) { + if (await dsp.ObjectExistsAsync("token")) { var oldToken = await dsp.LoadObjectAsync("token"); if (oldToken != null) { await dsp.SaveObjectAsync("rmu.token", oldToken); await dsp.DeleteObjectAsync("tokens"); } } - - if(await dsp.ObjectExistsAsync("tokens")) { + + if (await dsp.ObjectExistsAsync("tokens")) { var oldTokens = await dsp.LoadObjectAsync>("tokens"); if (oldTokens != null) { await dsp.SaveObjectAsync("rmu.tokens", oldTokens); await dsp.DeleteObjectAsync("tokens"); } } - - if(await dsp.ObjectExistsAsync("mru.tokens")) { + + if (await dsp.ObjectExistsAsync("mru.tokens")) { var oldTokens = await dsp.LoadObjectAsync>("mru.tokens"); if (oldTokens != null) { await dsp.SaveObjectAsync("rmu.tokens", oldTokens); @@ -148,4 +153,4 @@ public class RMUStorageWrapper(ILogger logger, TieredStorageS } } } -} +} \ No newline at end of file diff --git a/MatrixUtils.Web/MatrixUtils.Web.csproj b/MatrixUtils.Web/MatrixUtils.Web.csproj index b472b45..acb4054 100644 --- a/MatrixUtils.Web/MatrixUtils.Web.csproj +++ b/MatrixUtils.Web/MatrixUtils.Web.csproj @@ -17,24 +17,24 @@ - - false - false - false - true - - false - false - false - false - false - false - false - false - false - false - false - + + + + + + + + + + + + + + + + + + @@ -42,7 +42,7 @@ - + diff --git a/MatrixUtils.Web/Pages/Index.razor b/MatrixUtils.Web/Pages/Index.razor index 8847467..b9d3233 100644 --- a/MatrixUtils.Web/Pages/Index.razor +++ b/MatrixUtils.Web/Pages/Index.razor @@ -25,8 +25,9 @@ Small collection of tools to do not-so-everyday things. var auth = session.UserAuth; - @if (!string.IsNullOrWhiteSpace(@session.UserInfo.AvatarUrl)) { - + @if (!string.IsNullOrWhiteSpace(@session.UserInfo?.AvatarUrl)) { + // Console.WriteLine($"Rendering {session.UserInfo.AvatarUrl} with homeserver {session.Homeserver}"); + } else { diff --git a/MatrixUtils.Web/Pages/Labs/Client/ClientComponents/ClientRoomList.razor b/MatrixUtils.Web/Pages/Labs/Client/ClientComponents/ClientRoomList.razor index b370080..8831dd1 100644 --- a/MatrixUtils.Web/Pages/Labs/Client/ClientComponents/ClientRoomList.razor +++ b/MatrixUtils.Web/Pages/Labs/Client/ClientComponents/ClientRoomList.razor @@ -10,6 +10,6 @@ @code { [Parameter] - public ClientContext Data { get; set; } = null!; + public ClientContext Data { get; set; } } \ No newline at end of file diff --git a/MatrixUtils.Web/Pages/Labs/Client/ClientComponents/ClientStatusList.razor b/MatrixUtils.Web/Pages/Labs/Client/ClientComponents/ClientStatusList.razor index c680c13..60f850d 100644 --- a/MatrixUtils.Web/Pages/Labs/Client/ClientComponents/ClientStatusList.razor +++ b/MatrixUtils.Web/Pages/Labs/Client/ClientComponents/ClientStatusList.razor @@ -10,7 +10,7 @@ @code { [Parameter] - public ObservableCollection Data { get; set; } = null!; + public ObservableCollection Data { get; set; } protected override void OnInitialized() { Data.CollectionChanged += (_, e) => { diff --git a/MatrixUtils.Web/Pages/Labs/Client/ClientComponents/MatrixClient.razor b/MatrixUtils.Web/Pages/Labs/Client/ClientComponents/MatrixClient.razor index 67dcae5..6a930b1 100644 --- a/MatrixUtils.Web/Pages/Labs/Client/ClientComponents/MatrixClient.razor +++ b/MatrixUtils.Web/Pages/Labs/Client/ClientComponents/MatrixClient.razor @@ -25,6 +25,6 @@ @code { [Parameter] - public Index.ClientContext Data { get; set; } = null!; + public Index.ClientContext Data { get; set; } } \ No newline at end of file diff --git a/MatrixUtils.Web/Pages/Labs/Rooms2/Index2Components/MainTabComponents/MainTabSpaceItem.razor b/MatrixUtils.Web/Pages/Labs/Rooms2/Index2Components/MainTabComponents/MainTabSpaceItem.razor index 596d63d..ba994d1 100644 --- a/MatrixUtils.Web/Pages/Labs/Rooms2/Index2Components/MainTabComponents/MainTabSpaceItem.razor +++ b/MatrixUtils.Web/Pages/Labs/Rooms2/Index2Components/MainTabComponents/MainTabSpaceItem.razor @@ -1,14 +1,14 @@ @using MatrixUtils.Abstractions -
+
@if (IsSpaceOpened()) { - + } else { - + } - + @Space.RoomName
@if (IsSpaceOpened()) { @@ -30,6 +30,9 @@ [Parameter] public List OpenedSpaces { get; set; } + [Parameter] + public AuthenticatedHomeserverGeneric Homeserver { get; set; } + protected override Task OnInitializedAsync() { Space.PropertyChanged += (sender, args) => { StateHasChanged(); }; return base.OnInitializedAsync(); diff --git a/MatrixUtils.Web/Pages/Labs/Rooms2/Index2Components/RoomsIndex2ByRoomTypeTab.razor b/MatrixUtils.Web/Pages/Labs/Rooms2/Index2Components/RoomsIndex2ByRoomTypeTab.razor index f4cf849..79f931b 100644 --- a/MatrixUtils.Web/Pages/Labs/Rooms2/Index2Components/RoomsIndex2ByRoomTypeTab.razor +++ b/MatrixUtils.Web/Pages/Labs/Rooms2/Index2Components/RoomsIndex2ByRoomTypeTab.razor @@ -22,7 +22,7 @@ @code { [CascadingParameter] - public Index2.RoomListViewData Data { get; set; } = null!; + public Index2.RoomListViewData Data { get; set; } protected override async Task OnInitializedAsync() { Data.Rooms.CollectionChanged += (sender, args) => { diff --git a/MatrixUtils.Web/Pages/Labs/Rooms2/Index2Components/RoomsIndex2DMsTab.razor b/MatrixUtils.Web/Pages/Labs/Rooms2/Index2Components/RoomsIndex2DMsTab.razor index f4cf849..79f931b 100644 --- a/MatrixUtils.Web/Pages/Labs/Rooms2/Index2Components/RoomsIndex2DMsTab.razor +++ b/MatrixUtils.Web/Pages/Labs/Rooms2/Index2Components/RoomsIndex2DMsTab.razor @@ -22,7 +22,7 @@ @code { [CascadingParameter] - public Index2.RoomListViewData Data { get; set; } = null!; + public Index2.RoomListViewData Data { get; set; } protected override async Task OnInitializedAsync() { Data.Rooms.CollectionChanged += (sender, args) => { diff --git a/MatrixUtils.Web/Pages/Labs/Rooms2/Index2Components/RoomsIndex2MainTab.razor b/MatrixUtils.Web/Pages/Labs/Rooms2/Index2Components/RoomsIndex2MainTab.razor index 6bf542f..99b031a 100644 --- a/MatrixUtils.Web/Pages/Labs/Rooms2/Index2Components/RoomsIndex2MainTab.razor +++ b/MatrixUtils.Web/Pages/Labs/Rooms2/Index2Components/RoomsIndex2MainTab.razor @@ -47,7 +47,7 @@ @code { [CascadingParameter] - public Index2.RoomListViewData Data { get; set; } = null!; + public Index2.RoomListViewData Data { get; set; } protected override async Task OnInitializedAsync() { Data.Rooms.CollectionChanged += (sender, args) => { diff --git a/MatrixUtils.Web/Pages/Labs/Rooms2/Index2Components/RoomsIndex2SyncContainer.razor b/MatrixUtils.Web/Pages/Labs/Rooms2/Index2Components/RoomsIndex2SyncContainer.razor index ae57521..33c310a 100644 --- a/MatrixUtils.Web/Pages/Labs/Rooms2/Index2Components/RoomsIndex2SyncContainer.razor +++ b/MatrixUtils.Web/Pages/Labs/Rooms2/Index2Components/RoomsIndex2SyncContainer.razor @@ -16,7 +16,7 @@ @code { [Parameter] - public Index2.RoomListViewData Data { get; set; } = null!; + public Index2.RoomListViewData Data { get; set; } private SyncHelper syncHelper; @@ -113,7 +113,7 @@ statusd.Status = $"{roomId} already known with {room.StateEvents?.Count ?? 0} state events"; } else { - statusd.Status = $"Eencountered new room {roomId}!"; + statusd.Status = $"Encountered new room {roomId}!"; room = new RoomInfo(Data.Homeserver!.GetRoom(roomId), roomData.State?.Events); Data.Rooms.Add(room); } diff --git a/MatrixUtils.Web/Pages/Rooms/Index.razor b/MatrixUtils.Web/Pages/Rooms/Index.razor index 5dd8189..45219c7 100644 --- a/MatrixUtils.Web/Pages/Rooms/Index.razor +++ b/MatrixUtils.Web/Pages/Rooms/Index.razor @@ -13,9 +13,7 @@

@Status2

Create new room - - - + @code { @@ -122,7 +120,7 @@ try { while (queue.Count == 0) { Console.WriteLine("Queue is empty, waiting..."); - await Task.Delay(isInitialSync ? 100 : 2500); + await Task.Delay(isInitialSync ? 1000 : 2500); } Console.WriteLine($"Queue no longer empty after {renderTimeSw.Elapsed}!"); @@ -131,15 +129,15 @@ isInitialSync = false; while (maxUpdates-- > 0 && queue.TryDequeue(out var queueEntry)) { var (roomId, roomData) = queueEntry; - Console.WriteLine($"Dequeued room {roomId}"); + // Console.WriteLine($"Dequeued room {roomId}"); RoomInfo room; if (Rooms.Any(x => x.Room.RoomId == roomId)) { room = Rooms.First(x => x.Room.RoomId == roomId); - Console.WriteLine($"QueueWorker: {roomId} already known with {room.StateEvents?.Count ?? 0} state events"); + // Console.WriteLine($"QueueWorker: {roomId} already known with {room.StateEvents?.Count ?? 0} state events"); } else { - Console.WriteLine($"QueueWorker: encountered new room {roomId}!"); + // Console.WriteLine($"QueueWorker: encountered new room {roomId}!"); room = new RoomInfo(Homeserver.GetRoom(roomId), roomData.State?.Events); Rooms.Add(room); } @@ -155,6 +153,11 @@ Console.WriteLine($"QueueWorker: could not merge state for {room.Room.RoomId} as new data contains no state events!"); } + if (maxUpdates % 100 == 0) { + Console.WriteLine($"QueueWorker: {queue.Count} entries left in queue, {maxUpdates} maxUpdates left, RenderContents: {RenderContents}"); + StateHasChanged(); + await Task.Yield(); + } // await Task.Delay(100); } @@ -225,9 +228,10 @@ Rooms.Remove(Rooms.First(x => x.Room.RoomId == leftRoom.Key)); Status = $"Got {Rooms.Count} rooms so far! {queue.Count} entries in processing queue... " + - $"{sync?.Rooms?.Join?.Count ?? 0} new updates!"; + $"{sync.Rooms?.Join?.Count ?? 0} new updates!"; - Status2 = $"Next batch: {sync.NextBatch}"; + Status2 = $"Next batch: {sync?.NextBatch}"; + await Task.Yield(); } } diff --git a/MatrixUtils.Web/Pages/Rooms/PolicyList.razor b/MatrixUtils.Web/Pages/Rooms/PolicyList.razor index 94113dd..3d78f4a 100644 --- a/MatrixUtils.Web/Pages/Rooms/PolicyList.razor +++ b/MatrixUtils.Web/Pages/Rooms/PolicyList.razor @@ -171,7 +171,7 @@ else { private bool Loading { get; set; } = true; [Parameter] - public string RoomId { get; set; } = null!; + public string RoomId { get; set; } private bool _enableAvatars; private StateEventResponse? _currentlyEditingEvent; diff --git a/MatrixUtils.Web/Pages/Rooms/PolicyList2.razor b/MatrixUtils.Web/Pages/Rooms/PolicyList2.razor index 50f304a..664551a 100644 --- a/MatrixUtils.Web/Pages/Rooms/PolicyList2.razor +++ b/MatrixUtils.Web/Pages/Rooms/PolicyList2.razor @@ -141,7 +141,7 @@ else { private bool Loading { get; set; } = true; [Parameter] - public string RoomId { get; set; } = null!; + public string RoomId { get; set; } private bool _enableAvatars; private StateEventResponse? _currentlyEditingEvent; diff --git a/MatrixUtils.Web/Pages/StreamTest.razor b/MatrixUtils.Web/Pages/StreamTest.razor index 4cec354..aae1f17 100644 --- a/MatrixUtils.Web/Pages/StreamTest.razor +++ b/MatrixUtils.Web/Pages/StreamTest.razor @@ -5,7 +5,7 @@ StreamText @if (Homeserver is not null) { -

Got homeserver @Homeserver.BaseUrl

+

Got homeserver @Homeserver.ServerName

@* *@ @* *@ diff --git a/MatrixUtils.Web/Pages/Tools/Moderation/InviteCounter.razor b/MatrixUtils.Web/Pages/Tools/Moderation/InviteCounter.razor index ea47237..cb1328c 100644 --- a/MatrixUtils.Web/Pages/Tools/Moderation/InviteCounter.razor +++ b/MatrixUtils.Web/Pages/Tools/Moderation/InviteCounter.razor @@ -1,6 +1,8 @@ @page "/Tools/Moderation/InviteCounter" @using System.Collections.ObjectModel +@using ArcaneLibs.Extensions @using LibMatrix.EventTypes.Spec.State.RoomInfo +@using LibMatrix.Filters

Invite counter


@@ -13,7 +15,7 @@
Results - @foreach (var (userId, events) in invites.OrderByDescending(x=>x.Value).ToList()) { + @foreach (var (userId, events) in invites.OrderByDescending(x => x.Value).ToList()) {

@userId: @events

}
@@ -27,16 +29,15 @@ private ObservableCollection log { get; set; } = new(); private Dictionary invites { get; set; } = new(); private AuthenticatedHomeserverGeneric hs { get; set; } - + [Parameter, SupplyParameterFromQuery(Name = "room")] public string roomId { get; set; } - protected override async Task OnInitializedAsync() { log.CollectionChanged += (sender, args) => StateHasChanged(); hs = await RmuStorage.GetCurrentSessionOrNavigate(); if (hs is null) return; - + StateHasChanged(); Console.WriteLine("Rerendered!"); await base.OnInitializedAsync(); @@ -44,22 +45,21 @@ private async Task Execute() { var room = hs.GetRoom(roomId); - var events = room.GetManyMessagesAsync(limit: int.MaxValue); + var filter = new SyncFilter.EventFilter() { Types = [RoomMemberEventContent.EventId] }; + var events = room.GetManyMessagesAsync(limit: int.MaxValue, filter: filter.ToJson(ignoreNull: true, indent: false)); await foreach (var resp in events) { var all = resp.State.Concat(resp.Chunk); foreach (var evt in all) { - if(evt.Type != RoomMemberEventContent.EventId) continue; + if (evt.Type != RoomMemberEventContent.EventId) continue; var content = evt.TypedContent as RoomMemberEventContent; - if(content.Membership != "invite") continue; - if(!invites.ContainsKey(evt.Sender)) invites[evt.Sender] = 0; - invites[evt.Sender]++; + if (content?.Membership != "invite") continue; + invites.TryAdd(evt.Sender!, 0); + invites[evt.Sender!]++; } log.Add($"{resp.State.Count} state, {resp.Chunk.Count} timeline"); } - - - + StateHasChanged(); return ""; diff --git a/MatrixUtils.Web/Pages/Tools/Moderation/MembershipHistory.razor b/MatrixUtils.Web/Pages/Tools/Moderation/MembershipHistory.razor index 6b5b5e4..2549c12 100644 --- a/MatrixUtils.Web/Pages/Tools/Moderation/MembershipHistory.razor +++ b/MatrixUtils.Web/Pages/Tools/Moderation/MembershipHistory.razor @@ -2,8 +2,10 @@ @using System.Collections.Frozen @using System.Collections.ObjectModel @using System.Diagnostics +@using ArcaneLibs.Extensions @using LibMatrix @using LibMatrix.EventTypes.Spec.State.RoomInfo +@using LibMatrix.Filters @{ var sw = Stopwatch.StartNew(); Console.WriteLine("Start render"); @@ -397,7 +399,7 @@ private ObservableCollection Log { get; set; } = new(); private List Memberships { get; set; } = []; - private AuthenticatedHomeserverGeneric Homeserver { get; set; } = null!; + private AuthenticatedHomeserverGeneric Homeserver { get; set; } [Parameter, SupplyParameterFromQuery(Name = "room")] public string RoomId { get; set; } = ""; @@ -417,7 +419,8 @@ private async Task Execute() { Memberships.Clear(); var room = Homeserver.GetRoom(RoomId); - var events = room.GetManyMessagesAsync(limit: int.MaxValue, chunkSize: 5000); + var filter = new SyncFilter.EventFilter() { Types = [RoomMemberEventContent.EventId] }; + var events = room.GetManyMessagesAsync(limit: int.MaxValue, filter: filter.ToJson(ignoreNull: true, indent: false)); await foreach (var resp in events) { var all = resp.State.Concat(resp.Chunk); Memberships.AddRange(all.Where(x => x.Type == RoomMemberEventContent.EventId)); diff --git a/MatrixUtils.Web/Pages/Tools/Moderation/UserTrace.razor b/MatrixUtils.Web/Pages/Tools/Moderation/UserTrace.razor index 0d622cc..73818c6 100644 --- a/MatrixUtils.Web/Pages/Tools/Moderation/UserTrace.razor +++ b/MatrixUtils.Web/Pages/Tools/Moderation/UserTrace.razor @@ -181,6 +181,9 @@ { Membership: "leave", Reason: not null } => state.Sender == state.StateKey ? $"Left at {time} with reason {membership.Reason}" : $"Kicked by {state.Sender} at {time} for {membership.Reason}", { Membership: "ban", Reason: null } => $"Banned by {state.Sender} at {time}", { Membership: "ban", Reason: not null } => $"Banned by {state.Sender} at {time} for {membership.Reason}", + { Membership: "knock", Reason: null } => $"Knocked at {time}", + { Membership: "knock", Reason: not null } => $"Knocked at {time} for {membership.Reason}", + _ => $"Unknown membership {membership.Membership}, sent at {time} by {state.Sender} for {membership.Reason}" }; } diff --git a/MatrixUtils.Web/Pages/User/Profile.razor b/MatrixUtils.Web/Pages/User/Profile.razor index d0af2c8..b6ac1d4 100644 --- a/MatrixUtils.Web/Pages/User/Profile.razor +++ b/MatrixUtils.Web/Pages/User/Profile.razor @@ -10,7 +10,7 @@

Profile


- +
Display name:
Avatar URL: @@ -39,7 +39,7 @@ @if (room.OwnMembership is not null) { @* *@ - +
Display name:
Avatar URL: diff --git a/MatrixUtils.Web/Shared/InlineUserItem.razor b/MatrixUtils.Web/Shared/InlineUserItem.razor index 50fa9e1..eaf7a92 100644 --- a/MatrixUtils.Web/Shared/InlineUserItem.razor +++ b/MatrixUtils.Web/Shared/InlineUserItem.razor @@ -39,7 +39,6 @@ protected override async Task OnInitializedAsync() { await base.OnInitializedAsync(); - Homeserver ??= await RmuStorage.GetCurrentSessionOrNavigate(); if(Homeserver is null) return; await _semaphoreSlim.WaitAsync(); diff --git a/MatrixUtils.Web/Shared/MxcAvatar.razor b/MatrixUtils.Web/Shared/MxcAvatar.razor index 02aff72..822894a 100644 --- a/MatrixUtils.Web/Shared/MxcAvatar.razor +++ b/MatrixUtils.Web/Shared/MxcAvatar.razor @@ -1,17 +1,16 @@ - + @code { - private string _mxcUri; private string _style; - private Stream _stream; - + [Parameter] - public string MxcUri { - get => _mxcUri ?? ""; + public string? MxcUri { + get; set { - if(_mxcUri == value) return; - _mxcUri = value; - UriHasChanged(value); + if(field == value) return; + field = value; + // UriHasChanged(value); + StateHasChanged(); } } @@ -25,31 +24,26 @@ public string SizeUnit { get; set; } = "px"; [Parameter] - public AuthenticatedHomeserverGeneric? Homeserver { get; set; } + public required AuthenticatedHomeserverGeneric Homeserver { get; set; } private string StyleString => $"{(Circular ? "border-radius: 50%;" : "")} width: {Size}{SizeUnit}; height: {Size}{SizeUnit}; object-fit: cover;"; private static readonly string Prefix = "mxc://"; private static readonly int PrefixLength = Prefix.Length; - private async Task UriHasChanged(string value) { - if (!value.StartsWith(Prefix)) { - // Console.WriteLine($"UriHasChanged: {value} does not start with {Prefix}, passing as resolved URI!!!"); - // ResolvedUri = value; - return; - } - - if (Homeserver is null) { - Console.WriteLine("Homeserver is required for MxcAvatar"); - return; - } - - var uri = value[PrefixLength..].Split('/'); - // Console.WriteLine($"UriHasChanged: {value} {uri[0]}"); - var url = $"/_matrix/media/v3/download/{uri[0]}/{uri[1]}"; - Console.WriteLine($"ResolvedUri: {url}"); - _stream = await Homeserver.ClientHttpClient.GetStreamAsync(url); - StateHasChanged(); - } + // private async Task UriHasChanged(string? value) { + // if (string.IsNullOrWhiteSpace(value) || !value.StartsWith(Prefix)) { + // Console.WriteLine($"[MxcAvatar] UriHasChanged: {value} does not start with {Prefix}!"); + // return; + // } + // + // if (Homeserver is null) { + // Console.WriteLine($"[MxcAvatar] Homeserver is required for MxcAvatar! URI: {MxcUri}, Homeserver: {Homeserver?.ToString() ?? "null"}"); + // return; + // } + // + // Console.WriteLine($"[MxcAvatar] Homeserver: {Homeserver}"); + // StateHasChanged(); + // } } \ No newline at end of file diff --git a/MatrixUtils.Web/Shared/MxcImage.razor b/MatrixUtils.Web/Shared/MxcImage.razor index e7cb2e0..26609ee 100644 --- a/MatrixUtils.Web/Shared/MxcImage.razor +++ b/MatrixUtils.Web/Shared/MxcImage.razor @@ -1,69 +1,69 @@ - -@code { - private string _mxcUri; - private string _style; - private string _resolvedUri; + +@code { [Parameter] - public string MxcUri { - get => _mxcUri ?? ""; + public string? Uri { + get; set { - Console.WriteLine($"New MXC uri: {value}"); - _mxcUri = value; + // Console.WriteLine($"New MXC uri: {value}"); + if (field == value) return; + field = value; UriHasChanged(value); } } + [Parameter] public bool Circular { get; set; } - + [Parameter] public int? Width { get; set; } - + [Parameter] public int? Height { get; set; } - + [Parameter] - public string Style { - get => _style; + public string? Style { + get; set { - _style = value; + field = value; StateHasChanged(); } } - - [CascadingParameter, Parameter] - public RemoteHomeserver? Homeserver { get; set; } - private string ResolvedUri { - get => _resolvedUri; + [Parameter] + public required AuthenticatedHomeserverGeneric Homeserver { get; set; } + + private string? ResolvedUrl { + get; set { - _resolvedUri = value; + field = value; StateHasChanged(); } } private string StyleString => $"{Style} {(Circular ? "border-radius: 50%;" : "")} {(Width.HasValue ? $"width: {Width}px;" : "")} {(Height.HasValue ? $"height: {Height}px;" : "")} object-fit: cover;"; - - private static readonly string Prefix = "mxc://"; - private static readonly int PrefixLength = Prefix.Length; - private async Task UriHasChanged(string value) { - // if (!value.StartsWith(Prefix)) { - // Console.WriteLine($"UriHasChanged: {value} does not start with {Prefix}, passing as resolved URI!!!"); - // ResolvedUri = value; - // return; - // } - // var uri = value[PrefixLength..].Split('/'); - // Console.WriteLine($"UriHasChanged: {value} {uri[0]}"); - // if (Homeserver is null) { - // Console.WriteLine($"Homeserver is null, creating new remotehomeserver for {uri[0]}"); - // Homeserver = await hsProvider.GetRemoteHomeserver(uri[0]); - // } - // ResolvedUri = Homeserver.ResolveMediaUri(value); - // Console.WriteLine($"ResolvedUri: {ResolvedUri}"); - } + // private static readonly string Prefix = "mxc://"; + // private static readonly int PrefixLength = Prefix.Length; + + private async Task UriHasChanged(string? value) { + try { + if (string.IsNullOrWhiteSpace(value)) { + ResolvedUrl = null; + return; + } + + if (Homeserver is null) { + Console.WriteLine($"Homeserver is required for MxcImage! Uri: {value}, Homeserver: {Homeserver?.ToString() ?? "null"}"); + return; + } - // [Parameter] - // public string Class { get; set; } + ResolvedUrl = await Homeserver.GetMediaUrlAsync(value); + // Console.WriteLine($"[MxcImage] Resolved URL: {ResolvedUrl}"); + StateHasChanged(); + } catch (Exception e) { + await Console.Error.WriteLineAsync($"Error resolving media URL: {e}"); + } + } } \ No newline at end of file diff --git a/MatrixUtils.Web/Shared/RoomList.razor b/MatrixUtils.Web/Shared/RoomList.razor index 42c5a9f..ba9cd69 100644 --- a/MatrixUtils.Web/Shared/RoomList.razor +++ b/MatrixUtils.Web/Shared/RoomList.razor @@ -10,7 +10,7 @@ } else { @foreach (var category in RoomsWithTypes.OrderBy(x => x.Value.Count)) { - + } } @@ -34,6 +34,9 @@ else { } } + [Parameter] + public AuthenticatedHomeserverGeneric? Homeserver { get; set; } + [Parameter] public UserProfileResponse? GlobalProfile { get; set; } diff --git a/MatrixUtils.Web/Shared/RoomListComponents/RoomListCategory.razor b/MatrixUtils.Web/Shared/RoomListComponents/RoomListCategory.razor index 555b1f1..1ab0a1a 100644 --- a/MatrixUtils.Web/Shared/RoomListComponents/RoomListCategory.razor +++ b/MatrixUtils.Web/Shared/RoomListComponents/RoomListCategory.razor @@ -6,7 +6,7 @@ @RoomType (@Rooms.Count) @foreach (var room in Rooms) {
- + @* @if (RoomVersionDangerLevel(room) != 0 && *@ @* (room.StateEvents.FirstOrDefault(x=>x.Type == "m.room.power_levels")?.TypedContent is RoomPowerLevelEventContent powerLevels && powerLevels.UserHasPermission(Homeserver.UserId, "m.room.tombstone"))) { *@ @* Upgrade room *@ @@ -14,10 +14,11 @@ View timeline View state Edit state + Upgrade/replace room Leave room @if (room.CreationEventContent?.Type == "m.space") { - + } else if (room.CreationEventContent?.Type == "support.feline.policy.lists.msc.v1" || RoomType == "org.matrix.mjolnir.policy") { Manage policies @@ -35,9 +36,9 @@ [Parameter] public UserProfileResponse? GlobalProfile { get; set; } - [CascadingParameter] - public AuthenticatedHomeserverGeneric Homeserver { get; set; } = null!; - + [Parameter] + public AuthenticatedHomeserverGeneric? Homeserver { get; set; } + private string RoomType => Category.Key; private List Rooms => Category.Value; diff --git a/MatrixUtils.Web/Shared/RoomListComponents/RoomListSpace.razor b/MatrixUtils.Web/Shared/RoomListComponents/RoomListSpace.razor index 11f9040..27f0499 100644 --- a/MatrixUtils.Web/Shared/RoomListComponents/RoomListSpace.razor +++ b/MatrixUtils.Web/Shared/RoomListComponents/RoomListSpace.razor @@ -35,15 +35,18 @@ set => _breadcrumbs = value; } + [Parameter] + public required AuthenticatedHomeserverGeneric Homeserver { get; set; } + private ObservableCollection Children { get; set; } = new(); private Collection Unjoined { get; set; } = new(); protected override async Task OnInitializedAsync() { if (Breadcrumbs == null) throw new ArgumentNullException(nameof(Breadcrumbs)); + if (Homeserver is null) throw new ArgumentNullException(nameof(Homeserver)); await Task.Delay(Random.Shared.Next(1000, 10000)); var rooms = Space.Room.AsSpace.GetChildrenAsync(); - var hs = await RmuStorage.GetCurrentSessionOrNavigate(); - var joinedRooms = await hs.GetJoinedRooms(); + var joinedRooms = await Homeserver.GetJoinedRooms(); await foreach (var room in rooms) { if (Breadcrumbs.Contains(room.RoomId)) continue; var roomInfo = KnownRooms.FirstOrDefault(x => x.Room.RoomId == room.RoomId); @@ -51,10 +54,12 @@ roomInfo = new RoomInfo(room); KnownRooms.Add(roomInfo); } - if(joinedRooms.Any(x=>x.RoomId == room.RoomId)) + + if (joinedRooms.Any(x => x.RoomId == room.RoomId)) Children.Add(roomInfo); else Unjoined.Add(roomInfo); } + await base.OnInitializedAsync(); } diff --git a/MatrixUtils.Web/Shared/RoomListItem.razor b/MatrixUtils.Web/Shared/RoomListItem.razor index d75d159..46daaa2 100644 --- a/MatrixUtils.Web/Shared/RoomListItem.razor +++ b/MatrixUtils.Web/Shared/RoomListItem.razor @@ -1,3 +1,4 @@ +@using ArcaneLibs @using LibMatrix @using LibMatrix.EventTypes.Spec.State.RoomInfo @using LibMatrix.Responses @@ -6,16 +7,20 @@ @if (RoomInfo is not null) {
@if (OwnMemberState != null) { - @* Class="@("avatar32" + (OwnMemberState?.AvatarUrl != GlobalProfile?.AvatarUrl ? " highlightChange" : "") + (ChildContent is not null ? " vcenter" : ""))" *@ - @* *@ - + @(OwnMemberState?.DisplayName ?? GlobalProfile?.DisplayName ?? "Loading...") -> } @* *@ - + + @if (!string.IsNullOrWhiteSpace(RoomInfo.RoomIcon)) { + + } + else { + + }
@RoomInfo.RoomName @if (ChildContent is not null) { @@ -68,6 +73,10 @@ else { private bool HasOldRoomVersion { get; set; } = false; private bool HasDangerousRoomVersion { get; set; } = false; + private string Identicon { get; set; } + + private static SvgIdenticonGenerator _identiconGenerator = new SvgIdenticonGenerator(); + private static SemaphoreSlim _semaphoreSlim = new(8); private RoomInfo? _roomInfo; private bool _loadData = false; @@ -75,6 +84,9 @@ else { private bool _hooked; private async Task RoomInfoChanged() { + if (RoomInfo is null) return; + Identicon = _identiconGenerator.GenerateAsDataUri(RoomInfo.Room.RoomId); + RoomInfo.PropertyChanged += async (_, a) => { if (a.PropertyName == nameof(RoomInfo.CreationEventContent)) { await CheckRoomVersion(); diff --git a/MatrixUtils.Web/Shared/UserListItem.razor b/MatrixUtils.Web/Shared/UserListItem.razor index cf7f24d..8ce2868 100644 --- a/MatrixUtils.Web/Shared/UserListItem.razor +++ b/MatrixUtils.Web/Shared/UserListItem.razor @@ -23,13 +23,14 @@ [Parameter] public string UserId { get; set; } - private AuthenticatedHomeserverGeneric _homeserver = null!; + [Parameter] + public AuthenticatedHomeserverGeneric _homeserver { get; set; } private SvgIdenticonGenerator _identiconGenerator = new(); protected override async Task OnInitializedAsync() { - _homeserver = await RmuStorage.GetCurrentSessionOrNavigate(); - if (_homeserver is null) return; + // _homeserver = await RmuStorage.GetCurrentSessionOrNavigate(); + // if (_homeserver is null) return; if (User == null) { if (UserId == null) { -- cgit 1.5.1