Decompiled source of ChangelogEditor v1.0.8

ChangelogEditor.dll

Decompiled 6 months ago
using System;
using System.Diagnostics;
using System.IO;
using System.Reflection;
using System.Runtime.CompilerServices;
using System.Runtime.InteropServices;
using System.Runtime.Versioning;
using System.Security;
using System.Security.Permissions;
using System.Text;
using BepInEx;
using BepInEx.Configuration;
using BepInEx.Logging;
using HarmonyLib;
using JetBrains.Annotations;
using Microsoft.CodeAnalysis;
using TMPro;
using UnityEngine;
using UnityEngine.SceneManagement;

[assembly: CompilationRelaxations(8)]
[assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)]
[assembly: Debuggable(DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints)]
[assembly: AssemblyTitle("ChangelogEditor")]
[assembly: AssemblyDescription("")]
[assembly: AssemblyConfiguration("")]
[assembly: AssemblyCompany("Azumatt")]
[assembly: AssemblyProduct("ChangelogEditor")]
[assembly: AssemblyCopyright("Copyright ©  2021")]
[assembly: AssemblyTrademark("")]
[assembly: ComVisible(false)]
[assembly: Guid("4358610B-F3F4-4843-B7AF-98B7BC60DCDE")]
[assembly: AssemblyFileVersion("1.0.8")]
[assembly: TargetFramework(".NETFramework,Version=v4.6.2", FrameworkDisplayName = ".NET Framework 4.6.2")]
[assembly: SecurityPermission(SecurityAction.RequestMinimum, SkipVerification = true)]
[assembly: AssemblyVersion("1.0.8.0")]
[module: UnverifiableCode]
namespace Microsoft.CodeAnalysis
{
	[CompilerGenerated]
	[Microsoft.CodeAnalysis.Embedded]
	internal sealed class EmbeddedAttribute : Attribute
	{
	}
}
namespace System.Runtime.CompilerServices
{
	[CompilerGenerated]
	[Microsoft.CodeAnalysis.Embedded]
	[AttributeUsage(AttributeTargets.Class | AttributeTargets.Property | AttributeTargets.Field | AttributeTargets.Event | AttributeTargets.Parameter | AttributeTargets.ReturnValue | AttributeTargets.GenericParameter, AllowMultiple = false, Inherited = false)]
	internal sealed class NullableAttribute : Attribute
	{
		public readonly byte[] NullableFlags;

		public NullableAttribute(byte P_0)
		{
			NullableFlags = new byte[1] { P_0 };
		}

		public NullableAttribute(byte[] P_0)
		{
			NullableFlags = P_0;
		}
	}
	[CompilerGenerated]
	[Microsoft.CodeAnalysis.Embedded]
	[AttributeUsage(AttributeTargets.Class | AttributeTargets.Struct | AttributeTargets.Method | AttributeTargets.Interface | AttributeTargets.Delegate, AllowMultiple = false, Inherited = false)]
	internal sealed class NullableContextAttribute : Attribute
	{
		public readonly byte Flag;

		public NullableContextAttribute(byte P_0)
		{
			Flag = P_0;
		}
	}
}
namespace ChangelogEditor
{
	[HarmonyPatch(typeof(ChangeLog), "Start")]
	internal static class ChangeLogStartPatch
	{
		private static bool Prefix(ChangeLog __instance)
		{
			ChangelogEditorPlugin.ChangelogGameObject = ((Component)__instance).gameObject;
			ChangelogEditorPlugin.UpdateChangelogWidth(null, null);
			if (ChangelogEditorPlugin.overrideText.Value == ChangelogEditorPlugin.Toggle.On)
			{
				__instance.m_textField.text = ChangelogEditorPlugin.customFileText;
				return false;
			}
			if (ChangelogEditorPlugin.shouldChangeText.Value != ChangelogEditorPlugin.Toggle.On)
			{
				return true;
			}
			__instance.m_textField.text = ChangelogEditorPlugin.customFileText + __instance.m_changeLog.text;
			return false;
		}

		private static void Postfix(ChangeLog __instance)
		{
			//IL_0026: Unknown result type (might be due to invalid IL or missing references)
			//IL_0035: Unknown result type (might be due to invalid IL or missing references)
			//IL_003a: Unknown result type (might be due to invalid IL or missing references)
			ChangeLogExtension.topicTmp = ((Component)Utils.FindChild(((Component)__instance).transform, "Topic", (IterativeSearchType)0)).GetComponent<TextMeshProUGUI>();
			RectTransform rectTransform = ((TMP_Text)ChangeLogExtension.topicTmp).rectTransform;
			rectTransform.anchoredPosition += new Vector2(0f, 20f);
			__instance.UpdateChangelog();
		}
	}
	[HarmonyPatch(typeof(ChangeLog), "LateUpdate")]
	internal static class ChangeLogLateUpdatePatch
	{
		private static void Postfix(ChangeLog __instance)
		{
			ChangeLogExtension.UpdateTopicText(__instance);
		}
	}
	public static class ChangeLogExtension
	{
		internal static TextMeshProUGUI topicTmp;

