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 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 _censors = new(); public void With(IChatCensor censor) { _censors.Add(censor); } /// /// Builds a ChatCensor that combines all the censors that have been added to this. /// public IChatCensor Build() { return new CompoundChatCensor(_censors.ToArray()); } /// /// Resets the build state to zero, allowing for different rules to be provided to the next censor(s) built. /// /// True if the builder had any setup prior to the reset. public bool Reset() { var notEmpty = _censors.Count > 0; _censors = new List(); return notEmpty; } }