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
|