about summary refs log tree commit diff
path: root/ModerationClient/Services/EventRenderer.cs
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--ModerationClient/Services/EventRenderer.cs82
1 files changed, 82 insertions, 0 deletions
diff --git a/ModerationClient/Services/EventRenderer.cs b/ModerationClient/Services/EventRenderer.cs
new file mode 100644

index 0000000..d06523b --- /dev/null +++ b/ModerationClient/Services/EventRenderer.cs
@@ -0,0 +1,82 @@ +using System.Collections.Generic; +using ArcaneLibs.Extensions; +using Avalonia.Controls; +using Avalonia.Media; +using LibMatrix; +using LibMatrix.EventTypes.Spec; +using LibMatrix.EventTypes.Spec.State.RoomInfo; + +namespace ModerationClient.Services; + +public class EventRenderer { + private static Dictionary<StateEventResponse, Control> _eventRenderers = new(); + public static Control RenderEvent(StateEventResponse evt) { + // if (_eventRenderers.TryGetValue(evt, out var @event)) { + // @event. + // return @event; + // } + + if (evt.Type == "m.room.member") { + return _eventRenderers[evt] = RenderMemberEvent(evt); + } + if (evt.Type == "m.room.message") { + return _eventRenderers[evt] = RenderMessageEvent(evt); + } + if (evt.Type == "m.room.server_acl") { + return _eventRenderers[evt] = RenderACLStateEvent(evt); + } + + return new TextBlock { + Text = $"Unknown event type: {evt.Type}", + Foreground = Brushes.Red, + Classes = {"message"}, TextWrapping = TextWrapping.WrapWithOverflow + }; + } + + private static Control RenderMemberEvent(StateEventResponse evt) { + var content = evt.ContentAs<RoomMemberEventContent>()!; + return new TextBlock { + Text = $"{evt.Sender} changed {evt.StateKey}'s membership: {content.Membership} as {content.DisplayName} (reason: {content.Reason})", + Classes = {"message"}, Foreground = Brushes.Teal + }; + } + + private static Control RenderACLStateEvent(StateEventResponse evt) { + var content = evt.ContentAs<RoomCreateEventContent>()!; + return new TextBlock { + Text = $"{evt.Sender} changed the room's ACL.", + Classes = {"message"}, Foreground = Brushes.Teal + }; + } + + private static Control RenderMessageEvent(StateEventResponse evt) { + var content = evt.ContentAs<RoomMessageEventContent>()!; + if (content.Format == null) { + return new TextBlock { + Text = $"{evt.Sender}: {content.Body}", + Classes = {"message"}, TextWrapping = TextWrapping.WrapWithOverflow + }; + } + else if (content.Format == "org.matrix.custom.html") { + // parse html + var html = content.FormattedBody; + return new TextBlock { + Text = $"{evt.Sender}: {html}", + Classes = {"message"}, TextWrapping = TextWrapping.WrapWithOverflow + }; + } + else { + return new TextBlock { + Text = $"{evt.Sender} sent a message with an unknown format: {content.Format}", + Foreground = Brushes.Red, + Classes = {"message"} + }; + } + + return new TextBlock { + Text = $"{evt.Sender} sent an unknown message type: {content.MessageType}: {content.ToJson(ignoreNull: true)}", + Foreground = Brushes.Red, + Classes = {"message"} + }; + } +} \ No newline at end of file