Removes smilies from existence. (kinda) (#5649)

This commit is contained in:
Moony
2021-12-02 18:49:19 -06:00
committed by GitHub
parent 393e4145cf
commit 4cd09c23f5
7 changed files with 138 additions and 1 deletions

View File

@@ -36,6 +36,7 @@ namespace Content.Server.Chat.Commands
return; return;
var chat = IoCManager.Resolve<IChatManager>(); var chat = IoCManager.Resolve<IChatManager>();
var chatSanitizer = IoCManager.Resolve<IChatSanitizationManager>();
var playerEntity = player.AttachedEntity; var playerEntity = player.AttachedEntity;
if (playerEntity == null) if (playerEntity == null)
@@ -62,7 +63,11 @@ namespace Content.Server.Chat.Commands
return; return;
} }
chat.EntitySay(mindComponent.OwnedEntity, message); var emote = chatSanitizer.TrySanitizeOutSmilies(message, mindComponent.OwnedEntity, out var sanitized, out var emoteStr);
if (sanitized.Length != 0)
chat.EntitySay(mindComponent.OwnedEntity, sanitized);
if (emote)
chat.EntityMe(mindComponent.OwnedEntity, emoteStr!);
} }
} }

View File

@@ -0,0 +1,97 @@
using System;
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" },
{ ":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" },
};
private bool doSanitize = false;
public void Initialize()
{
_configurationManager.OnValueChanged(CCVars.ChatSanitizerEnabled, x => doSanitize = x, true);
}
public bool TrySanitizeOutSmilies(string input, IEntity 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;
}
}

View File

@@ -0,0 +1,11 @@
using System.Diagnostics.CodeAnalysis;
using Robust.Shared.GameObjects;
namespace Content.Server.Chat.Managers;
public interface IChatSanitizationManager
{
public void Initialize();
public bool TrySanitizeOutSmilies(string input, IEntity speaker, out string sanitized, [NotNullWhen(true)] out string? emote);
}

View File

@@ -62,6 +62,7 @@ namespace Content.Server.Entry
_euiManager = IoCManager.Resolve<EuiManager>(); _euiManager = IoCManager.Resolve<EuiManager>();
_voteManager = IoCManager.Resolve<IVoteManager>(); _voteManager = IoCManager.Resolve<IVoteManager>();
IoCManager.Resolve<IChatSanitizationManager>().Initialize();
IoCManager.Resolve<IChatManager>().Initialize(); IoCManager.Resolve<IChatManager>().Initialize();
var playerManager = IoCManager.Resolve<IPlayerManager>(); var playerManager = IoCManager.Resolve<IPlayerManager>();

View File

@@ -34,6 +34,7 @@ namespace Content.Server.IoC
public static void Register() public static void Register()
{ {
IoCManager.Register<IChatManager, ChatManager>(); IoCManager.Register<IChatManager, ChatManager>();
IoCManager.Register<IChatSanitizationManager, ChatSanitizationManager>();
IoCManager.Register<IMoMMILink, MoMMILink>(); IoCManager.Register<IMoMMILink, MoMMILink>();
IoCManager.Register<ISandboxManager, SandboxManager>(); IoCManager.Register<ISandboxManager, SandboxManager>();
IoCManager.Register<IModuleManager, ServerModuleManager>(); IoCManager.Register<IModuleManager, ServerModuleManager>();

View File

@@ -553,6 +553,9 @@ namespace Content.Shared.CCVar
public static readonly CVarDef<int> ChatMaxMessageLength = public static readonly CVarDef<int> ChatMaxMessageLength =
CVarDef.Create("chat.max_message_length", 1000, CVar.SERVER | CVar.REPLICATED); CVarDef.Create("chat.max_message_length", 1000, CVar.SERVER | CVar.REPLICATED);
public static readonly CVarDef<bool> ChatSanitizerEnabled =
CVarDef.Create("chat.chat_sanitizer_enabled", true, CVar.SERVERONLY);
/* /*
* AFK * AFK
*/ */

View File

@@ -0,0 +1,19 @@
chatsan-smiles = smiles
chatsan-frowns = frowns
chatsan-smiles-widely = smiles widely
chatsan-frowns-deeply = frowns deeply
chatsan-surprised = looks surprised
chatsan-uncertain = looks uncertain
chatsan-grins = grins
chatsan-pouts = pouts
chatsan-laughs = laughs
chatsan-cries = cries
chatsan-smiles-smugly = smiles smugly
chatsan-annoyed = looks annoyed
chatsan-sighs = sighs
chatsan-stick-out-tongue = sticks { POSS-ADJ($ent) } tongue out
chatsan-wide-eyed = looks shocked
chatsan-surprised = looks surpised
chatsan-confused = looks confused
chatsan-unimpressed = seems unimpressed
chatsan-waves = waves