104 lines
3.4 KiB
C#
104 lines
3.4 KiB
C#
using System.Collections.Generic;
|
|
using System.Diagnostics.CodeAnalysis;
|
|
using System.Globalization;
|
|
using Content.Shared.CCVar;
|
|
using Robust.Shared.Configuration;
|
|
using Robust.Shared.GameObjects;
|
|
using Robust.Shared.IoC;
|
|
using Robust.Shared.Localization;
|
|
|
|
namespace Content.Server.Chat.Managers;
|
|
|
|
public class ChatSanitizationManager : IChatSanitizationManager
|
|
{
|
|
[Dependency] private IConfigurationManager _configurationManager = default!;
|
|
|
|
private static readonly Dictionary<string, string> SmileyToEmote = new()
|
|
{
|
|
// I could've done this with regex, but felt it wasn't the right idea.
|
|
{ ":)", "chatsan-smiles" },
|
|
{ ":]", "chatsan-smiles" },
|
|
{ "=)", "chatsan-smiles" },
|
|
{ "=]", "chatsan-smiles" },
|
|
{ "(:", "chatsan-smiles" },
|
|
{ "[:", "chatsan-smiles" },
|
|
{ "(=", "chatsan-smiles" },
|
|
{ "[=", "chatsan-smiles" },
|
|
{ ":(", "chatsan-frowns" },
|
|
{ ":[", "chatsan-frowns" },
|
|
{ "=(", "chatsan-frowns" },
|
|
{ "=[", "chatsan-frowns" },
|
|
{ "):", "chatsan-frowns" },
|
|
{ ")=", "chatsan-frowns" },
|
|
{ "]:", "chatsan-frowns" },
|
|
{ "]=", "chatsan-frowns" },
|
|
{ ":D", "chatsan-smiles-widely" },
|
|
{ "D:", "chatsan-frowns-deeply" },
|
|
{ ":O", "chatsan-surprised" },
|
|
{ ":3", "chatsan-smiles" }, //nope
|
|
{ ":S", "chatsan-uncertain" },
|
|
{ ":>", "chatsan-grins" },
|
|
{ ":<", "chatsan-pouts" },
|
|
{ "xD", "chatsan-laughs" },
|
|
{ ";-;", "chatsan-cries" },
|
|
{ ";_;", "chatsan-cries" },
|
|
{ "qwq", "chatsan-cries" },
|
|
{ ":u", "chatsan-smiles-smugly" },
|
|
{ ":v", "chatsan-smiles-smugly" },
|
|
{ ">:i", "chatsan-annoyed" },
|
|
{ ":i", "chatsan-sighs" },
|
|
{ ":|", "chatsan-sighs" },
|
|
{ ":p", "chatsan-stick-out-tongue" },
|
|
{ ":b", "chatsan-stick-out-tongue" },
|
|
{ "0-0", "chatsan-wide-eyed" },
|
|
{ "o-o", "chatsan-wide-eyed" },
|
|
{ "o.o", "chatsan-wide-eyed" },
|
|
{ "._.", "chatsan-surprised" },
|
|
{ ".-.", "chatsan-confused" },
|
|
{ "-_-", "chatsan-unimpressed" },
|
|
{ "o/", "chatsan-waves" },
|
|
{ "^^/", "chatsan-waves" },
|
|
{ ":/", "chatsan-uncertain" },
|
|
{ ":\\", "chatsan-uncertain" },
|
|
{ "lmao", "chatsan-laughs" },
|
|
{ "lol", "chatsan-laughs" },
|
|
{ "lel", "chatsan-laughs" },
|
|
{ "kek", "chatsan-laughs" },
|
|
{ "o7", "chatsan-salutes" },
|
|
{ "idk", "chatsan-shrugs" }
|
|
};
|
|
|
|
private bool doSanitize = false;
|
|
|
|
public void Initialize()
|
|
{
|
|
_configurationManager.OnValueChanged(CCVars.ChatSanitizerEnabled, x => doSanitize = x, true);
|
|
}
|
|
|
|
public bool TrySanitizeOutSmilies(string input, EntityUid speaker, out string sanitized, [NotNullWhen(true)] out string? emote)
|
|
{
|
|
if (!doSanitize)
|
|
{
|
|
sanitized = input;
|
|
emote = null;
|
|
return false;
|
|
}
|
|
|
|
input = input.TrimEnd();
|
|
|
|
foreach (var (smiley, replacement) in SmileyToEmote)
|
|
{
|
|
if (input.EndsWith(smiley, true, CultureInfo.InvariantCulture))
|
|
{
|
|
sanitized = input.Remove(input.Length - smiley.Length).TrimEnd();
|
|
emote = Loc.GetString(replacement, ("ent", speaker));
|
|
return true;
|
|
}
|
|
}
|
|
|
|
sanitized = input;
|
|
emote = null;
|
|
return false;
|
|
}
|
|
}
|