		public static void UpdateChangelog(this ChangeLog __instance)
		{
			__instance.m_hasSetScroll = false;
			UpdateTopicText(__instance);
			if (ChangelogEditorPlugin.overrideText.Value == ChangelogEditorPlugin.Toggle.On)
			{
				__instance.m_textField.text = GeneralExtensions.ToLiteral(ChangelogEditorPlugin.customFileText, "\"");
			}
			else if (ChangelogEditorPlugin.shouldChangeText.Value == ChangelogEditorPlugin.Toggle.On)
			{
				__instance.m_textField.text = GeneralExtensions.ToLiteral(ChangelogEditorPlugin.customFileText, "\"") + __instance.m_changeLog.text;
			}
			else
			{
				__instance.m_textField.text = __instance.m_changeLog.text;
			}
			((Component)__instance).gameObject.SetActive(ChangelogEditorPlugin.shouldShowChangelog.Value == ChangelogEditorPlugin.Toggle.On);
		}

		public static void UpdateTopicText(ChangeLog clog)
		{
			((TMP_Text)topicTmp).text = ChangelogEditorPlugin.topicText.Value;
		}
	}
	[BepInPlugin("Azumatt.ChangelogEditor", "ChangelogEditor", "1.0.8")]
	public class ChangelogEditorPlugin : BaseUnityPlugin
	{
		public enum Toggle
		{
			On = 1,
			Off = 0
		}

		private class ConfigurationManagerAttributes
		{
			[UsedImplicitly]
			public int? Order;

			[UsedImplicitly]
			public bool? Browsable;

			[UsedImplicitly]
			public string Category;

			[UsedImplicitly]
			public Action<ConfigEntryBase>? CustomDrawer;
		}

		private class AcceptableShortcuts : AcceptableValueBase
		{
			public AcceptableShortcuts()
				: base(typeof(KeyboardShortcut))
			{
			}

			public override object Clamp(object value)
			{
				return value;
			}

			public override bool IsValid(object value)
			{
				return true;
			}

			public override string ToDescriptionString()
			{
				return "# Acceptable values: " + string.Join(", ", UnityInput.Current.SupportedKeyCodes);
			}
		}

		internal const string ModName = "ChangelogEditor";

		internal const string ModVersion = "1.0.8";

		internal const string Author = "Azumatt";

		private const string ModGUID = "Azumatt.ChangelogEditor";

		private static string ConfigFileName = "Azumatt.ChangelogEditor.cfg";

		private static string ContentFile = "Azumatt.ChangelogEditor.txt";

		private static string ConfigFileFullPath;

		private static string ContentFileFullPath;

		internal static string ConnectionError;

		internal static string customFileText;

		internal static GameObject ChangelogGameObject;

		private readonly Harmony _harmony = new Harmony("Azumatt.ChangelogEditor");

		public static readonly ManualLogSource ChangelogEditorLogger;

		internal static ConfigEntry<Toggle> shouldShowChangelog;

		internal static ConfigEntry<Toggle> shouldChangeText;

		internal static ConfigEntry<Toggle> overrideText;

		internal static ConfigEntry<string> topicText;

		internal static ConfigEntry<float> changelogWidth;

		public void Awake()
		{
			shouldShowChangelog = config("1 - Changelog", "Should Show Changelog", Toggle.On, "If on, the changelog will be shown in the main menu. If off, it will not be shown.");
			shouldChangeText = config("1 - Changelog", "Should Change Text", Toggle.On, "If on, your configuration file's text will be added to the changelog. (at the top). This pulls from the " + ContentFile + " found in your config folder.");
			overrideText = config("1 - Changelog", "Override Changelog Text", Toggle.Off, "If on, only your custom text that is set will show in the changlog. This deletes the default changelog text.");
			topicText = TextEntryConfig("1 - Changelog", "Title Text", "Changelog", "Change the title text of the changelog. This is the text that shows up in the top of the changelog.");
			changelogWidth = config("1 - Changelog", "Width", 445f, "Width of the changelog window.");
			changelogWidth.SettingChanged += UpdateChangelogWidth;
			if (!File.Exists(ContentFileFullPath))
			{
				File.WriteAllText(ContentFileFullPath, "This is the content file for ChangelogEditor. You can edit this file to change the changelog text." + Environment.NewLine + "This file can be found currently at: " + ContentFileFullPath + Environment.NewLine + Environment.NewLine);
			}
			else
			{
				customFileText = File.ReadAllText(ContentFileFullPath, Encoding.UTF8);
			}
			Assembly executingAssembly = Assembly.GetExecutingAssembly();
			_harmony.PatchAll(executingAssembly);
			SetupWatcher();
		}

