@ -46,69 +46,68 @@
<div class="chatlog__message-group">
<div class="chatlog__message-group">
@foreach (var (message, i) in Model.Messages.WithIndex())
@foreach (var (message, i) in Model.Messages.WithIndex())
{
{
var isSystemMessage = message.Kind.IsSystemMessage();
var isFirst = i == 0;
var isFirst = i == 0;
<div id="chatlog__message-container-@message.Id" class="chatlog__message-container @(message.IsPinned ? "chatlog__message-container--pinned" : null)" data-message-id="@message.Id">
<div id="chatlog__message-container-@message.Id" class="chatlog__message-container @(message.IsPinned ? "chatlog__message-container--pinned" : null)" data-message-id="@message.Id">
<div class="chatlog__message">
<div class="chatlog__message">
@{/* Left side */}
@{/* System notification */}
<div class="chatlog__message-aside">
@if (message.Kind.IsSystemNotification())
@if (isSystemMessage)
{
<svg class=chatlog__system-message-icon><use href="#@message.Kind.ToCssIdFormat()-icon"></use></svg>
}
else if(isFirst)
{
// Reference symbol
if (message.Reference is not null)
{
<div class="chatlog__reference-symbol"></div>
}
// Avatar
<img class="chatlog__avatar" src="@await ResolveUrlAsync(message.Author.AvatarUrl)" alt="Avatar" loading="lazy">
}
else
{
{
<div class="chatlog__short-timestamp" title="@FormatDate(message.Timestamp)">@message.Timestamp.ToLocalString("t")</div>
// System notifications are grouped even if the message author is different.
}
// That's why we have to update the user values with the author of the current message.
</div>
@{/* Right side */}
<div class="chatlog__message-primary">
@if (isSystemMessage)
{
// system messages are grouped even if the message author is different
// that's why we have to update the user values with the author of the current message
userMember = Model.ExportContext.TryGetMember(message.Author.Id);
userMember = Model.ExportContext.TryGetMember(message.Author.Id);
userColor = Model.ExportContext.TryGetUserColor(message.Author.Id);
userColor = Model.ExportContext.TryGetUserColor(message.Author.Id);
userNick = message.Author.IsBot
userNick = message.Author.IsBot
? message.Author.Name
? message.Author.Name
: userMember?.Nick ?? message.Author.Name;
: userMember?.Nick ?? message.Author.Name;
<div class="chatlog__message-aside">
<svg class=chatlog__system-notification-icon><use href="#@message.Kind.ToString().ToDashCase().ToLowerInvariant()-icon"></use></svg>
</div>
<div class="chatlog__message-primary">
<div class="chatlog__header">
<div class="chatlog__header">
@{/* Author name */}
@{/* Author name */}
<span class="chatlog__author" style="@(userColor is not null ? $"color: rgb({userColor.Value.R}, {userColor.Value.G}, {userColor.Value.B})" : null)" title="@message.Author.FullName" data-user-id="@message.Author.Id">@userNick</span>
<span class="chatlog__author" style="@(userColor is not null ? $"color: rgb({userColor.Value.R}, {userColor.Value.G}, {userColor.Value.B})" : null)" title="@message.Author.FullName" data-user-id="@message.Author.Id">@userNick</span>
@{/* System message content */}
@{/* System notification content */}
@if(message.Kind == MessageKind.ChannelPinnedMessage)
@if(message.Kind == MessageKind.ChannelPinnedMessage)
{
{
<span class="chatlog__system-message "> pinned</span><span class="chatlog__system-message-reference-link chatlog__reference-link" onclick="scrollToMessage(event, @message.Reference.MessageId)"> a message</span><span class="chatlog__system-message"> to this channel.</span>
<span class="chatlog__system-notification "> pinned</span><span class="chatlog__system-message-reference-link chatlog__reference-link" onclick="scrollToMessage(event, ' @message.Reference? .MessageId' )"> a message</span><span class="chatlog__system-message"> to this channel.</span>
}
}
else
else
{
{
<span class="chatlog__system-message"> <!--wmm:ignore-->@Raw(FormatMarkdown(Char.ToLowerInvariant(message.Content[0]) + message.Content.Substring(1)))<!--/wmm:ignore--> </span>
<span class="chatlog__system-notification">@(char.ToLowerInvariant(message.Content[0]) + message.Content[1..]) </span>
}
}
@{/* Timestamp */}
@{/* Timestamp */}
<span class="chatlog__timestamp"><a href="#chatlog__message-container-@message.Id">@FormatDate(message.Timestamp)</a></span>
<span class="chatlog__timestamp"><a href="#chatlog__message-container-@message.Id">@FormatDate(message.Timestamp)</a></span>
</div>
</div>
</div>
}
// Regular message
else
{
<div class="chatlog__message-aside">
@if (isFirst)
{
// Reference symbol
if (message.Reference is not null)
{
<div class="chatlog__reference-symbol"></div>
}
// Avatar
<img class="chatlog__avatar" src="@await ResolveUrlAsync(message.Author.AvatarUrl)" alt="Avatar" loading="lazy">
}
}
else if (isFirst)
else
{
<div class="chatlog__short-timestamp" title="@FormatDate(message.Timestamp)">@message.Timestamp.ToLocalString("t")</div>
}
</div>
<div class="chatlog__message-primary">
@if (isFirst)
{
{
// Reference
// Reference
if (message.Reference is not null)
if (message.Reference is not null)
@ -167,8 +166,6 @@
}
}
@{/* Content */}
@{/* Content */}
@if (!isSystemMessage)
{
@if (!string.IsNullOrWhiteSpace(message.Content) || message.EditedTimestamp is not null)
@if (!string.IsNullOrWhiteSpace(message.Content) || message.EditedTimestamp is not null)
{
{
<div class="chatlog__content chatlog__markdown">
<div class="chatlog__content chatlog__markdown">
@ -185,7 +182,6 @@
}
}
</div>
</div>
}
}
}
@{/* Attachments */}
@{/* Attachments */}
@foreach (var attachment in message.Attachments)
@foreach (var attachment in message.Attachments)
@ -519,6 +515,7 @@
</div>
</div>
}
}
</div>
</div>
}
</div>
</div>
</div>
</div>
}
}