Files
tbd-station-14/Content.Shared/Chat/V2/Moderation/ChatCensor.cs
Hannah Giovanna Dawson bf98a6a8bb SS14-17313 Chatfactor: Chat Censorship Systems (#25908)
* SS14-17313 Chat Censorship Systems

Adds some systems to manage chat censorship:

1. No-op: does nothing
2. SimpleCensor: a regex-free censor with a variety of rules to use
3. RegexCensor: a censor that uses regex.

This exposes a singleton backed by a builder pattern (ChatCensor) that
is set up, probably during the code init phase, and then globally available
for your censorship needs.

* Migrate to Shared

* Add a reset function to the builder.

* Resolve PJB's feedback; add unit tests
2024-03-26 10:50:20 +11:00

60 lines
1.4 KiB
C#

using System.Linq;
namespace Content.Shared.Chat.V2.Moderation;
public interface IChatCensor
{
public bool Censor(string input, out string output, char replaceWith = '*');
}
public sealed class CompoundChatCensor(IEnumerable<IChatCensor> censors) : IChatCensor
{
public bool Censor(string input, out string output, char replaceWith = '*')
{
var censored = false;
foreach (var censor in censors)
{
if (censor.Censor(input, out output, replaceWith))
{
censored = true;
}
}
output = input;
return censored;
}
}
public sealed class ChatCensorFactory
{
private List<IChatCensor> _censors = new();
public void With(IChatCensor censor)
{
_censors.Add(censor);
}
/// <summary>
/// Builds a ChatCensor that combines all the censors that have been added to this.
/// </summary>
public IChatCensor Build()
{
return new CompoundChatCensor(_censors.ToArray());
}
/// <summary>
/// Resets the build state to zero, allowing for different rules to be provided to the next censor(s) built.
/// </summary>
/// <returns>True if the builder had any setup prior to the reset.</returns>
public bool Reset()
{
var notEmpty = _censors.Count > 0;
_censors = new List<IChatCensor>();
return notEmpty;
}
}