From c37bcb0e4a878d4f4c0e47988adb8624131c82cd Mon Sep 17 00:00:00 2001 From: TheArcaneBrony Date: Thu, 9 Nov 2023 07:38:33 +0100 Subject: event types --- MatrixRoomUtils.Web/Shared/MxcImage.razor | 43 +++++++++++ MatrixRoomUtils.Web/Shared/RoomListItem.razor | 83 +++++++++++++--------- .../TimelineComponents/BaseTimelineItem.razor | 19 ++++- .../TimelineCanonicalAliasItem.razor | 27 +++++++ .../TimelineHistoryVisibilityItem.razor | 27 +++++++ .../TimelineComponents/TimelineMemberItem.razor | 8 ++- .../TimelineComponents/TimelineMessageItem.razor | 32 +++++++-- .../TimelineRoomCreateItem.razor | 6 +- .../TimelineComponents/TimelineRoomNameItem.razor | 27 +++++++ .../TimelineComponents/TimelineRoomTopicItem.razor | 37 ++++++++++ .../TimelineComponents/TimelineUnknownItem.razor | 2 +- 11 files changed, 267 insertions(+), 44 deletions(-) create mode 100644 MatrixRoomUtils.Web/Shared/MxcImage.razor create mode 100644 MatrixRoomUtils.Web/Shared/TimelineComponents/TimelineCanonicalAliasItem.razor create mode 100644 MatrixRoomUtils.Web/Shared/TimelineComponents/TimelineHistoryVisibilityItem.razor create mode 100644 MatrixRoomUtils.Web/Shared/TimelineComponents/TimelineRoomNameItem.razor create mode 100644 MatrixRoomUtils.Web/Shared/TimelineComponents/TimelineRoomTopicItem.razor (limited to 'MatrixRoomUtils.Web/Shared') diff --git a/MatrixRoomUtils.Web/Shared/MxcImage.razor b/MatrixRoomUtils.Web/Shared/MxcImage.razor new file mode 100644 index 0000000..f54c1f8 --- /dev/null +++ b/MatrixRoomUtils.Web/Shared/MxcImage.razor @@ -0,0 +1,43 @@ + +@code { + private string _mxcUri; + private string _style; + private string _resolvedUri; + + [Parameter] + public string MxcUri { + get => _mxcUri ?? ""; + set { + _mxcUri = value; + UriHasChanged(value); + } + } + + [Parameter] + public string Style { + get => _style; + set { + _style = value; + StateHasChanged(); + } + } + [Parameter] + public RemoteHomeserver? Homeserver { get; set; } + + private string ResolvedUri { + get => _resolvedUri; + set { + _resolvedUri = value; + StateHasChanged(); + } + } + + private async Task UriHasChanged(string value) { + var uri = value[5..].Split('/'); + ResolvedUri = (Homeserver ?? await hsProvider.GetRemoteHomeserver(uri[0])).ResolveMediaUri(value); + } + + [Parameter] + public string Class { get; set; } + +} \ No newline at end of file diff --git a/MatrixRoomUtils.Web/Shared/RoomListItem.razor b/MatrixRoomUtils.Web/Shared/RoomListItem.razor index a24ccad..970526d 100644 --- a/MatrixRoomUtils.Web/Shared/RoomListItem.razor +++ b/MatrixRoomUtils.Web/Shared/RoomListItem.razor @@ -9,14 +9,14 @@ @if (RoomInfo is not null) {
@if (OwnMemberState != null) { - + @(OwnMemberState?.DisplayName ?? GlobalProfile?.DisplayName ?? "Loading...") -> } - +
@RoomInfo.RoomName @if (ChildContent is not null) { @@ -36,7 +36,13 @@ else { public RenderFragment? ChildContent { get; set; } [Parameter] - public RoomInfo? RoomInfo { get; set; } + public RoomInfo? RoomInfo { + get => _roomInfo; + set { + _roomInfo = value; + OnParametersSetAsync(); + } + } [Parameter] public bool ShowOwnProfile { get; set; } = false; @@ -48,42 +54,52 @@ else { public UserProfileResponse? GlobalProfile { get; set; } [Parameter] - public bool LoadData { get; set; } = false; + public bool LoadData { + get => _loadData; + set { + _loadData = value; + OnParametersSetAsync(); + } + } private bool HasOldRoomVersion { get; set; } = false; private bool HasDangerousRoomVersion { get; set; } = false; private static SemaphoreSlim _semaphoreSlim = new(8); + private RoomInfo? _roomInfo; + private bool _loadData = false; private static AuthenticatedHomeserverGeneric? hs { get; set; } protected override async Task OnParametersSetAsync() { - RoomInfo.PropertyChanged += (_, a) => { - Console.WriteLine(a.PropertyName); - StateHasChanged(); - }; - - if (LoadData) { - try { - await RoomInfo.GetStateEvent("m.room.create"); - if (ShowOwnProfile) - OwnMemberState ??= (await RoomInfo.GetStateEvent("m.room.member", hs.WhoAmI.UserId)).TypedContent as RoomMemberEventContent; - - await RoomInfo.GetStateEvent("m.room.name"); - await RoomInfo.GetStateEvent("m.room.avatar"); - } - catch (MatrixException e) { - if (e.ErrorCode == "M_FORBIDDEN") { - LoadData = false; - RoomInfo.StateEvents.Add(new() { - Type = "m.room.create", - TypedContent = new RoomCreateEventContent() { RoomVersion = "0" } - }); - RoomInfo.StateEvents.Add(new() { - Type = "m.room.name", - TypedContent = new RoomNameEventContent() { - Name = "M_FORBIDDEN: Are you a member of this room? " + RoomInfo.Room.RoomId - } - }); + if (RoomInfo != null) { + RoomInfo.PropertyChanged += (_, a) => { + Console.WriteLine(a.PropertyName); + StateHasChanged(); + }; + + if (LoadData) { + try { + await RoomInfo.GetStateEvent("m.room.create"); + if (ShowOwnProfile) + OwnMemberState ??= (await RoomInfo.GetStateEvent("m.room.member", hs.WhoAmI.UserId)).TypedContent as RoomMemberEventContent; + + await RoomInfo.GetStateEvent("m.room.name"); + await RoomInfo.GetStateEvent("m.room.avatar"); + } + catch (MatrixException e) { + if (e.ErrorCode == "M_FORBIDDEN") { + LoadData = false; + RoomInfo.StateEvents.Add(new() { + Type = "m.room.create", + TypedContent = new RoomCreateEventContent() { RoomVersion = "0" } + }); + RoomInfo.StateEvents.Add(new() { + Type = "m.room.name", + TypedContent = new RoomNameEventContent() { + Name = "M_FORBIDDEN: Are you a member of this room? " + RoomInfo.Room.RoomId + } + }); + } } } } @@ -170,5 +186,4 @@ else { // } // } -} - +} \ No newline at end of file diff --git a/MatrixRoomUtils.Web/Shared/TimelineComponents/BaseTimelineItem.razor b/MatrixRoomUtils.Web/Shared/TimelineComponents/BaseTimelineItem.razor index 9efeaab..8d608e3 100644 --- a/MatrixRoomUtils.Web/Shared/TimelineComponents/BaseTimelineItem.razor +++ b/MatrixRoomUtils.Web/Shared/TimelineComponents/BaseTimelineItem.razor @@ -1,5 +1,7 @@ @using LibMatrix +@using LibMatrix.EventTypes.Spec.State @using LibMatrix.Homeservers +@using LibMatrix.Responses

BaseTimelineItem

@code { @@ -13,4 +15,19 @@ [Parameter] public AuthenticatedHomeserverGeneric Homeserver { get; set; } -} + public List EventsBefore => Events.TakeWhile(e => e.EventId != Event.EventId).ToList(); + + public List MatchingEventsBefore => EventsBefore.Where(x => x.Type == Event.Type && x.StateKey == Event.StateKey).ToList(); + + public StateEventResponse? PreviousState => MatchingEventsBefore.LastOrDefault(); + + public RoomMemberEventContent? CurrentSenderMemberEventContent => EventsBefore.LastOrDefault(x => x.Type == "m.room.member" && x.StateKey == Event.Sender)? + .TypedContent as RoomMemberEventContent; + + public UserProfileResponse CurrentSenderProfile => new() { DisplayName = CurrentSenderMemberEventContent?.DisplayName, AvatarUrl = CurrentSenderMemberEventContent?.AvatarUrl }; + + public bool HasPreviousMessage => EventsBefore.Last() is { Type: "m.room.message" } response && response.Sender == Event.Sender; + + + +} \ No newline at end of file diff --git a/MatrixRoomUtils.Web/Shared/TimelineComponents/TimelineCanonicalAliasItem.razor b/MatrixRoomUtils.Web/Shared/TimelineComponents/TimelineCanonicalAliasItem.razor new file mode 100644 index 0000000..1213432 --- /dev/null +++ b/MatrixRoomUtils.Web/Shared/TimelineComponents/TimelineCanonicalAliasItem.razor @@ -0,0 +1,27 @@ +@using ArcaneLibs.Extensions +@using LibMatrix.EventTypes.Spec.State +@using LibMatrix.Responses +@inherits BaseTimelineItem + +@if (currentEventContent is not null) { + @if (previousEventContent is null) { + set the room alias to "@currentEventContent.Alias" + } + else { + changed the room name from "@previousEventContent.Alias" to "@currentEventContent.Alias" + } +} +else { +
+ Unknown event @Event.Type (@Event.StateKey) +
+            @Event.ToJson()
+        
+
+} + +@code { + private RoomCanonicalAliasEventContent? previousEventContent => PreviousState?.TypedContent as RoomCanonicalAliasEventContent; + + private RoomCanonicalAliasEventContent? currentEventContent => Event.TypedContent as RoomCanonicalAliasEventContent; +} \ No newline at end of file diff --git a/MatrixRoomUtils.Web/Shared/TimelineComponents/TimelineHistoryVisibilityItem.razor b/MatrixRoomUtils.Web/Shared/TimelineComponents/TimelineHistoryVisibilityItem.razor new file mode 100644 index 0000000..172a38c --- /dev/null +++ b/MatrixRoomUtils.Web/Shared/TimelineComponents/TimelineHistoryVisibilityItem.razor @@ -0,0 +1,27 @@ +@using ArcaneLibs.Extensions +@using LibMatrix.EventTypes.Spec.State +@using LibMatrix.Responses +@inherits BaseTimelineItem + +@if (currentEventContent is not null) { + @if (previousEventContent is null) { + set the history visibility to "@currentEventContent.HistoryVisibility" + } + else { + changed the history visibility from "@previousEventContent.HistoryVisibility" to "@currentEventContent.HistoryVisibility" + } +} +else { +
+ Unknown event @Event.Type (@Event.StateKey) +
+            @Event.ToJson()
+        
+
+} + +@code { + private RoomHistoryVisibilityEventContent? previousEventContent => PreviousState?.TypedContent as RoomHistoryVisibilityEventContent; + + private RoomHistoryVisibilityEventContent? currentEventContent => Event.TypedContent as RoomHistoryVisibilityEventContent; +} \ No newline at end of file diff --git a/MatrixRoomUtils.Web/Shared/TimelineComponents/TimelineMemberItem.razor b/MatrixRoomUtils.Web/Shared/TimelineComponents/TimelineMemberItem.razor index ed4dceb..3b18b95 100644 --- a/MatrixRoomUtils.Web/Shared/TimelineComponents/TimelineMemberItem.razor +++ b/MatrixRoomUtils.Web/Shared/TimelineComponents/TimelineMemberItem.razor @@ -15,7 +15,12 @@ @Event.StateKey changed their display name to @(roomMemberData.DisplayName ?? Event.Sender) break; case "join": - joined + @if (prevRoomMemberData is null) { + joined + } + else { + changed their profile to + } break; case "leave": @Event.StateKey left @@ -43,5 +48,6 @@ else { @code { private RoomMemberEventContent? roomMemberData => Event.TypedContent as RoomMemberEventContent; + private RoomMemberEventContent? prevRoomMemberData => PreviousState?.TypedContent as RoomMemberEventContent; } diff --git a/MatrixRoomUtils.Web/Shared/TimelineComponents/TimelineMessageItem.razor b/MatrixRoomUtils.Web/Shared/TimelineComponents/TimelineMessageItem.razor index 8073406..81956b0 100644 --- a/MatrixRoomUtils.Web/Shared/TimelineComponents/TimelineMessageItem.razor +++ b/MatrixRoomUtils.Web/Shared/TimelineComponents/TimelineMessageItem.razor @@ -1,10 +1,34 @@ @using ArcaneLibs.Extensions +@using LibMatrix.EventTypes.Spec @inherits BaseTimelineItem -
-    @Event.RawContent?.ToJson(indent: false)
-
+ + @if (!HasPreviousMessage) { + :
+ } + @switch (currentEventContent.MessageType) { + case "m.text": { + @foreach (var line in currentEventContent.Body.Split('\n')) { + @line
+ } + break; + } + case "m.image": { + @currentEventContent.Body
+ + break; + } + default: { +
+               @Event.RawContent?.ToJson(indent: false)
+            
+ break; + } + } +
@code { + private RoomMessageEventContent? previousEventContent => PreviousState?.TypedContent as RoomMessageEventContent; -} + private RoomMessageEventContent? currentEventContent => Event.TypedContent as RoomMessageEventContent; +} \ No newline at end of file diff --git a/MatrixRoomUtils.Web/Shared/TimelineComponents/TimelineRoomCreateItem.razor b/MatrixRoomUtils.Web/Shared/TimelineComponents/TimelineRoomCreateItem.razor index 2d05151..f3e6c7e 100644 --- a/MatrixRoomUtils.Web/Shared/TimelineComponents/TimelineRoomCreateItem.razor +++ b/MatrixRoomUtils.Web/Shared/TimelineComponents/TimelineRoomCreateItem.razor @@ -2,11 +2,11 @@ @using LibMatrix.EventTypes.Spec.State @inherits BaseTimelineItem -

+ @Event.Sender created the room with room version @CreationEventContent.RoomVersion - @(CreationEventContent.Federate ?? false ? "and" : "without") federating with other servers.
+ @(CreationEventContent.Federate ?? true ? "and" : "without") federating with other servers.
This room is of type @(CreationEventContent.Type ?? "Untyped room (usually a chat room)") -

+
     @Event.RawContent?.ToJson(indent: false)
 
diff --git a/MatrixRoomUtils.Web/Shared/TimelineComponents/TimelineRoomNameItem.razor b/MatrixRoomUtils.Web/Shared/TimelineComponents/TimelineRoomNameItem.razor new file mode 100644 index 0000000..eeec3de --- /dev/null +++ b/MatrixRoomUtils.Web/Shared/TimelineComponents/TimelineRoomNameItem.razor @@ -0,0 +1,27 @@ +@using ArcaneLibs.Extensions +@using LibMatrix.EventTypes.Spec.State +@using LibMatrix.Responses +@inherits BaseTimelineItem + +@if (currentEventContent is not null) { + @if (previousEventContent is null) { + set the room name to "@currentEventContent.Name" + } + else { + changed the room name from "@previousEventContent.Name" to "@currentEventContent.Name" + } +} +else { +
+ Unknown event @Event.Type (@Event.StateKey) +
+            @Event.ToJson()
+        
+
+} + +@code { + private RoomNameEventContent? previousEventContent => PreviousState?.TypedContent as RoomNameEventContent; + + private RoomNameEventContent? currentEventContent => Event.TypedContent as RoomNameEventContent; +} \ No newline at end of file diff --git a/MatrixRoomUtils.Web/Shared/TimelineComponents/TimelineRoomTopicItem.razor b/MatrixRoomUtils.Web/Shared/TimelineComponents/TimelineRoomTopicItem.razor new file mode 100644 index 0000000..7ef17a8 --- /dev/null +++ b/MatrixRoomUtils.Web/Shared/TimelineComponents/TimelineRoomTopicItem.razor @@ -0,0 +1,37 @@ +@using ArcaneLibs.Extensions +@using LibMatrix.EventTypes.Spec.State +@using LibMatrix.Responses +@inherits BaseTimelineItem + +@if (currentEventContent is not null) { + @if (previousEventContent is null) { + set the room topic to
+
+            @currentEventContent.Topic
+        
+ } + else { + changed the room topic from
+
+            @previousEventContent.Topic
+        

+ to
+
+            @currentEventContent.Topic
+        
+ } +} +else { +
+ Unknown event @Event.Type (@Event.StateKey) +
+            @Event.ToJson()
+        
+
+} + +@code { + private RoomTopicEventContent? previousEventContent => PreviousState?.TypedContent as RoomTopicEventContent; + + private RoomTopicEventContent? currentEventContent => Event.TypedContent as RoomTopicEventContent; +} \ No newline at end of file diff --git a/MatrixRoomUtils.Web/Shared/TimelineComponents/TimelineUnknownItem.razor b/MatrixRoomUtils.Web/Shared/TimelineComponents/TimelineUnknownItem.razor index 1ab530d..4f05b30 100644 --- a/MatrixRoomUtils.Web/Shared/TimelineComponents/TimelineUnknownItem.razor +++ b/MatrixRoomUtils.Web/Shared/TimelineComponents/TimelineUnknownItem.razor @@ -6,7 +6,7 @@ Unknown event type:
@Event.Type
-
@Event.ToJson()
+
@Event.ToJson(ignoreNull: true)
-- cgit 1.5.1