using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Linq;
using System.Reflection;
using System.Runtime.CompilerServices;
using System.Runtime.Versioning;
using System.Security;
using System.Security.Permissions;
using BepInEx;
using BepInEx.Core.Logging.Interpolation;
using BepInEx.Logging;
using BepInEx.Unity.IL2CPP;
using CensorForge.Core;
using CensorForge.WordListSources;
using HarmonyLib;
using Microsoft.CodeAnalysis;
using ProjectM;
[assembly: CompilationRelaxations(8)]
[assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)]
[assembly: Debuggable(DebuggableAttribute.DebuggingModes.Default | DebuggableAttribute.DebuggingModes.DisableOptimizations | DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints | DebuggableAttribute.DebuggingModes.EnableEditAndContinue)]
[assembly: TargetFramework(".NETCoreApp,Version=v6.0", FrameworkDisplayName = ".NET 6.0")]
[assembly: AssemblyCompany("CensorForge")]
[assembly: AssemblyConfiguration("Debug")]
[assembly: AssemblyDescription("Censors name on character creation.")]
[assembly: AssemblyFileVersion("0.1.10.0")]
[assembly: AssemblyInformationalVersion("0.1.10+1.Branch.main.Sha.c33d0879382e1a0da34861ec55914ba7e637a80e")]
[assembly: AssemblyProduct("CensorForge")]
[assembly: AssemblyTitle("CensorForge")]
[assembly: SecurityPermission(SecurityAction.RequestMinimum, SkipVerification = true)]
[assembly: AssemblyVersion("0.1.10.0")]
[module: UnverifiableCode]
[module: RefSafetyRules(11)]
namespace Microsoft.CodeAnalysis
{
[CompilerGenerated]
[Microsoft.CodeAnalysis.Embedded]
internal sealed class EmbeddedAttribute : Attribute
{
}
}
namespace System.Runtime.CompilerServices
{
[CompilerGenerated]
[Microsoft.CodeAnalysis.Embedded]
[AttributeUsage(AttributeTargets.Module, AllowMultiple = false, Inherited = false)]
internal sealed class RefSafetyRulesAttribute : Attribute
{
public readonly int Version;
public RefSafetyRulesAttribute(int P_0)
{
Version = P_0;
}
}
}
namespace CensorForge
{
[BepInPlugin("CensorForge", "CensorForge", "0.1.10")]
public class Plugin : BasePlugin
{
private Harmony _harmony;
internal static Plugin Instance { get; private set; }
public override void Load()
{
//IL_0014: Unknown result type (might be due to invalid IL or missing references)
//IL_001a: Expected O, but got Unknown
//IL_0080: Unknown result type (might be due to invalid IL or missing references)
//IL_0086: Expected O, but got Unknown
Instance = this;
ManualLogSource log = ((BasePlugin)this).Log;
bool flag = default(bool);
BepInExInfoLogInterpolatedStringHandler val = new BepInExInfoLogInterpolatedStringHandler(23, 2, ref flag);
if (flag)
{
((BepInExLogInterpolatedStringHandler)val).AppendLiteral("Plugin ");
((BepInExLogInterpolatedStringHandler)val).AppendFormatted<string>("CensorForge");
((BepInExLogInterpolatedStringHandler)val).AppendLiteral(" (v");
((BepInExLogInterpolatedStringHandler)val).AppendFormatted<string>("0.1.10");
((BepInExLogInterpolatedStringHandler)val).AppendLiteral(") is loading!");
}
log.LogInfo(val);
CensorRules.Initialize(((BasePlugin)this).Log);
ApplyHarmonyPatches();
ManualLogSource log2 = ((BasePlugin)this).Log;
val = new BepInExInfoLogInterpolatedStringHandler(37, 1, ref flag);
if (flag)
{
((BepInExLogInterpolatedStringHandler)val).AppendLiteral("Plugin ");
((BepInExLogInterpolatedStringHandler)val).AppendFormatted<string>("CensorForge");
((BepInExLogInterpolatedStringHandler)val).AppendLiteral(" has been loaded successfully!");
}
log2.LogInfo(val);
}
private void ApplyHarmonyPatches()
{
//IL_0045: Unknown result type (might be due to invalid IL or missing references)
//IL_004b: Expected O, but got Unknown
//IL_0008: Unknown result type (might be due to invalid IL or missing references)
//IL_0012: Expected O, but got Unknown
try
{
_harmony = new Harmony("CensorForge");
_harmony.PatchAll(Assembly.GetExecutingAssembly());
((BasePlugin)this).Log.LogInfo((object)"Harmony patches applied successfully.");
}
catch (Exception ex)
{
ManualLogSource log = ((BasePlugin)this).Log;
bool flag = default(bool);
BepInExErrorLogInterpolatedStringHandler val = new BepInExErrorLogInterpolatedStringHandler(32, 1, ref flag);
if (flag)
{
((BepInExLogInterpolatedStringHandler)val).AppendLiteral("Error applying Harmony patches: ");
((BepInExLogInterpolatedStringHandler)val).AppendFormatted<string>(ex.ToString());
}
log.LogError(val);
}
}
public override bool Unload()
{
//IL_003e: Unknown result type (might be due to invalid IL or missing references)
//IL_0044: Expected O, but got Unknown
if (_harmony != null)
{
try
{
_harmony.UnpatchSelf();
((BasePlugin)this).Log.LogInfo((object)"Harmony patches removed successfully.");
}
catch (Exception ex)
{
ManualLogSource log = ((BasePlugin)this).Log;
bool flag = default(bool);
BepInExErrorLogInterpolatedStringHandler val = new BepInExErrorLogInterpolatedStringHandler(32, 1, ref flag);
if (flag)
{
((BepInExLogInterpolatedStringHandler)val).AppendLiteral("Error removing Harmony patches: ");
((BepInExLogInterpolatedStringHandler)val).AppendFormatted<string>(ex.ToString());
}
log.LogError(val);
}
}
return true;
}
}
public static class MyPluginInfo
{
public const string PLUGIN_GUID = "CensorForge";
public const string PLUGIN_NAME = "CensorForge";
public const string PLUGIN_VERSION = "0.1.10";
}
}
namespace CensorForge.WordListSources
{
public static class EnglishWords
{
public static readonly string Data = "\r\n\r\n2g1c\r\n2girls1cup\r\nacrotomophilia\r\nalabamahotpocket\r\nalaskanpipeline\r\nanal\r\nanilingus\r\nanus\r\napeshit\r\narsehole\r\nass\r\nasshole\r\nassmunch\r\nauto erotic\r\nautoerotic\r\nbabeland\r\nbabybatter\r\nbabyjuice\r\nballgag\r\nballgravy\r\nballkicking\r\nballlicking\r\nballsack\r\nballsucking\r\nbangbros\r\nbangbus\r\nbareback\r\nbarely legal\r\nbarenaked\r\nbastard\r\nbastardo\r\nbastinado\r\nbbw\r\nbdsm\r\nbeaner\r\nbeaners\r\nbeavercleaver\r\nbeaverlips\r\nbeastiality\r\nbestiality\r\nbigblack\r\nbigbreasts\r\nbigknockers\r\nbigtits\r\nbimbos\r\nbirdlock\r\nbitch\r\nbitches\r\nblackcock\r\nblondeaction\r\nblowjob\r\nblowjob\r\nblowyourload\r\nbluewaffle\r\nblumpkin\r\nbollocks\r\nbondage\r\nboner\r\nboob\r\nboobs\r\nbootycall\r\nbrownshowers\r\nbrunetteaction\r\nbukkake\r\nbulldyke\r\nbullet vibe\r\nbullshit\r\nbungholes\r\nbunghole\r\nbutt\r\nbuttcheeks\r\nbutthole\r\ncameltoe\r\ncamgirl\r\ncamslut\r\ncamwhore\r\ncarpet muncher\r\ncarpetmuncher\r\nchocolaterosebuds\r\ncialis\r\ncirclejerk\r\nclevelandsteamer\r\ncunthole\r\ncuntlick\r\ncuntlick \r\ncuntlicker\r\ncuntlicker \r\ncuntlicking\r\ncuntlicking \r\nclit\r\nclitoris\r\ncloverclamps\r\nclusterfuck\r\ncock\r\ncocks\r\ncoprolagnia\r\ncoprophilia\r\ncornhole\r\ncoon\r\ncoons\r\ncreampie\r\ncum\r\ncumming\r\ncumshot\r\ncumshots\r\ncunnilingus\r\ncunt\r\ndarkie\r\ndaterape\r\ndaterape\r\ndeepthroat\r\ndeepthroat\r\ndendrophilia\r\ndick\r\ndildo\r\ndingleberry\r\ndingleberries\r\ndirtypillows\r\ndirtysanchez\r\ndoggiestyle\r\ndoggiestyle\r\ndoggystyles\r\ndoggystyle\r\ndogstyle\r\ndolcett\r\ndomination\r\ndominatrix\r\ndommes\r\ndonkey punch\r\ndouble dong\r\ndouble penetration\r\ndpaction\r\ndryhump\r\ndvda\r\neatmyass\r\necchi\r\nejaculation\r\nerotic\r\nerotism\r\nescort\r\neunuch\r\nfag\r\nfaggot\r\nfecal\r\nfelch\r\nfellatio\r\nfeltch\r\nfemalesquirting\r\nfemdom\r\nfigging\r\nfingerbang\r\nfingering\r\nfisting\r\nfootfetish\r\nfootjob\r\nfrotting\r\nfuck\r\nfuckbuttons\r\nfuckin\r\nfucking\r\nfucktards\r\nfudge packer\r\nfudgepacker\r\nfutanari\r\ngangbang\r\ngang bang\r\ngay sex\r\ngenitals\r\ngiantcock\r\ngirlontop\r\ngirlsgonewild\r\ngoatcx\r\ngoatse\r\ngod damn\r\ngokkun\r\ngolden shower\r\ngoodpoop\r\ngoogirl\r\ngoregasm\r\ngrope\r\ngroupsex\r\ngspot\r\ngspot\r\nguro\r\nhand job\r\nhandjob\r\nhard core\r\nhardcore\r\nhentai\r\nhomoerotic\r\nhonkey\r\nhooker\r\nhorny\r\nhotcarl\r\nhotchick\r\nhowtokill\r\nhowtomurder\r\nhugefat\r\nhumping\r\nincest\r\nintercourse\r\njackoff\r\njackoff\r\njailbait\r\njailbait\r\njailbait\r\njerk off\r\njigaboo\r\njiggaboo\r\njiggerboo\r\njizz\r\njuggs\r\nkike\r\nkinbaku\r\nkinkster\r\nkinky\r\nknobbing\r\nleatherrestraint\r\nleatherstraightjacket\r\nlemon party\r\nlivesex\r\nlolita\r\nlovemaking\r\nmakemecome\r\nmakemecum\r\nmalesquirting\r\nmasturbate\r\nmasturbating\r\nmasturbation\r\nmenageatrois\r\nmilf\r\nmissionaryposition\r\nmong\r\nmotherfucker\r\nmothafuck\r\nmothafucka\r\nmothafuckas\r\nmothafuckaz\r\nmothafucked \r\nmothafucker\r\nmothafuckers\r\nmothafuckin\r\nmothafucking \r\nmothafuckings\r\nmothafucks\r\nmotherfuckerss\r\nmotherfuck\r\nmotherfucked\r\nmotherfucker\r\nmotherfuckers\r\nmotherfuckin\r\nmotherfucking\r\nmotherfuckings\r\nmotherfuckka\r\nmotherfucks\r\nmoundofvenus\r\nmrhands\r\nmuffdiver\r\nmuffdiving\r\nnambla\r\nnawashi\r\nnegro\r\nneonazi\r\nnigga\r\nnigga1234\r\nnigga123\r\nnigga123456\r\nnigger12345\r\nniggerz\r\nniggalicker\r\nniggafuckme\r\nniggabitchass\r\nnigger\r\nnignog\r\nnimphomania\r\nnipple\r\nni99a\r\nnikka \r\nnigg\r\nnigg3r\r\nnigg4h\r\nnigga\r\nniggah\r\nniggas\r\nniggaz\r\nnigger\r\nnipples\r\nnsfw\r\nnsfwimages\r\nnude\r\nnudity\r\nnutten\r\nnympho\r\nnymphomania\r\noctopussy\r\nomorashi\r\nonecuptwogirls\r\noneguyonejar\r\norgasm\r\norgy\r\npaedophile\r\npaki\r\npanties\r\npanty\r\npedobear\r\npedophile\r\npegging\r\npenis\r\nphonesex\r\npieceofshit\r\npikey\r\npissing\r\npisspig\r\npisspig\r\nplayboy\r\npleasurechest\r\npolesmoker\r\nponyplay\r\npoof\r\npoon\r\npoontang\r\npunany\r\npoopchute\r\npoopchute\r\nporn\r\nporno\r\npornography\r\nprincealbertpiercing\r\npthc\r\npubes\r\npussy\r\nqueaf\r\nqueef\r\nquim\r\nraghead\r\nragingboner\r\nrape\r\nraping\r\nrapist\r\nrectum\r\nreversecowgirl\r\nrimjob\r\nrimming\r\nrosypalm\r\nrosypalmandher5sisters\r\nrusty trombone\r\nsadism\r\nsantorum\r\nscat\r\nschlong\r\nscissoring\r\nsemen\r\nsex\r\nsexcam\r\nsexo\r\nsexy\r\nsexual\r\nsexually\r\nsexuality\r\nshavedbeaver\r\nshavedpussy\r\nshit-ass\r\nshit-bag\r\nshit-bagger\r\nshit-brain\r\nshit-breath\r\nshit-cunt\r\nshit-dick\r\nshit-eating\r\nshit-face\r\nshit-faced\r\nshit-fit\r\nshit-head\r\nshit-heel\r\nshit-hole\r\nshit-house\r\nshit-load\r\nshit-pot\r\nshit-spitter\r\nshit-stain\r\nshemale\r\nshibari\r\nshit\r\nshitblimp\r\nshitty\r\nshota\r\nshrimping\r\nskeet\r\nslanteye\r\nslut\r\ns&m\r\nsmut\r\nsnatch\r\nsnowballing\r\nsodomize\r\nsodomy\r\nspastic\r\nspic\r\nsplooge\r\nsploogemoose\r\nspooge\r\nspreadlegs\r\nspunk\r\nstrapon\r\nstrapon\r\nstrappado\r\nstripclub\r\nstyledoggy\r\nsuck\r\nsucks\r\nsuicidegirls\r\nsultrywomen\r\nswastika\r\nswinger\r\ns_h_i_t\r\nsh!+\r\nsh!t\r\nsh1t\r\nshi+\r\nshibari\r\nshit\r\nshit-ass\r\nshit-bag\r\nshit-bagger\r\nshit-brain\r\nshit-breath\r\nshit-cunt\r\nshit-dick\r\nshit-eating\r\nshit-face\r\nshit-faced\r\nshit-fit\r\nshit-head\r\nshit-heel\r\nshit-hole\r\nshit-house\r\nshit-load\r\nshit-pot\r\nshit-spitter\r\nshit-stain\r\ntaintedlove\r\ntastemy\r\nteabagging\r\nthreesome\r\nthroating\r\nthumbzilla\r\nthundercunt\r\ntiedup\r\ntightwhite\r\ntit\r\ntits\r\ntitties\r\ntitty\r\ntongueinass\r\ntopless\r\ntosser\r\ntowelhead\r\ntranny\r\ntribadism\r\ntubgirl\r\ntubgirl\r\ntushy\r\ntwat\r\ntwink\r\ntwinkie\r\ntwogirlsonecup\r\nundressing\r\nupskirt\r\nurethra play\r\nurophilia\r\nvagina\r\nv14gra\r\nv1gra\r\nvenusmound\r\nviagra\r\nvibrator\r\nvioletwand\r\nvorarephilia\r\nvoyeur\r\nvoyeurweb\r\nvoyuer\r\nvulva\r\nwank\r\nwanker\r\nwetback\r\nwetdream\r\nwhitepower\r\nwhore\r\nworldsex\r\nwrappingmen\r\nwrinkledstarfish\r\nyaoi\r\nyellowshowers\r\nyiffy\r\nzoophilia\r\n";
}
public static class FrenchWords
{
public static readonly string Data = "\r\nbaiser\r\nbander\r\nbigornette\r\nbite\r\nbitte\r\nbloblos\r\nbordel\r\nbourré\r\nbourrée\r\nbrackmard\r\nbranlage\r\nbranler\r\nbranlette\r\nbranleur\r\nbranleuse\r\nbrouter le cresson\r\ncaca\r\nchatte\r\nchiasse\r\nchier\r\nchiottes\r\nclito\r\nclitoris\r\ncon\r\nconnard\r\nconnasse\r\nconne\r\ncouilles\r\ncramouille\r\ncul\r\ndéconne\r\ndéconner\r\nemmerdant\r\nemmerder\r\nemmerdeur\r\nemmerdeuse\r\nenculé\r\nenculée\r\nenculeur\r\nenculeurs\r\nenfoiré\r\nenfoirée\r\nétron\r\nfille de pute\r\nfils de pute\r\nfolle\r\nfoutre\r\ngerbe\r\ngerber\r\ngouine\r\ngrande folle\r\ngrogniasse\r\ngueule\r\njouir\r\nla putain de ta mère\r\nMALPT\r\nménage à trois\r\nmerde\r\nmerdeuse\r\nmerdeux\r\nmeuf\r\nnègre\r\nnegro\r\nnique ta mère\r\nnique ta race\r\npalucher\r\npédale\r\npédé\r\npéter\r\npipi\r\npisser\r\npouffiasse\r\npousse-crotte\r\nputain\r\npute\r\nramoner\r\nsacàfoutre\r\nsacàmerde\r\nsalaud\r\nsalope\r\nsuce\r\ntapette\r\ntanche\r\nteuch\r\ntringler\r\ntrique\r\ntroncher\r\ntrou du cul\r\nturlute\r\nzigounette\r\nzizi\r\n";
}
public static class RussianWords
{
public static readonly string Data = "\r\nbychara\r\nbyk\r\nchernozhopyi\r\ndolboy'eb\r\nebalnik\r\nebalo\r\nebalom sch'elkat\r\ngol\r\nmudack\r\nopizdenet\r\nosto'eblo\r\nostokhuitel'no\r\not'ebis\r\notmudohat\r\notpizdit\r\notsosi\r\npadlo\r\npedik\r\nperdet\r\npetuh\r\npidargnoinyj\r\npizda\r\npizdato\r\npizdatyi\r\npiz'det\r\npizdetc\r\npizdoinakryt'sja\r\npizd'uk\r\npiz`dyulina\r\npodi ku'evo\r\npoeben\r\npo'imat'nakonchik\r\npo'iti posrat\r\npo khuy\r\npoluchitpizdy\r\npososimoyukonfetku\r\nprissat\r\nproebat\r\npromudobl'adsksya pizdopro'ebina\r\npropezdoloch\r\nprosrat\r\nraspeezdeyi\r\nraspizdatyi\r\nraz'yebuy\r\nraz'yoba\r\ns'ebat'sya\r\nshalava\r\nstyervo\r\nsukin syn\r\nsvodit posrat\r\nsvoloch\r\ntrakhat'sya\r\ntrimandoblydskiy pizdoproyob\r\nubl'yudok\r\nuboy\r\nu'ebitsche\r\nvafl'a\r\nvafli lovit\r\nv pizdu\r\nvyperdysh\r\nvzdrochennyi\r\nyeb vas\r\nza'ebat\r\nzaebis\r\nzalupa\r\nzalupat\r\nzasranetc\r\nzassat\r\nzlo'ebuchy\r\nбздёнок\r\nблядки\r\nблядовать\r\nблядство\r\nблядь\r\nбугор\r\nвопизду\r\nвстатьраком\r\nвыёбываться\r\nгандон\r\nговно\r\nговнюк\r\nголый\r\nдатьпизды\r\nдерьмо\r\nдрочить\r\nдругойдразнится\r\nёбарь\r\nебать\r\nебать-копать\r\nебло\r\nебнуть\r\nёбтвоюмать\r\nжопа\r\nжополиз\r\nигратьнакожанойфлейте\r\nизмудохать\r\nкаждыйдрочиткаконхочет\r\nкакаяразница\r\nкакдвапальцаобоссать\r\nкуритемоютрубку\r\nлысоговкулакегонять\r\nмалофья\r\nманда\r\nмандавошка\r\nмент\r\nмуда\r\nмудило\r\nмудозвон\r\nнаебать\r\nнаебениться\r\nнаебнуться\r\nнафиг\r\nнахуй\r\nнахуювертеть\r\nнахуя\r\nнахуячиться\r\nневебенный\r\nнеебет\r\nнизахуйсобачу\r\nнихуя\r\nобнаженный\r\nобоссаться можно\r\nодинебётся\r\nопесдол\r\nофигеть\r\nохуеть\r\nохуительно\r\nполовоесношение\r\nсекс\r\nсиськи\r\nспиздить\r\nсрать\r\nссать\r\nтраxать\r\nтымневанькуневаляй\r\nфига\r\nхапать\r\nхерсней\r\nхерсним\r\nхохол\r\nхрен\r\nхуёво\r\nхуёвый\r\nхуемгрушиоколачивать\r\nхуеплет\r\nхуило\r\nхуинейстрадать\r\nхуиня\r\nхуй\r\nхуйнуть\r\nхуйпинать\r\n";
}
}
namespace CensorForge.Patches
{
[HarmonyPatch]
public static class CharacterNameValidationPatches
{
[HarmonyPatch(typeof(HandleCreateCharacterEventSystem), "GetIsNameValid")]
[HarmonyPrefix]
public static bool GetIsNameValid_Prefix(string characterNameString, ref CreateCharacterFailureReason invalidReason, ref bool __result)
{
//IL_00d5: Unknown result type (might be due to invalid IL or missing references)
//IL_00dc: Expected O, but got Unknown
//IL_0084: Unknown result type (might be due to invalid IL or missing references)
//IL_008b: Expected O, but got Unknown
//IL_001f: Unknown result type (might be due to invalid IL or missing references)
//IL_0025: Expected O, but got Unknown
bool flag = default(bool);
try
{
if (CensorRules.IsNameExactlyForbidden(characterNameString, out var foundForbiddenWord))
{
ManualLogSource log = ((BasePlugin)Plugin.Instance).Log;
BepInExWarningLogInterpolatedStringHandler val = new BepInExWarningLogInterpolatedStringHandler(81, 2, ref flag);
if (flag)
{
((BepInExLogInterpolatedStringHandler)val).AppendLiteral("Character name '");
((BepInExLogInterpolatedStringHandler)val).AppendFormatted<string>(characterNameString);
((BepInExLogInterpolatedStringHandler)val).AppendLiteral("' is an EXACT match for the forbidden word '");
((BepInExLogInterpolatedStringHandler)val).AppendFormatted<string>(foundForbiddenWord);
((BepInExLogInterpolatedStringHandler)val).AppendLiteral("'. Blocking creation.");
}
log.LogWarning(val);
invalidReason = (CreateCharacterFailureReason)1;
__result = false;
return false;
}
ManualLogSource log2 = ((BasePlugin)Plugin.Instance).Log;
BepInExInfoLogInterpolatedStringHandler val2 = new BepInExInfoLogInterpolatedStringHandler(105, 1, ref flag);
if (flag)
{
((BepInExLogInterpolatedStringHandler)val2).AppendLiteral("Character name '");
((BepInExLogInterpolatedStringHandler)val2).AppendFormatted<string>(characterNameString);
((BepInExLogInterpolatedStringHandler)val2).AppendLiteral("' passed CensorForge exact name validation. Allowing original game validation to proceed.");
}
log2.LogInfo(val2);
return true;
}
catch (Exception ex)
{
ManualLogSource log3 = ((BasePlugin)Plugin.Instance).Log;
BepInExErrorLogInterpolatedStringHandler val3 = new BepInExErrorLogInterpolatedStringHandler(50, 1, ref flag);
if (flag)
{
((BepInExLogInterpolatedStringHandler)val3).AppendLiteral("Error in CensorForge GetIsNameValid_Prefix patch: ");
((BepInExLogInterpolatedStringHandler)val3).AppendFormatted<Exception>(ex);
}
log3.LogError(val3);
return true;
}
}
}
}
namespace CensorForge.Core
{
public static class CensorRules
{
private static ManualLogSource _logger;
private static readonly List<string> AllEmbeddedRawWordLists;
private static readonly List<string> OriginalForbiddenPhrases;
private static readonly HashSet<string> ProcessedForbiddenNames;
static CensorRules()
{
AllEmbeddedRawWordLists = new List<string>
{
EnglishWords.Data,
RussianWords.Data,
FrenchWords.Data
};
OriginalForbiddenPhrases = new List<string>();
ProcessedForbiddenNames = new HashSet<string>();
ProcessAllEmbeddedLists();
}
private static void ProcessAllEmbeddedLists()
{
OriginalForbiddenPhrases.Clear();
ProcessedForbiddenNames.Clear();
if (AllEmbeddedRawWordLists == null)
{
return;
}
foreach (string allEmbeddedRawWordList in AllEmbeddedRawWordLists)
{
if (string.IsNullOrWhiteSpace(allEmbeddedRawWordList))
{
continue;
}
string[] array = allEmbeddedRawWordList.Split(new string[3] { "\r\n", "\r", "\n" }, StringSplitOptions.None);
string[] array2 = array;
foreach (string text in array2)
{
string text2 = text.Trim();
if (!string.IsNullOrWhiteSpace(text2) && !text2.StartsWith("#"))
{
string item = text2.ToLowerInvariant();
if (!ProcessedForbiddenNames.Contains(item))
{
OriginalForbiddenPhrases.Add(text2);
ProcessedForbiddenNames.Add(item);
}
}
}
}
}
public static void Initialize(ManualLogSource logger)
{
//IL_0015: Unknown result type (might be due to invalid IL or missing references)
//IL_001b: Expected O, but got Unknown
_logger = logger;
ManualLogSource logger2 = _logger;
if (logger2 != null)
{
bool flag = default(bool);
BepInExInfoLogInterpolatedStringHandler val = new BepInExInfoLogInterpolatedStringHandler(114, 2, ref flag);
if (flag)
{
((BepInExLogInterpolatedStringHandler)val).AppendLiteral("CensorRules initialized. Loaded a total of ");
((BepInExLogInterpolatedStringHandler)val).AppendFormatted<int>(ProcessedForbiddenNames.Count);
((BepInExLogInterpolatedStringHandler)val).AppendLiteral(" unique exact forbidden name patterns from ");
((BepInExLogInterpolatedStringHandler)val).AppendFormatted<int>(AllEmbeddedRawWordLists?.Count ?? 0);
((BepInExLogInterpolatedStringHandler)val).AppendLiteral(" embedded C# language lists.");
}
logger2.LogInfo(val);
}
if (ProcessedForbiddenNames.Count != 0)
{
return;
}
List<string> allEmbeddedRawWordLists = AllEmbeddedRawWordLists;
if (allEmbeddedRawWordLists != null && allEmbeddedRawWordLists.Any((string listData) => !string.IsNullOrWhiteSpace(listData?.Trim())))
{
ManualLogSource logger3 = _logger;
if (logger3 != null)
{
logger3.LogWarning((object)"CensorRules: Processed word list is empty, but raw data strings were present. This might happen if all lines in all lists are comments or blank. Check the content of your embedded lists in the WordListSources files.");
}
}
else
{
ManualLogSource logger4 = _logger;
if (logger4 != null)
{
logger4.LogWarning((object)"CensorRules: All embedded word lists are empty or no language data fields were added to 'AllEmbeddedRawWordLists' in CensorRules.cs. No words loaded.");
}
}
}
public static bool IsNameExactlyForbidden(string characterName, out string foundForbiddenWord)
{
foundForbiddenWord = null;
if (string.IsNullOrWhiteSpace(characterName))
{
return false;
}
string lowerCaseName = characterName.ToLowerInvariant();
if (ProcessedForbiddenNames.Contains(lowerCaseName))
{
foundForbiddenWord = OriginalForbiddenPhrases.FirstOrDefault((string originalPhrase) => originalPhrase.ToLowerInvariant() == lowerCaseName);
if (foundForbiddenWord == null)
{
foundForbiddenWord = lowerCaseName;
}
return true;
}
return false;
}
}
}