about summary refs log tree commit diff
path: root/MatrixRoomUtils.Web/Pages/KnownHomeserverList.razor
blob: f3960259182404c45eb87e6d8521b4f383da3761 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
@page "/KnownHomeserverList"
@using System.Text.Json
@using MatrixRoomUtils.Core.Extensions
<h3>Known Homeserver List</h3>
<hr/>

@if (!IsFinished)
{
    <p>Loading... Please wait...</p>
}
else
{
    @foreach (var server in HomeServers.OrderByDescending(x => x.KnownUserCount).ThenBy(x => x.Server).ToList())
    {
        <p>@server.Server - @server.KnownUserCount</p>
    }
}
<hr/>

@code {
    List<HomeServerInfo> HomeServers = new();
    bool IsFinished { get; set; }

    protected override async Task OnInitializedAsync()
    {
        await LocalStorageWrapper.LoadFromLocalStorage(LocalStorage);

        HomeServers = await GetHomeservers();

        IsFinished = true;
        StateHasChanged();
        Console.WriteLine("Rerendered!");
        await base.OnInitializedAsync();
    }


    private async Task<List<HomeServerInfo>> GetHomeservers()
    {
        List<HomeServerInfo> homeServers = new();
        var rooms = await RuntimeCache.CurrentHomeServer.GetJoinedRooms();
        // Dictionary<string, StateEvent> roomMembers = new();
        //start a task for each room
        var tasks = rooms.Select(async room =>
        {
            Console.WriteLine($"Fetching states for room ({rooms.IndexOf(room)}/{rooms.Count}) ({room.RoomId})");
            StateHasChanged();

            var states = (await room.GetStateAsync("")).Value.Deserialize<List<StateEvent>>();
            states.RemoveAll(x => x.type != "m.room.member");
            Console.WriteLine($"Room {room.RoomId} has {states.Count} members");
            foreach (var state in states)
            {
                if (!homeServers.Any(x => x.Server == state.state_key.Split(':')[1]))
                {
                    homeServers.Add(new HomeServerInfo() { Server = state.state_key.Split(':')[1] });
                }
                var hs = homeServers.First(x => x.Server == state.state_key.Split(':')[1]);
                if(!hs.KnownUsers.Contains(state.state_key.Split(':')[0]))
                    hs.KnownUsers.Add(state.state_key.Split(':')[0]);
            }
            Console.WriteLine("Collected states!");
        });
        await Task.WhenAll(tasks);
        
        Console.WriteLine("Calculating member counts...");
        homeServers.ForEach(x => x.KnownUserCount = x.KnownUsers.Count);
        Console.WriteLine(homeServers.First(x=>x.Server=="rory.gay").ToJson());
        Console.WriteLine("Recalculated!");
        return homeServers;
    }

    class HomeServerInfo
    {
        public string Server { get; set; }
        public int? KnownUserCount { get; set; }
        public List<string> KnownUsers { get; set; } = new();
    }

}