@page "/Dev/WellKnownRes"
@using ArcaneLibs.Extensions
@using LibMatrix.Services.WellKnownResolver
@using LibMatrix.Services.WellKnownResolver.WellKnownResolvers
@inject HomeserverResolverService legacyResolver
@inject WellKnownResolverService rewriteResolver
@inject ClientWellKnownResolver rewriteClientResolver
Known Homeserver List
Room ID: Execute
Stats:
Server count: @entries.Count
Client server resolution rate (N/O/T): @entries.Count(x => x.HasClientWellKnown)/@entries.Count(x => !string.IsNullOrWhiteSpace(x.LegacyResolutionResult?.Client))/@entries.Count
Server server resolution rate (N/T): @entries.Count(x => x.HasServerWellKnown)/@entries.Count
Support resolution rate (N/T): @entries.Count(x => x.HasSupportWellKnown)/@entries.Count
Homeserver |
Client API |
Server API |
Has support record |
@foreach (var entry in entries) {
@entry.Homeserver |
L: @entry.LegacyResolutionResult?.Client
R: @entry.WellKnownResolutionResult?.ClientWellKnown?.Content?.Homeserver.BaseUrl
|
L: @entry.LegacyResolutionResult?.Server
R: @entry.WellKnownResolutionResult?.ServerWellKnown?.Content?.Homeserver
|
@(entry.HasSupportWellKnown ? "Y" : "X") |
@(entry.WellKnownResolutionResult?.ToJson() ?? "null")
|
}
@code {
private List entries = new();
[SupplyParameterFromQuery]
public string? RoomId { get; set; }
AuthenticatedHomeserverGeneric? hs { get; set; }
protected override async Task OnInitializedAsync() {
hs = await sessionStore.GetCurrentHomeserver(navigateOnFailure: true);
if (hs is null) return;
if (RoomId is not null) {
await Execute();
}
}
private class TableEntry {
public required string Homeserver { get; set; }
public HomeserverResolverService.WellKnownUris? LegacyResolutionResult { get; set; }
public WellKnownResolverService.WellKnownRecords? WellKnownResolutionResult { get; set; }
public bool HasClientWellKnown => WellKnownResolutionResult?.ClientWellKnown is { Content.Homeserver.BaseUrl: { Length: > 0 } };
public bool HasServerWellKnown => WellKnownResolutionResult?.ServerWellKnown is { Content.Homeserver.Length: > 0 };
public bool HasSupportWellKnown => WellKnownResolutionResult?.SupportWellKnown?.Content is not null and not { SupportPage: null, Contacts: null or { Count: 0 } };
}
private async Task Execute() {
var members = await hs!.GetRoom(RoomId!).GetMembersListAsync();
var homeservers = members.Select(x => x.StateKey!.Split(':', 2)[1]).Distinct().ToList();
var entries = new List();
foreach (var homeserver in homeservers) {
var e = new TableEntry() { Homeserver = homeserver };
_ = TryResolveLegacy(e);
_ = TryFullResolveRewrite(e);
entries.Add(e);
}
this.entries = entries;
StateHasChanged();
}
private async Task TryResolveLegacy(TableEntry entry) {
try {
var cTask = legacyResolver.ResolveHomeserverFromWellKnown(entry.Homeserver, enableServer: false);
var sTask = legacyResolver.ResolveHomeserverFromWellKnown(entry.Homeserver, enableClient: false);
entry.LegacyResolutionResult = (await cTask);
entry.LegacyResolutionResult.Server = (await sTask).Server;
StateHasChanged();
}
catch { }
}
private async Task TryFullResolveRewrite(TableEntry entry) {
try {
entry.WellKnownResolutionResult = await rewriteResolver.TryResolveWellKnownRecords(entry.Homeserver);
StateHasChanged();
}
catch { }
}
private string GetClientColor(TableEntry entry) {
if (entry.LegacyResolutionResult?.Client == entry.WellKnownResolutionResult?.ClientWellKnown?.Content?.Homeserver?.BaseUrl && entry.WellKnownResolutionResult?.ClientWellKnown?.Content?.Homeserver?.BaseUrl == null) return "#333333";
if (entry.LegacyResolutionResult?.Client == entry.WellKnownResolutionResult?.ClientWellKnown?.Content?.Homeserver?.BaseUrl?.TrimEnd('/')) return "#008800";
return "#ff0000";
}
private string GetServerColor(TableEntry entry) {
if (entry.LegacyResolutionResult?.Server == entry.WellKnownResolutionResult?.ServerWellKnown?.Content?.Homeserver && entry.WellKnownResolutionResult?.ServerWellKnown?.Content?.Homeserver == null) return "#333333";
if (entry.LegacyResolutionResult?.Server == entry.WellKnownResolutionResult?.ServerWellKnown?.Content?.Homeserver.TrimEnd('/')) return "#008800";
return "#ff0000";
}
}