		private void OnDestroy()
		{
			((BaseUnityPlugin)this).Config.Save();
			changelogWidth.SettingChanged -= UpdateChangelogWidth;
		}

		internal static void UpdateChangelogWidth(object sender, EventArgs e)
		{
			//IL_0018: Unknown result type (might be due to invalid IL or missing references)
			//IL_001e: Expected O, but got Unknown
			//IL_0032: Unknown result type (might be due to invalid IL or missing references)
			//IL_004b: Unknown result type (might be due to invalid IL or missing references)
			//IL_0051: Expected O, but got Unknown
			//IL_0051: Unknown result type (might be due to invalid IL or missing references)
			//IL_0052: Unknown result type (might be due to invalid IL or missing references)
			//IL_0057: Unknown result type (might be due to invalid IL or missing references)
			//IL_0063: Unknown result type (might be due to invalid IL or missing references)
			//IL_0069: Unknown result type (might be due to invalid IL or missing references)
			//IL_007f: Unknown result type (might be due to invalid IL or missing references)
			//IL_008a: Unknown result type (might be due to invalid IL or missing references)
			//IL_008b: Unknown result type (might be due to invalid IL or missing references)
			//IL_0091: Unknown result type (might be due to invalid IL or missing references)
			//IL_0096: Unknown result type (might be due to invalid IL or missing references)
			//IL_0098: Unknown result type (might be due to invalid IL or missing references)
			//IL_009e: Unknown result type (might be due to invalid IL or missing references)
			//IL_00a4: Unknown result type (might be due to invalid IL or missing references)
			//IL_00b9: Unknown result type (might be due to invalid IL or missing references)
			//IL_00ce: Unknown result type (might be due to invalid IL or missing references)
			//IL_00e3: Unknown result type (might be due to invalid IL or missing references)
			//IL_00f8: Unknown result type (might be due to invalid IL or missing references)
			if (!((Object)(object)ChangelogGameObject == (Object)null))
			{
				RectTransform val = (RectTransform)ChangelogGameObject.transform;
				RectTransform val2 = (RectTransform)ChangelogGameObject.transform.Find("ScrollPanel");
				RectTransform val3 = (RectTransform)ChangelogGameObject.transform.Find("PatchlogScroll");
				Vector2 sizeDelta = val2.sizeDelta;
				val.sizeDelta = new Vector2(changelogWidth.Value, sizeDelta.y);
				((Vector2)(ref sizeDelta))..ctor(changelogWidth.Value, sizeDelta.y);
				val2.sizeDelta = sizeDelta;
				Vector2 anchoredPosition = val2.anchoredPosition;
				val3.anchoredPosition = new Vector2(anchoredPosition.x, anchoredPosition.y);
				val3.anchorMin = new Vector2(0f, 0f);
				val3.anchorMax = new Vector2(0f, 1f);
				val3.pivot = new Vector2(0f, 0.5f);
				val3.anchoredPosition = new Vector2(0f, 0f);
			}
		}

		private void SetupWatcher()
		{
			FileSystemWatcher fileSystemWatcher = new FileSystemWatcher(Paths.ConfigPath, ConfigFileName);
			fileSystemWatcher.Changed += ReadConfigValues;
			fileSystemWatcher.Created += ReadConfigValues;
			fileSystemWatcher.Renamed += ReadConfigValues;
			fileSystemWatcher.IncludeSubdirectories = true;
			fileSystemWatcher.SynchronizingObject = ThreadingHelper.SynchronizingObject;
			fileSystemWatcher.EnableRaisingEvents = true;
			FileSystemWatcher fileSystemWatcher2 = new FileSystemWatcher(Paths.ConfigPath, ConfigFileName);
			fileSystemWatcher2.Changed += ReadContent;
			fileSystemWatcher2.Created += ReadContent;
			fileSystemWatcher2.Renamed += ReadContent;
			fileSystemWatcher2.IncludeSubdirectories = true;
			fileSystemWatcher2.SynchronizingObject = ThreadingHelper.SynchronizingObject;
			fileSystemWatcher2.EnableRaisingEvents = true;
			FileSystemWatcher fileSystemWatcher3 = new FileSystemWatcher(Paths.ConfigPath, ContentFile);
			fileSystemWatcher3.Changed += ReadContent;
			fileSystemWatcher3.Created += ReadContent;
			fileSystemWatcher3.Renamed += ReadContent;
			fileSystemWatcher3.IncludeSubdirectories = true;
			fileSystemWatcher3.SynchronizingObject = ThreadingHelper.SynchronizingObject;
			fileSystemWatcher3.EnableRaisingEvents = true;
		}

