Please disclose if any significant portion of your mod was created using AI tools by adding the 'AI Generated' category. Failing to do so may result in the mod being removed from Thunderstore.
Decompiled source of LanguageFileGenerator v1.0.2
plugins/LanguageFileGenerator.dll
Decompiled 2 years agousing System; using System.Collections.Generic; using System.Diagnostics; using System.IO; 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.Bootstrap; using BepInEx.Logging; using LanguageFileGenerator.Modules; using MonoMod.RuntimeDetour; using R2API; using R2API.Utils; using RoR2; [assembly: CompilationRelaxations(8)] [assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)] [assembly: Debuggable(DebuggableAttribute.DebuggingModes.Default | DebuggableAttribute.DebuggingModes.DisableOptimizations | DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints | DebuggableAttribute.DebuggingModes.EnableEditAndContinue)] [assembly: TargetFramework(".NETStandard,Version=v2.0", FrameworkDisplayName = "")] [assembly: AssemblyCompany("LanguageFileGenerator")] [assembly: AssemblyConfiguration("Debug")] [assembly: AssemblyFileVersion("1.0.0.0")] [assembly: AssemblyInformationalVersion("1.0.0")] [assembly: AssemblyProduct("LanguageFileGenerator")] [assembly: AssemblyTitle("LanguageFileGenerator")] [assembly: SecurityPermission(SecurityAction.RequestMinimum, SkipVerification = true)] [assembly: AssemblyVersion("1.0.0.0")] [module: UnverifiableCode] namespace LanguageFileGenerator { [BepInDependency(/*Could not decode attribute arguments.*/)] [BepInPlugin("AAA.TheTimeSweeper.LanguageFileGenerator", "LanguageFileGenerator", "1.0.2")] public class LanguageFileGeneratorPlugin : BaseUnityPlugin { private Hook languageHook; public static LanguageFileGeneratorPlugin instance; public static ManualLogSource Log; public static Dictionary<Assembly, string> assemblyModNames = new Dictionary<Assembly, string>(); public const string nullMod = "UNKNOWN"; private void Awake() { //IL_0068: Unknown result type (might be due to invalid IL or missing references) //IL_0072: Expected O, but got Unknown instance = this; Log = ((BaseUnityPlugin)this).Logger; languageHook = new Hook((MethodBase)typeof(LanguageAPI).GetMethod("Add", new Type[3] { typeof(string), typeof(string), typeof(string) }), typeof(LanguageFileGeneratorPlugin).GetMethod("OnLanguageHook")); RoR2Application.onLoad = (Action)Delegate.Combine(RoR2Application.onLoad, new Action(RoR2Application_OnLoad)); } private void RoR2Application_OnLoad() { Language.PrintAll(); } public static void OnLanguageHook(Action<string, string, string> orig, string token, string text, string language) { Language.Add(token, text, GetModName(GetAssembly())); orig(token, text, language); } private static Assembly GetAssembly() { Assembly assembly = new StackFrame(3, needFileInfo: false).GetMethod()?.DeclaringType.Assembly; if (assembly != null && assembly.FullName.Contains("R2API.Language")) { assembly = new StackFrame(4, needFileInfo: false).GetMethod()?.DeclaringType.Assembly; } return assembly; } private static string GetModName(Assembly assembly) { if (assembly == null) { return "UNKNOWN"; } if (!assemblyModNames.TryGetValue(assembly, out var value)) { string location = assembly.Location; value = Chainloader.PluginInfos.FirstOrDefault((KeyValuePair<string, PluginInfo> x) => location == x.Value.Location).Key; if (value == null) { ((BaseUnityPlugin)instance).Logger.LogWarning((object)("The assembly " + assembly.FullName + " is not a loaded BepInEx plugin, falling back to looking for attribute in assembly")); try { Type[] source = default(Type[]); Reflection.GetTypesSafe(assembly, ref source); BepInPlugin val = source.Select((Type x) => ((MemberInfo)x).GetCustomAttribute<BepInPlugin>()).First((BepInPlugin x) => x != null); value = val.GUID; } catch { ((BaseUnityPlugin)instance).Logger.LogWarning((object)"Assembly did not have a BepInPlugin attribute or couldn't load its types, falling back to assembly name"); value = assembly.GetName().Name; } } assemblyModNames[assembly] = value; } return assemblyModNames[assembly]; } } } namespace LanguageFileGenerator.Modules { internal static class Language { public static Dictionary<string, string> tokensOutputs = new Dictionary<string, string>(); public static void Add(string token, string text, string modName) { if (!tokensOutputs.ContainsKey(modName)) { tokensOutputs[modName] = ""; } Dictionary<string, string> dictionary = tokensOutputs; dictionary[modName] = dictionary[modName] + "\n \"" + token + "\" : \"" + text.Replace(Environment.NewLine, "\\n").Replace("\n", "\\n") + "\","; } public static void PrintAll() { foreach (KeyValuePair<string, string> tokensOutput in tokensOutputs) { PrintOutput(tokensOutput.Value, tokensOutput.Key); } } private static void PrintOutput(string tokensOutput, string fileName = "") { string contents = "{\r\n \"en\": {" + tokensOutput + "\r\n }\r\n}"; fileName += ".language"; string text = Path.Combine(Directory.GetParent(((BaseUnityPlugin)LanguageFileGeneratorPlugin.instance).Info.Location).FullName, fileName); File.WriteAllText(text, contents); LanguageFileGeneratorPlugin.Log.LogMessage((object)("writing file to " + text)); } } }