fix: add support for unicode emojis

This commit is contained in:
Oliver Booth 2023-08-27 21:24:28 +01:00
parent 1644b701ba
commit 67a5f9777a
Signed by: oliverbooth
GPG Key ID: B89D139977693FED
1 changed files with 22 additions and 4 deletions

View File

@ -96,6 +96,9 @@ internal sealed class DiscordMessageService : BackgroundService, IDiscordMessage
SanitizeContent(guild, message.Content, ref builder); SanitizeContent(guild, message.Content, ref builder);
var content = builder.ToString(); var content = builder.ToString();
Span<byte> testSpan = stackalloc byte[Utf8Encoding.GetByteCount(content)];
Utf8Encoding.GetBytes(content, testSpan);
_logger.LogInformation("Message by {Author}: {Content}", author, content); _logger.LogInformation("Message by {Author}: {Content}", author, content);
var messages = new List<RelayedMessage>(); var messages = new List<RelayedMessage>();
@ -141,14 +144,16 @@ internal sealed class DiscordMessageService : BackgroundService, IDiscordMessage
private static void AddMessage(ICollection<RelayedMessage> messages, string displayName, string content) private static void AddMessage(ICollection<RelayedMessage> messages, string displayName, string content)
{ {
Span<byte> buffer = stackalloc byte[255]; // VP message length limit
int byteCount = Utf8Encoding.GetByteCount(content); int byteCount = Utf8Encoding.GetByteCount(content);
Span<byte> buffer = stackalloc byte[byteCount];
Utf8Encoding.GetBytes(content, buffer);
var offset = 0; var offset = 0;
while (offset < byteCount) while (offset < byteCount)
{ {
int length = Math.Min(byteCount - offset, 255); int length = Math.Min(byteCount - offset, 255); // VP message length limit
Utf8Encoding.GetBytes(content.AsSpan(offset, length), buffer); Span<byte> slice = buffer.Slice(offset, length);
messages.Add(new RelayedMessage(displayName, Utf8Encoding.GetString(buffer), false)); messages.Add(new RelayedMessage(displayName, Utf8Encoding.GetString(slice), false));
offset += length; offset += length;
} }
} }
@ -199,6 +204,8 @@ internal sealed class DiscordMessageService : BackgroundService, IDiscordMessage
{ {
Utf8ValueStringBuilder wordBuffer = ZString.CreateUtf8StringBuilder(); Utf8ValueStringBuilder wordBuffer = ZString.CreateUtf8StringBuilder();
Span<char> chars = stackalloc char[2];
Span<byte> bytes = stackalloc byte[4];
for (var index = 0; index < content.Length; index++) for (var index = 0; index < content.Length; index++)
{ {
char current = content[index]; char current = content[index];
@ -207,6 +214,13 @@ internal sealed class DiscordMessageService : BackgroundService, IDiscordMessage
AddWord(guild, ref builder, ref wordBuffer, current); AddWord(guild, ref builder, ref wordBuffer, current);
wordBuffer.Clear(); wordBuffer.Clear();
} }
else if (char.IsSurrogate(current))
{
content.Slice(index++, 2).CopyTo(chars);
int byteCount = Utf8Encoding.GetByteCount(chars);
Utf8Encoding.GetBytes(chars, bytes);
wordBuffer.AppendLiteral(bytes[..byteCount]);
}
else else
{ {
wordBuffer.Append(current); wordBuffer.Append(current);
@ -256,6 +270,10 @@ internal sealed class DiscordMessageService : BackgroundService, IDiscordMessage
MentionUtility.ParseTag(guild, temp[..tagLength], ref builder, whitespace); MentionUtility.ParseTag(guild, temp[..tagLength], ref builder, whitespace);
break; break;
case var _ when char.IsSurrogate(current):
buffer.Append(chars.Slice(index++, 2));
break;
default: default:
buffer.Append(current); buffer.Append(current);
break; break;