about summary refs log tree commit diff
path: root/MatrixUtils.Web/Pages/Dev/WellKnownRes.razor
diff options
context:
space:
mode:
Diffstat (limited to 'MatrixUtils.Web/Pages/Dev/WellKnownRes.razor')
-rw-r--r--MatrixUtils.Web/Pages/Dev/WellKnownRes.razor123
1 files changed, 123 insertions, 0 deletions
diff --git a/MatrixUtils.Web/Pages/Dev/WellKnownRes.razor b/MatrixUtils.Web/Pages/Dev/WellKnownRes.razor
new file mode 100644

index 0000000..1906dd8 --- /dev/null +++ b/MatrixUtils.Web/Pages/Dev/WellKnownRes.razor
@@ -0,0 +1,123 @@ +@page "/Dev/WellKnownRes" +@using ArcaneLibs.Extensions +@using LibMatrix.Services.WellKnownResolver +@using LibMatrix.Services.WellKnownResolver.WellKnownResolvers +@inject HomeserverResolverService legacyResolver +@inject WellKnownResolverService rewriteResolver +@inject ClientWellKnownResolver rewriteClientResolver +<h3>Known Homeserver List</h3> +<hr/> + +<span>Room ID: <FancyTextBox @bind-Value="@RoomId"/><LinkButton OnClick="@Execute">Execute</LinkButton></span> + +<span>Stats:</span><br/> +<span>Server count: @entries.Count</span><br/> +<span>Client server resolution rate (N/O/T): @entries.Count(x => x.HasClientWellKnown)/@entries.Count(x => !string.IsNullOrWhiteSpace(x.LegacyResolutionResult?.Client))/@entries.Count</span> +<br/> +<span>Server server resolution rate (N/T): @entries.Count(x => x.HasServerWellKnown)/@entries.Count</span><br/> +<span>Support resolution rate (N/T): @entries.Count(x => x.HasSupportWellKnown)/@entries.Count</span><br/> + +<table class="table-bordered"> + <thead> + <td>Homeserver</td> + <td>Client API</td> + <td>Server API</td> + <td>Has support record</td> + </thead> + @foreach (var entry in entries) { + <tr> + <td>@entry.Homeserver</td> + <td style="background-color: @GetClientColor(entry)"> + <span>L: @entry.LegacyResolutionResult?.Client</span><br/> + <span>R: @entry.WellKnownResolutionResult?.ClientWellKnown?.Content?.Homeserver.BaseUrl</span> + </td> + <td style="background-color: @GetServerColor(entry)"> + <span>L: @entry.LegacyResolutionResult?.Server</span><br/> + <span>R: @entry.WellKnownResolutionResult?.ServerWellKnown?.Content?.Homeserver</span> + </td> + <td>@(entry.HasSupportWellKnown ? "Y" : "X")</td> + </tr> + <tr> + <td colspan="6"> + <details> + <pre>@(entry.WellKnownResolutionResult?.ToJson() ?? "null")</pre> + </details> + </td> + </tr> + } +</table> + +@code { + private List<TableEntry> 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<TableEntry>(); + 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"; + } + +} \ No newline at end of file