@page "/KnownHomeserverList"
@using System.Text.Json
@using MatrixRoomUtils.Core.Extensions
Known Homeserver List
@if (!IsFinished)
{
Loading... Please wait...
}
else
{
@foreach (var server in HomeServers.OrderByDescending(x => x.KnownUserCount).ThenBy(x => x.Server).ToList())
{
@server.Server - @server.KnownUserCount
}
}
@code {
List 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> GetHomeservers()
{
List homeServers = new();
var rooms = await RuntimeCache.CurrentHomeServer.GetJoinedRooms();
// Dictionary 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>();
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 KnownUsers { get; set; } = new();
}
}