using Dalamud.Configuration; using Dalamud.Plugin; using Newtonsoft.Json; using System; using System.Collections.Generic; using System.Linq; using System.Text.RegularExpressions; using NoSoliciting.Ml; namespace NoSoliciting { [Serializable] public class PluginConfiguration : IPluginConfiguration { public static readonly PluginConfiguration Default = new(); private DalamudPluginInterface Interface { get; set; } = null!; public int Version { get; set; } = 1; [Obsolete("Use FilterStatus")] public bool FilterChat { get; set; } = true; [Obsolete("Use FilterStatus")] public bool FilterFCRecruitments { get; set; } = false; [Obsolete("Use FilterStatus")] public bool FilterChatRPAds { get; set; } = false; [Obsolete("Use FilterStatus")] public bool FilterPartyFinder { get; set; } = true; [Obsolete("Use FilterStatus")] public bool FilterPartyFinderRPAds { get; set; } = false; public Dictionary FilterStatus { get; private set; } = new(); public bool AdvancedMode { get; set; } public bool CustomChatFilter { get; set; } public List ChatSubstrings { get; } = new(); public List ChatRegexes { get; } = new(); [JsonIgnore] public List CompiledChatRegexes { get; private set; } = new(); public bool CustomPFFilter { get; set; } public List PFSubstrings { get; } = new(); public List PFRegexes { get; } = new(); [JsonIgnore] public List CompiledPFRegexes { get; private set; } = new(); public bool FilterHugeItemLevelPFs { get; set; } public bool UseMachineLearning { get; set; } = true; public HashSet BasicMlFilters { get; set; } = new() { MessageCategory.RmtGil, MessageCategory.RmtContent, MessageCategory.Phishing, }; public Dictionary> MlFilters { get; set; } = new() { [MessageCategory.RmtGil] = new HashSet { ChatType.Say, }, [MessageCategory.RmtContent] = new HashSet { ChatType.None, }, [MessageCategory.Phishing] = new HashSet { ChatType.TellIncoming, }, [MessageCategory.Roleplaying] = new HashSet { ChatType.None, ChatType.Shout, ChatType.Yell, }, [MessageCategory.FreeCompany] = new HashSet { ChatType.None, ChatType.Shout, ChatType.Yell, ChatType.TellIncoming, }, [MessageCategory.Static] = new HashSet { ChatType.None, }, [MessageCategory.Trade] = new HashSet { ChatType.None, }, [MessageCategory.Community] = new HashSet { ChatType.None, }, }; public bool LogFilteredPfs { get; set; } = true; public bool LogFilteredChat { get; set; } = true; public bool ConsiderPrivatePfs { get; set; } public void Initialise(DalamudPluginInterface pi) { this.Interface = pi; this.CompileRegexes(); } public void Save() { this.Interface.SavePluginConfig(this); } public void CompileRegexes() { this.CompiledChatRegexes = this.ChatRegexes .Select(reg => new Regex(reg, RegexOptions.Compiled)) .ToList(); this.CompiledPFRegexes = this.PFRegexes .Select(reg => new Regex(reg, RegexOptions.Compiled)) .ToList(); } internal bool MlEnabledOn(MessageCategory category, ChatType chatType) { HashSet filtered; if (this.AdvancedMode) { if (!this.MlFilters.TryGetValue(category, out filtered)) { return false; } } else { // check to see if the user has this category filtered if (!this.BasicMlFilters.Contains(category)) { return false; } // get the chat types that this category is enabled on by default if (!Default.MlFilters.TryGetValue(category, out filtered)) { return false; } } return filtered.Contains(chatType); } } }