Fix Emote Chat Sanitizer (#32940)

* Fix bug?

* Fix :)

* aaaa

* AAAA!!!

* comment

* Nicer code

* What's a pull requestWhat's a pull request?
This commit is contained in:
Thomas
2024-10-24 00:10:13 -05:00
committed by GitHub
parent 79c35e0a41
commit d4da9923ea
3 changed files with 34 additions and 4 deletions

View File

@@ -35,7 +35,7 @@ public sealed class ChatSanitizationManager : IChatSanitizationManager
{ ":D", "chatsan-smiles-widely" }, { ":D", "chatsan-smiles-widely" },
{ "D:", "chatsan-frowns-deeply" }, { "D:", "chatsan-frowns-deeply" },
{ ":O", "chatsan-surprised" }, { ":O", "chatsan-surprised" },
{ ":3", "chatsan-smiles" }, //nope { ":3", "chatsan-smiles" },
{ ":S", "chatsan-uncertain" }, { ":S", "chatsan-uncertain" },
{ ":>", "chatsan-grins" }, { ":>", "chatsan-grins" },
{ ":<", "chatsan-pouts" }, { ":<", "chatsan-pouts" },

View File

@@ -746,8 +746,9 @@ public sealed partial class ChatSystem : SharedChatSystem
// ReSharper disable once InconsistentNaming // ReSharper disable once InconsistentNaming
private string SanitizeInGameICMessage(EntityUid source, string message, out string? emoteStr, bool capitalize = true, bool punctuate = false, bool capitalizeTheWordI = true) private string SanitizeInGameICMessage(EntityUid source, string message, out string? emoteStr, bool capitalize = true, bool punctuate = false, bool capitalizeTheWordI = true)
{ {
var newMessage = message.Trim(); var newMessage = SanitizeMessageReplaceWords(message.Trim());
newMessage = SanitizeMessageReplaceWords(newMessage);
GetRadioKeycodePrefix(source, newMessage, out newMessage, out var prefix);
// Sanitize it first as it might change the word order // Sanitize it first as it might change the word order
_sanitizer.TrySanitizeEmoteShorthands(newMessage, source, out newMessage, out emoteStr); _sanitizer.TrySanitizeEmoteShorthands(newMessage, source, out newMessage, out emoteStr);
@@ -759,7 +760,7 @@ public sealed partial class ChatSystem : SharedChatSystem
if (punctuate) if (punctuate)
newMessage = SanitizeMessagePeriod(newMessage); newMessage = SanitizeMessagePeriod(newMessage);
return newMessage; return prefix + newMessage;
} }
private string SanitizeInGameOOCMessage(string message) private string SanitizeInGameOOCMessage(string message)

View File

@@ -84,6 +84,35 @@ public abstract class SharedChatSystem : EntitySystem
return current ?? _prototypeManager.Index<SpeechVerbPrototype>(speech.SpeechVerb); return current ?? _prototypeManager.Index<SpeechVerbPrototype>(speech.SpeechVerb);
} }
/// <summary>
/// Splits the input message into a radio prefix part and the rest to preserve it during sanitization.
/// </summary>
/// <remarks>
/// This is primarily for the chat emote sanitizer, which can match against ":b" as an emote, which is a valid radio keycode.
/// </remarks>
public void GetRadioKeycodePrefix(EntityUid source,
string input,
out string output,
out string prefix)
{
prefix = string.Empty;
output = input;
// If the string is less than 2, then it's probably supposed to be an emote.
// No one is sending empty radio messages!
if (input.Length <= 2)
return;
if (!(input.StartsWith(RadioChannelPrefix) || input.StartsWith(RadioChannelAltPrefix)))
return;
if (!_keyCodes.TryGetValue(input[1], out _))
return;
prefix = input[..2];
output = input[2..];
}
/// <summary> /// <summary>
/// Attempts to resolve radio prefixes in chat messages (e.g., remove a leading ":e" and resolve the requested /// Attempts to resolve radio prefixes in chat messages (e.g., remove a leading ":e" and resolve the requested
/// channel. Returns true if a radio message was attempted, even if the channel is invalid. /// channel. Returns true if a radio message was attempted, even if the channel is invalid.