@using System.Collections.ObjectModel
@using System.Text.Json
@using System.Text.RegularExpressions
@using ArcaneLibs.Blazor.Components.Services
@using ArcaneLibs.Extensions
@using Spacebar.Client.Core
@using Spacebar.Models.Generic
@inject JsConsoleService jsConsole
@foreach (var message in Messages) {
if (message.Type == 0 || message.Type == 19) {
if (message.Type == 19) {
╭⎯⎯ @message.ReferencedMessage?.Author.Username @string.Join("", message.ReferencedMessage?.Content?.Split("\n")[0].Take(100) ?? [])
}
$"role_{x}")))">@message.Author.Username
@message.Content
@GetMessageContent(message)
@GetMessageContentEnumerated(message)
@if (message.Attachments.Any()) {
@foreach (var att in message.Attachments) {
@if (att.ContentType.StartsWith("image/")) {
}
else {
@att.ToJson()
}
}
}
}
else {
Unknown message type @message.Type
View raw message data
@message.ToJson(indent: true)
}
}
@code {
[Parameter]
public required ObservableCollection Messages { get; set; }
public List GetMemberRoles(long guildId, long memberId) {
// App.ClientManager.ClientState.Guilds[guildId].
return [];
}
private static string[] _partColors = [
"#FFFF0033",
"#FF00FF33",
"#00FFFF33",
"#FF000033",
"#00FF0033",
"#0000FF33"
];
private static bool _shouldRenderMarkdownZones = true;
private RenderFragment GetMessageContent(Message msg) => builder => {
var fullContent = msg.Content;
int i = 0, line = 0;
Regex[][] groupedRegexes = [[MarkdownBoldRegex, MarkdownCodeblockRegex], [MarkdownCodeRegex, MarkdownItalicRegex]];
Regex[] regexes = groupedRegexes.SelectMany(x => x).ToArray();
var lines = fullContent.Split('\n');
foreach (var lineContent in lines) {
var content = lineContent;
var elemType = "span";
var shouldBr = true;
if (content.StartsWith("-#")) {
elemType = "sub";
content = content[2..].TrimStart();
}
else if (content.StartsWith("#")) {
var hdrLevel = content.TakeWhile(x => x == '#').Count();
content = content[hdrLevel..];
shouldBr = false;
elemType = "h" + hdrLevel;
}
else if (content.StartsWith("*")) {
}
var indicies = regexes.Select(r => new {
regex = r,
regexStr = r.ToString(),
matchIdx = r.Match(content).Index,
matchContent = r.Match(content).Value
}).Where(x => x.matchIdx != 0).ToList();
if (indicies.Any()) {
jsConsole.Info("Found indices: ", JsonSerializer.SerializeToElement(indicies, new JsonSerializerOptions() {
IncludeFields = true
}));
builder.OpenElement(i++, elemType);
{
if (_shouldRenderMarkdownZones) builder.AddAttribute(i++, "style", $"background-color: {_partColors[i % _partColors.Length]}");
builder.AddContent(i++, content![..indicies.Min(x => x.matchIdx)]);
content = content![..indicies.Min(x => x.matchIdx)];
}
builder.CloseComponent();
}
else {
builder.OpenElement(i++, elemType);
{
if (_shouldRenderMarkdownZones && elemType != "span") builder.AddAttribute(i++, "style", $"background-color: {_partColors[i % _partColors.Length]}");
builder.AddContent(i++, content!);
}
builder.CloseComponent();
// continue;
}
if (line++ <= lines.Length && shouldBr) {
builder.AddMarkupContent(i++, "
");
}
}
};
private RenderFragment GetMessageContentEnumerated(Message msg) => builder => {
int i = 0;
builder.OpenElement(i++, "div");
builder.AddAttribute(i++, "id", "msg"+msg.Id);
foreach (var comp in new MarkdownEnumerator().EnumerateMarkdownComponents(msg.Content)) {
if (comp is ContainerMarkdownNode) {
}
else {
builder.OpenElement(i++, "span");
builder.AddAttribute(i++, "class", "mdErrorBlinkBg");
// jsConsole.Info("frames:", builder.GetFrames().Array[0].);
// builder.AddAttribute(i++, );
builder.AddContent(i++, $"Unknown component type: {comp.GetType().FullName}");
builder.CloseElement();
}
}
builder.CloseElement();
};
}