@using MatrixRoomUtils.Core.Authentication @using System.Text.Json @using MatrixRoomUtils.Core.Extensions
@if (ShowOwnProfile) { @profileName -> }
@roomName @if (ChildContent != null) { @ChildContent }
@code { [Parameter] public RenderFragment? ChildContent { get; set; } [Parameter] public Room Room { get; set; } [Parameter] public string RoomId { get; set; } [Parameter] public bool ShowOwnProfile { get; set; } = false; private string roomName { get; set; } = "Loading..."; private string roomIcon { get; set; } = "/icon-192.png"; private string profileAvatar { get; set; } = "/icon-192.png"; private string profileName { get; set; } = "Loading..."; private bool hasCustomProfileAvatar { get; set; } = false; private bool hasCustomProfileName { get; set; } = false; private bool hasOldRoomVersion { get; set; } = false; private bool hasDangerousRoomVersion { get; set; } = false; private static SemaphoreSlim _semaphoreSlim = new(128); protected override async Task OnInitializedAsync() { await base.OnInitializedAsync(); await LocalStorageWrapper.LoadFromLocalStorage(LocalStorage); await _semaphoreSlim.WaitAsync(); var hs = await new AuthenticatedHomeServer(RuntimeCache.CurrentHomeServer.UserId, RuntimeCache.CurrentHomeServer.AccessToken, RuntimeCache.CurrentHomeServer.HomeServerDomain).Configure(); if (Room == null) { if (RoomId == null) { throw new ArgumentNullException(nameof(RoomId)); } Room = await hs.GetRoom(RoomId); } else { RoomId = Room.RoomId; } roomName = await Room.GetNameAsync(); if (roomName == null) { roomName = "Unnamed room: " + RoomId; } var ce = await Room.GetCreateEventAsync(); if (ce != null) { if (int.TryParse(ce.RoomVersion, out int rv) && rv < 10) { hasOldRoomVersion = true; } if (new[] { "1", "8" }.Contains(ce.RoomVersion)) { hasDangerousRoomVersion = true; roomName = "Dangerous room: " + roomName; } } var state = await Room.GetStateAsync("m.room.avatar"); if (state != null) { try { var url = state.Value.GetProperty("url").GetString(); if (url != null) { roomIcon = hs.ResolveMediaUri(url); Console.WriteLine($"Got avatar for room {RoomId}: {roomIcon} ({url})"); } } catch (InvalidOperationException e) { Console.WriteLine($"Failed to get avatar for room {RoomId}: {e.Message}\n{state.Value.ToJson()}"); } } if (ShowOwnProfile) { var profile = await hs.GetProfile(hs.UserId, debounce: true); var memberState = await Room.GetStateAsync("m.room.member", hs.UserId); if (memberState.HasValue) { memberState.Value.TryGetProperty("avatar_url", out var _avatar); if (_avatar.ValueKind == JsonValueKind.String) { hasCustomProfileAvatar = _avatar.GetString() != profile.AvatarUrl; profileAvatar = hs.ResolveMediaUri(_avatar.GetString()); } else { profileAvatar = "/icon-192.png"; } memberState.Value.TryGetProperty("displayname", out var _name); if (_name.ValueKind == JsonValueKind.String) { hasCustomProfileName = _name.GetString() != profile.DisplayName; profileName = _name.GetString(); // Console.WriteLine($"{profile.DisplayName} - {_name.GetString()}: {hasCustomProfileName}"); } else { profileName = "Unnamed user"; } } } _semaphoreSlim.Release(); if (Random.Shared.Next(100) == 1) await LocalStorageWrapper.SaveCacheToLocalStorage(LocalStorage); } }