-@* @if (RenderContents) { *@
+
+Create new room
+
-@* } *@
-@* else { *@
-@* *@
-@* } *@
@code {
private ObservableCollection Rooms { get; } = new();
@@ -47,9 +43,9 @@
},
State = new SyncFilter.RoomFilter.StateFilter {
Types = new List {
+ "m.room.create",
"m.room.name",
"m.room.avatar",
- "m.room.create",
"org.matrix.mjolnir.shortcode",
"m.room.power_levels",
}
@@ -92,49 +88,72 @@
// }
// };
+ private SyncHelper syncHelper;
+
+ // SyncHelper profileSyncHelper;
+
protected override async Task OnInitializedAsync() {
Homeserver = await MRUStorage.GetCurrentSessionOrNavigate();
if (Homeserver is null) return;
var rooms = await Homeserver.GetJoinedRooms();
- foreach (var room in rooms) {
- Rooms.Add(new(){Room = room});
+ // SemaphoreSlim _semaphore = new(160, 160);
+
+ var roomTasks = rooms.Select(async room => {
+ RoomInfo ri;
+ // await _semaphore.WaitAsync();
+ ri = new() { Room = room };
+ await Task.WhenAll((filter.Room?.State?.Types ?? []).Select(x => ri.GetStateEvent(x)));
+ return ri;
+ }).ToAsyncEnumerable();
+
+ await foreach (var room in roomTasks) {
+ Rooms.Add(room);
+ StateHasChanged();
+ // await Task.Delay(50);
+ // _semaphore.Release();
}
-
- GlobalProfile = await Homeserver.GetProfileAsync(Homeserver.WhoAmI.UserId);
- var syncHelper = new SyncHelper(Homeserver, logger) {
- Timeout = 10000,
+ if (rooms.Count >= 150) RenderContents = true;
+
+ GlobalProfile = await Homeserver.GetProfileAsync(Homeserver.WhoAmI.UserId);
+ syncHelper = new SyncHelper(Homeserver, logger) {
+ Timeout = 30000,
Filter = filter,
MinimumDelay = TimeSpan.FromMilliseconds(5000)
};
- // profileUpdateFilter.Room.State.Senders.Add(Homeserver.WhoAmI.UserId);
- // var profileSyncHelper = new SyncHelper(Homeserver, logger) {
+ // profileSyncHelper = new SyncHelper(Homeserver, logger) {
// Timeout = 10000,
// Filter = profileUpdateFilter,
// MinimumDelay = TimeSpan.FromMilliseconds(5000)
- // };
+ // };
+ // profileUpdateFilter.Room.State.Senders.Add(Homeserver.WhoAmI.UserId);
+
RunSyncLoop(syncHelper);
// RunSyncLoop(profileSyncHelper);
RunQueueProcessor();
+
await base.OnInitializedAsync();
}
-
+
private async Task RunQueueProcessor() {
var renderTimeSw = Stopwatch.StartNew();
+ var isInitialSync = true;
while (true) {
try {
- if (queue.Count == 0) {
- while (queue.Count == 0) {
- Console.WriteLine("Queue is empty, waiting...");
- await Task.Delay(2500);
- }
- Console.WriteLine("Queue no longer empty!");
+ while (queue.Count == 0) {
+ Console.WriteLine("Queue is empty, waiting...");
+ await Task.Delay(isInitialSync ? 100 : 2500);
}
- while (queue.TryDequeue(out var queueEntry)) {
+
+ Console.WriteLine($"Queue no longer empty after {renderTimeSw.Elapsed}!");
+
+ int maxUpdates = 10;
+ isInitialSync = false;
+ while (maxUpdates-- > 0 && queue.TryDequeue(out var queueEntry)) {
var (roomId, roomData) = queueEntry;
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");
@@ -146,26 +165,23 @@
};
Rooms.Add(room);
}
-
+
if (room.StateEvents is null) {
Console.WriteLine($"QueueWorker: {roomId} does not have state events on record?");
throw new InvalidDataException("Somehow this is null???");
}
- if (roomData.State?.Events is {Count: >0 })
+
+ if (roomData.State?.Events is { Count: > 0 })
room.StateEvents.MergeStateEventLists(roomData.State.Events);
else {
Console.WriteLine($"QueueWorker: could not merge state for {room.Room.RoomId} as new data contains no state events!");
}
- if (Random.Shared.Next(101) < 20 || true) {
- Status = $"Got {Rooms.Count} rooms so far! {queue.Count} entries in processing queue...";
- }
- RenderContents |= queue.Count == 0;
- if (queue.Count > 10) RenderContents = false;
- await Task.Delay(RenderContents ? 25 : 6);
}
- // else {
- // Console.WriteLine("Failed to dequeue item");
- // }
+ Console.WriteLine($"QueueWorker: {queue.Count} entries left in queue, {maxUpdates} maxUpdates left, RenderContents: {RenderContents}");
+ Status = $"Got {Rooms.Count} rooms so far! {queue.Count} entries in processing queue...";
+
+ RenderContents |= queue.Count == 0;
+ await Task.Delay(Rooms.Count);
}
catch (Exception e) {
Console.WriteLine("QueueWorker exception: " + e);
@@ -214,11 +230,15 @@
// We can't trust servers to give us what we ask for, and this ruins performance
// Thanks, Conduit.
joinedRoom.Value.State.Events.RemoveAll(x => filter.Room?.State?.Types?.Contains(x.Type) == false);
- if(filter.Room?.State?.NotSenders?.Any() ?? false)
+ if (filter.Room?.State?.NotSenders?.Any() ?? false)
joinedRoom.Value.State.Events.RemoveAll(x => filter.Room?.State?.NotSenders?.Contains(x.Sender) ?? false);
-
+
queue.Enqueue(joinedRoom);
}
+ if (sync.Rooms.Leave is {Count: > 0})
+ foreach (var leftRoom in sync.Rooms.Leave)
+ if (Rooms.Any(x => x.Room.RoomId == leftRoom.Key))
+ 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!";
diff --git a/MatrixRoomUtils.Web/Pages/Rooms/PolicyList.razor b/MatrixRoomUtils.Web/Pages/Rooms/PolicyList.razor
index 846d1cb..dbe0648 100644
--- a/MatrixRoomUtils.Web/Pages/Rooms/PolicyList.razor
+++ b/MatrixRoomUtils.Web/Pages/Rooms/PolicyList.razor
@@ -4,184 +4,199 @@
@using ArcaneLibs.Extensions
@using LibMatrix.EventTypes.Spec.State
@using LibMatrix.EventTypes.Spec.State.Policy
+@using System.Diagnostics
+@using System.Diagnostics.CodeAnalysis
+@using LibMatrix.Extensions
+@using LibMatrix.Responses
Policy list editor - Editing @RoomId
- This policy list contains @PolicyEvents.Count(x => x.Type == "m.policy.rule.server") server bans,
- @PolicyEvents.Count(x => x.Type == "m.policy.rule.room") room bans and
- @PolicyEvents.Count(x => x.Type == "m.policy.rule.user") user bans.
+ This policy list contains @GetPolicyCount(typeof(ServerPolicyRuleEventContent)) server bans,
+ @GetPolicyCount(typeof(RoomPolicyRuleEventContent)) room bans and
+ @GetPolicyCount(typeof(UserPolicyRuleEventContent)) user bans.
+ @foreach (var (key, value) in PolicyEventsByType) {
+
-
-
- @foreach (var policyEvent in PolicyEvents.Where(x => x.Type == "m.policy.rule.server" && (x.TypedContent as PolicyRuleEventContent).Entity is not null)) {
- var policyData = policyEvent.TypedContent as PolicyRuleEventContent;
-
-
- @foreach (var policyEvent in PolicyEvents.Where(x => x.Type == "m.policy.rule.room" && (x.TypedContent as PolicyRuleEventContent).Entity is not null)) {
- var policyData = policyEvent.TypedContent as PolicyRuleEventContent;
-
-
- @foreach (var policyEvent in PolicyEvents.Where(x => x.Type == "m.policy.rule.user" && (x.TypedContent as PolicyRuleEventContent).Entity is not null)) {
- var policyData = policyEvent.TypedContent as PolicyRuleEventContent;
+
+ @foreach (var (roomId, roomProfile) in RoomProfiles.OrderBy(x => RoomNames.TryGetValue(x.Key, out var _name) ? _name : x.Key)) {
+
+ @(RoomNames.TryGetValue(roomId, out var name) ? name : roomId)
+
+