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 _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()!; 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()!; 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()!; 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"} }; } }