about summary refs log tree commit diff
path: root/MatrixRoomUtils.Web/Shared/RoomListItem.razor
blob: b7394c1ab0b57347ca6627d7e34f027c2edee928 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
@using MatrixRoomUtils.Core.Authentication
@using System.Text.Json
@using MatrixRoomUtils.Core.Extensions
<div style="background-color: #ffffff11; border-radius: 25px; margin: 8px; width: fit-Content; @(hasDangerousRoomVersion ? "border: red 4px solid;" : hasOldRoomVersion ? "border: #FF0 1px solid;" : "")">
    @if (ShowOwnProfile)
    {
        <img style="@(ChildContent != null ? "vertical-align: baseline;":"") width: 32px; height:  32px; border-radius: 50%; @(hasCustomProfileAvatar ? "border-color: red; border-width: 3px; border-style: dashed;" : "")" src="@profileAvatar"/>
        <span style="vertical-align: middle; margin-right: 8px; border-radius: 75px; @(hasCustomProfileName ? "background-color: red;" : "")">@profileName</span>
        <span style="vertical-align: middle; padding-right: 8px; padding-left: 0px;">-></span>
    }
    <img style="@(ChildContent != null ? "vertical-align: baseline;":"") width: 32px; height:  32px; border-radius: 50%;" src="@roomIcon"/>
    <div style="display: inline-block;">
        <span style="vertical-align: middle; padding-right: 8px;">@roomName</span>
        @if (ChildContent != null)
        {
            @ChildContent
        }
    </div>

</div>

@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;

    protected override async Task OnInitializedAsync()
    {
        await base.OnInitializedAsync();

        if (!RuntimeCache.WasLoaded)
        {
            Console.WriteLine("Loading from local storage");
            await LocalStorageWrapper.LoadFromLocalStorage(LocalStorage);
        }

        if (Room == null)
        {
            if (RoomId == null)
            {
                throw new ArgumentNullException(nameof(RoomId));
            }
            Room = await RuntimeCache.CurrentHomeServer.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 = RuntimeCache.CurrentHomeServer.ResolveMediaUri(url);
                }
            }
            catch (InvalidOperationException e)
            {
                Console.WriteLine($"Failed to get avatar for room {RoomId}: {e.Message}\n{state.Value.ToJson()}");
            }
        }

        if (ShowOwnProfile)
        {
            var profile = await RuntimeCache.CurrentHomeServer.GetProfile(RuntimeCache.CurrentHomeServer.UserId, debounce: true);

            var memberState = await Room.GetStateAsync("m.room.member", RuntimeCache.CurrentHomeServer.UserId);
            if (memberState.HasValue)
            {
                memberState.Value.TryGetProperty("avatar_url", out var _avatar);
                if (_avatar.ValueKind == JsonValueKind.String)
                {
                    hasCustomProfileAvatar = _avatar.GetString() != profile.AvatarUrl;
                    profileAvatar = RuntimeCache.CurrentHomeServer.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";
                }
            }
        }
        if (Random.Shared.Next(100) == 1)
            await LocalStorageWrapper.SaveToLocalStorage(LocalStorage);
    }

}