@page "/Tools/Moderation/RoomIntersections" @using LibMatrix.RoomTypes @using System.Collections.ObjectModel @using LibMatrix @using LibMatrix.EventTypes.Spec.State

Room intersections


Set A:

Append Set A

Set B:

Append Set B
Execute
Results
        @{
            var userColWidth = matches.Count == 0 ? 0 : matches.Keys.Max(x => x.Length);
        }
        
            @foreach (var (userId, sets) in matches) {
                
                @for (int i = 1; i < Math.Max(sets.Item1.Count, sets.Item2.Count); i++) {
                    
                        }
                        else {
                             
                        }
                        else {
                            
                }
            }
            
        
@userId.PadRight(userColWidth + 5) @sets.Item1[0].Room.RoomId @((sets.Item1[0].Member.TypedContent as RoomMemberEventContent).Membership) @(roomNames.ContainsKey(sets.Item1[0].Room) ? roomNames[sets.Item1[0].Room] : "") @(roomAliasses.ContainsKey(sets.Item1[0].Room) ? roomAliasses[sets.Item1[0].Room] : "") @sets.Item2[0].Room.RoomId @((sets.Item2[0].Member.TypedContent as RoomMemberEventContent).Membership) @(roomNames.ContainsKey(sets.Item2[0].Room) ? roomNames[sets.Item2[0].Room] : "") @(roomAliasses.ContainsKey(sets.Item2[0].Room) ? roomAliasses[sets.Item2[0].Room] : "")
@if (sets.Item1.Count > i) { @sets.Item1[i].Room.RoomId @((sets.Item1[i].Member.TypedContent as RoomMemberEventContent).Membership) @(roomNames.ContainsKey(sets.Item1[i].Room) ? roomNames[sets.Item1[i].Room] : "") @(roomAliasses.ContainsKey(sets.Item1[i].Room) ? roomAliasses[sets.Item1[i].Room] : "") } @if (sets.Item2.Count > i) { @sets.Item2[0].Room.RoomId @((sets.Item2[i].Member.TypedContent as RoomMemberEventContent).Membership) @(roomNames.ContainsKey(sets.Item2[i].Room) ? roomNames[sets.Item2[i].Room] : "") @(roomAliasses.ContainsKey(sets.Item2[i].Room) ? roomAliasses[sets.Item2[i].Room] : "") }


@foreach (var line in Log.Reverse()) {
@line
} @code { private ObservableCollection Log { get; set; } = new(); List RoomsA { get; set; } = new(); List RoomsB { get; set; } = new(); [Parameter, SupplyParameterFromQuery(Name = "a")] public string ImportSetASpaceId { get; set; } = ""; [Parameter, SupplyParameterFromQuery(Name = "b")] public string ImportSetBSpaceId { get; set; } = ""; Dictionary> roomMembers { get; set; } = new(); Dictionary, List)> matches { get; set; } = new(); AuthenticatedHomeserverGeneric hs { get; set; } // private string RoomListAString { // get => string.Join("\n", RoomIdsA); // set => RoomIdsA = value.Split("\n").Select(x => x.Trim()).Where(x => !string.IsNullOrWhiteSpace(x)).ToList(); // } // // private string RoomListBString { // get => string.Join("\n", RoomIdsB); // set => RoomIdsB = value.Split("\n").Select(x => x.Trim()).Where(x => !string.IsNullOrWhiteSpace(x)).ToList(); // } // private List RoomIdsA { get; set; } = new(); // private List RoomIdsB { get; set; } = new(); // room info Dictionary roomNames { get; set; } = new(); Dictionary roomAliasses { get; set; } = new(); 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(); } private async Task Execute() { // get all users which are in any room of both sets of rooms, and which rooms var setAusers = new Dictionary>(); var setBusers = new Dictionary>(); await Task.WhenAll(GetMembers(RoomsA, setAusers), GetMembers(RoomsB, setBusers)); Log.Add($"Got {setAusers.Count} users in set A"); Log.Add($"Got {setBusers.Count} users in set B"); Log.Add("Calculating intersections..."); // get all users which are in both sets of rooms // var users = setAusers.Keys.Intersect(setBusers.Keys).ToList(); // var groups = setAusers.IntersectBy(setBusers, (x,y) => x.Key).ToList(); matches = setAusers.Keys.Intersect(setBusers.Keys).Select(x => (x, setAusers[x], setBusers[x])).ToDictionary(x => x.x, x => (x.Item2, x.Item3)); Log.Add($"Found {matches.Count} users in both sets of rooms"); StateHasChanged(); } public async Task GetMembers(List rooms, Dictionary> users) { foreach (var room in rooms) { Log.Add($"Getting members for {room.RoomId}"); var members = await room.GetMembersListAsync(false); foreach (var member in members) { if (member.RawContent?["membership"]?.ToString() == "ban") continue; if (member.RawContent?["membership"]?.ToString() == "invite") continue; if (!users.ContainsKey(member.StateKey)) users[member.StateKey] = new(); users[member.StateKey].Add(new() { Room = room, Member = member }); } } } public async Task AppendSet(string spaceId, List rooms) { var space = hs.GetRoom(spaceId).AsSpace; Log.Add($"Found space {spaceId}"); var roomIdsEnum = space.GetChildrenAsync(true); List tasks = new(); await foreach (var room in roomIdsEnum) { tasks.Add(loadRoomData(room, rooms)); } await Task.WhenAll(tasks); async Task loadRoomData(GenericRoom room, List rooms) { Log.Add($"Found room {room.RoomId}"); try { await room.GetPowerLevelsAsync(); rooms.Add(room); try { roomAliasses[room] = (await room.GetCanonicalAliasAsync()).Alias; } catch { } try { roomNames[room] = await room.GetNameOrFallbackAsync(); } catch { } } catch (MatrixException e) { Log.Add($"Failed to get power levels for {room.RoomId}: {e.Message}"); } } } public class Match { public GenericRoom Room { get; set; } public StateEventResponse Member { get; set; } } }