		private void ReadConfigValues(object sender, FileSystemEventArgs e)
		{
			if (!File.Exists(ConfigFileFullPath))
			{
				return;
			}
			try
			{
				ChangelogEditorLogger.LogDebug((object)"ReadConfigValues called");
				((BaseUnityPlugin)this).Config.Reload();
			}
			catch
			{
				ChangelogEditorLogger.LogError((object)("There was an issue loading your " + ConfigFileName));
				ChangelogEditorLogger.LogError((object)"Please check your config entries for spelling and format!");
			}
		}

		private void ReadContent(object sender, FileSystemEventArgs e)
		{
			//IL_0022: Unknown result type (might be due to invalid IL or missing references)
			//IL_0027: Unknown result type (might be due to invalid IL or missing references)
			if (!File.Exists(ContentFileFullPath))
			{
				return;
			}
			try
			{
				customFileText = File.ReadAllText(ContentFileFullPath, Encoding.UTF8);
				Scene activeScene = SceneManager.GetActiveScene();
				if (!(((Scene)(ref activeScene)).name == "main") && !((Object)(object)ChangelogGameObject.gameObject == (Object)null) && Object.op_Implicit((Object)(object)ChangelogGameObject.GetComponent<ChangeLog>()))
				{
					ChangelogGameObject.GetComponent<ChangeLog>().UpdateChangelog();
				}
			}
			catch
			{
				ChangelogEditorLogger.LogError((object)("There was an issue loading your " + ConfigFileName));
				ChangelogEditorLogger.LogError((object)"Please check your config entries for spelling and format!");
			}
		}

		private ConfigEntry<T> config<T>(string group, string name, T value, ConfigDescription description)
		{
			return ((BaseUnityPlugin)this).Config.Bind<T>(group, name, value, description);
		}

		private ConfigEntry<T> config<T>(string group, string name, T value, string description)
		{
			//IL_000c: Unknown result type (might be due to invalid IL or missing references)
			//IL_0016: Expected O, but got Unknown
			return config(group, name, value, new ConfigDescription(description, (AcceptableValueBase)null, Array.Empty<object>()));
		}

		internal ConfigEntry<T> TextEntryConfig<T>(string group, string name, T value, string desc)
		{
			//IL_0029: Unknown result type (might be due to invalid IL or missing references)
			//IL_0033: Expected O, but got Unknown
			ConfigurationManagerAttributes configurationManagerAttributes = new ConfigurationManagerAttributes
			{
				CustomDrawer = TextAreaDrawer
			};
			return config(group, name, value, new ConfigDescription(desc, (AcceptableValueBase)null, new object[1] { configurationManagerAttributes }));
		}

		internal static void TextAreaDrawer(ConfigEntryBase entry)
		{
			GUILayout.ExpandHeight(true);
			GUILayout.ExpandWidth(true);
			entry.BoxedValue = GUILayout.TextArea((string)entry.BoxedValue, (GUILayoutOption[])(object)new GUILayoutOption[2]
			{
				GUILayout.ExpandWidth(true),
				GUILayout.ExpandHeight(true)
			});
		}

		static ChangelogEditorPlugin()
		{
			string configPath = Paths.ConfigPath;
			char directorySeparatorChar = Path.DirectorySeparatorChar;
			ConfigFileFullPath = configPath + directorySeparatorChar + ConfigFileName;
			string configPath2 = Paths.ConfigPath;
			directorySeparatorChar = Path.DirectorySeparatorChar;
			ContentFileFullPath = configPath2 + directorySeparatorChar + ContentFile;
			ConnectionError = "";
			customFileText = "";
			ChangelogGameObject = null;
			ChangelogEditorLogger = Logger.CreateLogSource("ChangelogEditor");
			shouldShowChangelog = null;
			shouldChangeText = null;
			overrideText = null;
			topicText = null;
			changelogWidth = null;
		}
	}
}