@page "/HSAdmin/Synapse/UserQuery" @using Microsoft.AspNetCore.WebUtilities @using ArcaneLibs.Extensions @using LibMatrix.EventTypes.Spec.State.RoomInfo @using LibMatrix.Homeservers.Extensions.NamedCaches @using LibMatrix.Homeservers.ImplementationDetails.Synapse.Models.Filters @using LibMatrix.Homeservers.ImplementationDetails.Synapse.Models.Responses @using MatrixUtils.Web.Pages.HSAdmin.Synapse.Components @using MatrixUtils.Web.Pages.HSAdmin.Synapse.Components.RoomQuery @inject ILogger Logger

Homeserver Administration - User Query




Local filtering (slow) @* *@

@if (Results.Count > 0) {

Found @Results.Count rooms

@*
*@ @* TSV data (copy/paste) *@ @*
 *@
    @*              *@
    @*                 @foreach (var res in Results) { *@
    @*                      *@
    @*                          *@
    @*                          *@
    @*                          *@
    @*                          *@
    @*                      *@
    @*                 } *@
    @*             
@res.RoomId@("\t")@res.CanonicalAlias@("\t")@res.Creator@("\t")@res.Name
*@ @*
*@ @*
*@ } @foreach (var user in Results) {

@user.Name @if (!string.IsNullOrWhiteSpace(user.DisplayName)) { (@user.DisplayName) }

Log in @* Delete room *@ @* Resync state *@

@{ List flags = []; if (user.IsGuest == true) flags.Add("guest"); if (user.Admin == true) flags.Add("admin"); if (user.Deactivated == true) flags.Add("deactivated"); if (user.Erased == true) flags.Add("erased"); if (user.ShadowBanned == true) flags.Add("shadow banned"); if (user.Locked == true) flags.Add("locked"); if (user.Approved == true) flags.Add("approved"); if (!string.IsNullOrWhiteSpace(user.UserType)) flags.Add($"type=\"{user.UserType}\""); flags = flags.Where(x => x != null).ToList(); } @string.Join(", ", flags)
Full result data
@user.ToJson(ignoreNull: true)
} @code { [Parameter] [SupplyParameterFromQuery(Name = "order_by")] public string? OrderBy { get; set; } [Parameter] [SupplyParameterFromQuery(Name = "name_search")] public string? SearchTerm { get; set; } [Parameter] [SupplyParameterFromQuery(Name = "ascending")] public bool Ascending { get; set; } = true; private List Results { get; set; } = new(); private AuthenticatedHomeserverSynapse Homeserver { get; set; } = null!; private SynapseAdminLocalUserQueryFilter Filter { get; set; } = new(); protected override async Task OnInitializedAsync() { var hs = await sessionStore.GetCurrentHomeserver(navigateOnFailure: true); if (hs is not AuthenticatedHomeserverSynapse synapse) { NavigationManager.NavigateTo("/"); return; } Homeserver = synapse; StateHasChanged(); } protected override Task OnParametersSetAsync() { OrderBy ??= "name"; var execute = false; foreach (var (key, value) in QueryHelpers.ParseQuery(new Uri(NavigationManager.Uri).Query)) { switch (key) { // case "RoomIdContains": // Filter.RoomIdContains = value[0]!; // break; // case "NameContains": // Filter.NameContains = value[0]!; // break; // case "CanonicalAliasContains": // Filter.CanonicalAliasContains = value[0]!; // break; // case "VersionContains": // Filter.VersionContains = value[0]!; // break; // case "CreatorContains": // Filter.CreatorContains = value[0]!; // break; // case "EncryptionContains": // Filter.EncryptionContains = value[0]!; // break; // case "JoinRulesContains": // Filter.JoinRulesContains = value[0]!; // break; // case "GuestAccessContains": // Filter.GuestAccessContains = value[0]!; // break; // case "HistoryVisibilityContains": // Filter.HistoryVisibilityContains = value[0]!; // break; // case "Federatable": // Filter.Federatable = bool.Parse(value[0]!); // Filter.CheckFederation = true; // break; // case "Public": // Filter.Public = value[0] == "true"; // Filter.CheckPublic = true; // break; // case "JoinedMembersGreaterThan": // Filter.JoinedMembersGreaterThan = int.Parse(value[0]!); // break; // case "JoinedMembersLessThan": // Filter.JoinedMembersLessThan = int.Parse(value[0]!); // break; // case "JoinedLocalMembersGreaterThan": // Filter.JoinedLocalMembersGreaterThan = int.Parse(value[0]!); // break; // case "JoinedLocalMembersLessThan": // Filter.JoinedLocalMembersLessThan = int.Parse(value[0]!); // break; // case "StateEventsGreaterThan": // Filter.StateEventsGreaterThan = int.Parse(value[0]!); // break; // case "StateEventsLessThan": // Filter.StateEventsLessThan = int.Parse(value[0]!); // break; case "Execute": execute = true; break; default: Console.WriteLine($"Unknown query parameter: {key}"); break; } } if (execute) _ = Search(); return Task.CompletedTask; } private async Task Search() { Results.Clear(); var searchRooms = Homeserver.Admin.SearchUsersAsync(orderBy: OrderBy!, dir: Ascending ? "f" : "b", localFilter: Filter).GetAsyncEnumerator(); while (await searchRooms.MoveNextAsync()) { var room = searchRooms.Current; Results.Add(room); if ((Results.Count <= 200 && Results.Count % 10 == 0) || Results.Count % 1000 == 0) { StateHasChanged(); await Task.Yield(); await Task.Delay(1); } } StateHasChanged(); StateHasChanged(); } private readonly Dictionary validOrderBy = new() { { "name", "User name" }, { "is_guest", "Guest status" }, { "admin", "Admin status" }, { "user_type", "User type" }, { "deactivated", "Deactivation status" }, { "shadow_banned", "Shadow banned status" }, { "displayname", "Display name" }, { "avatar_url", "Avatar URL" }, { "creation_ts", "Creation time" }, { "last_seen_ts", "Last activity" }, }; private async Task Login(SynapseAdminUserListResult.SynapseAdminUserListResultUser user) { var loginResult = await Homeserver.Admin.LoginUserAsync(user.Name, TimeSpan.FromDays(1)); await sessionStore.AddSession(new() { AccessToken = loginResult.AccessToken, DeviceId = loginResult.DeviceId, UserId = loginResult.UserId, Homeserver = Homeserver.ServerName, Proxy = Homeserver.Proxy }); } }