Decompiled source of ListList v0.9.0

ListList.dll

Decompiled 5 days ago
using 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 Imui.Controls;
using Imui.Core;
using Imui.IO.Touch;
using Imui.Rendering;
using Microsoft.CodeAnalysis;
using UnityEngine;
using UnityEngine.SceneManagement;
using WKLib.API;
using WKLib.API.Input;
using WKLib.API.UI;

[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.1", FrameworkDisplayName = ".NET Standard 2.1")]
[assembly: AssemblyCompany("MyFirstPlugin")]
[assembly: AssemblyConfiguration("Debug")]
[assembly: AssemblyFileVersion("1.0.0.0")]
[assembly: AssemblyInformationalVersion("1.0.0")]
[assembly: AssemblyProduct("My first plugin")]
[assembly: AssemblyTitle("MyFirstPlugin")]
[assembly: SecurityPermission(SecurityAction.RequestMinimum, SkipVerification = true)]
[assembly: AssemblyVersion("1.0.0.0")]
[module: UnverifiableCode]
[module: RefSafetyRules(11)]
namespace Microsoft.CodeAnalysis
{
	[CompilerGenerated]
	[Embedded]
	internal sealed class EmbeddedAttribute : Attribute
	{
	}
}
namespace System.Runtime.CompilerServices
{
	[CompilerGenerated]
	[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 MyFirstPlugin
{
	public static class MyPluginInfo
	{
		public const string PLUGIN_GUID = "MyFirstPlugin";

		public const string PLUGIN_NAME = "My first plugin";

		public const string PLUGIN_VERSION = "1.0.0";
	}
}
namespace ListList
{
	[BepInDependency(/*Could not decode attribute arguments.*/)]
	[BepInPlugin("firebug.listlist", "ListList", "0.9.0")]
	public class ListListPlugin : BaseUnityPlugin
	{
		internal enum menumodes
		{
			FilterMods,
			EditFilters
		}

		public class MyModListTab : ModTab
		{
			public override string DisplayName => "ListList";

			public override void DrawSubMenu(ImGui gui)
			{
				//IL_000e: Unknown result type (might be due to invalid IL or missing references)
				//IL_0014: Unknown result type (might be due to invalid IL or missing references)
				if (ImButton.Button(gui, (ReadOnlySpan<char>)"ListList Menu", default(ImSize), (ImButtonFlag)0))
				{
					((WKLibWindow)MyWindowObject).isOpen = !((WKLibWindow)MyWindowObject).isOpen;
				}
			}
		}

		public class ListListMenu : WKLibWindow
		{
			private static menumodes filtermenumodes;

			public static List<string> alertlist = new List<string>();

			public static Dictionary<string, HashSet<int>> selectdic = new Dictionary<string, HashSet<int>>();

			private string curfilter = "ALL MODS";

			private static string filtersavebox = string.Empty;

			private static bool checkboxValue;

			public static HashSet<int> selectedValues = new HashSet<int>();

			public static List<string> filteredpluginnames = new List<string>();

			public ListListMenu()
			{
				base.isOpen = true;
			}

			public override void Draw(ImGui gui, bool isRootPanelOpen)
			{
				//IL_0026: Unknown result type (might be due to invalid IL or missing references)
				//IL_0194: Unknown result type (might be due to invalid IL or missing references)
				//IL_0465: Unknown result type (might be due to invalid IL or missing references)
				//IL_01ea: Unknown result type (might be due to invalid IL or missing references)
				//IL_01f0: Unknown result type (might be due to invalid IL or missing references)
				//IL_0567: Unknown result type (might be due to invalid IL or missing references)
				//IL_056d: Unknown result type (might be due to invalid IL or missing references)
				//IL_0599: Unknown result type (might be due to invalid IL or missing references)
				//IL_059f: Unknown result type (might be due to invalid IL or missing references)
				//IL_06a1: Unknown result type (might be due to invalid IL or missing references)
				//IL_06a7: Unknown result type (might be due to invalid IL or missing references)
				//IL_0322: Unknown result type (might be due to invalid IL or missing references)
				//IL_0328: Unknown result type (might be due to invalid IL or missing references)
				//IL_07ec: Unknown result type (might be due to invalid IL or missing references)
				//IL_07f2: Unknown result type (might be due to invalid IL or missing references)
				if (!isRootPanelOpen || !ImWindow.BeginWindow(gui, "ListList Menu", ref base.isOpen, new ImSize(800f, 400f), (ImWindowFlag)0))
				{
					return;
				}
				float spacing = gui.Style.Layout.Spacing;
				float layoutWidth = ImLayoutUtility.GetLayoutWidth(gui);
				float num = layoutWidth / 3f - spacing / 2f;
				float layoutHeight = ImLayoutUtility.GetLayoutHeight(gui);
				float num2 = layoutHeight - ImLayoutUtility.GetRowHeight(gui) - ImLayoutUtility.GetRowHeight(gui) - spacing;
				ImLayoutUtility.BeginHorizontal(gui, 0f, 0f);
				ImText.Text(gui, (ReadOnlySpan<char>)"Mode: ", false, (ImTextOverflow)0);
				if (ImRadio.Radio<menumodes>(gui, ref filtermenumodes, true))
				{
					selectedValues.Clear();
					if (filtermenumodes == menumodes.FilterMods && curfilter != "ALL MODS")
					{
						filteredpluginnames = new List<string>(Chainloader.PluginInfos.Keys.Intersect(allfilters[curfilter]));
					}
					else
					{
						filteredpluginnames = new List<string>(Chainloader.PluginInfos.Keys);
					}
					if (filtermenumodes == menumodes.EditFilters)
					{
						selectedValues.UnionWith(selectdic[curfilter]);
					}
				}
				ImLayoutUtility.EndHorizontal(gui);
				ImLayoutUtility.BeginHorizontal(gui, num, ImLayoutUtility.GetLayoutHeight(gui) - ImLayoutUtility.GetRowHeight(gui) - spacing * 3f);
				ImLayoutUtility.BeginVertical(gui, num, num2);
				ImSeparator.Separator(gui, (ReadOnlySpan<char>)"Filters Panel");
				ImTabsPane.BeginTabsPane(gui, ImLayoutUtility.AddLayoutRect(gui, num, num2), (ImTabsPaneFlags)0);
				if (ImTabsPane.BeginTab(gui, (ReadOnlySpan<char>)"Filters"))
				{
					foreach (string item in allfilters.Keys.ToList())
					{
						if (ImButton.Button(gui, (ReadOnlySpan<char>)item, default(ImSize), (ImButtonFlag)0))
						{
							selectedValues.Clear();
							curfilter = item;
							filteredpluginnames = new List<string>(Chainloader.PluginInfos.Keys.Intersect(allfilters[item]));
							if (filtermenumodes == menumodes.EditFilters)
							{
								selectedValues.UnionWith(selectdic[curfilter]);
								filteredpluginnames = new List<string>(Chainloader.PluginInfos.Keys);
							}
							if (alertlist.Contains(curfilter))
							{
								checkboxValue = true;
							}
							else
							{
								checkboxValue = false;
							}
						}
					}
					ImTabsPane.EndTab(gui);
				}
				if (ImTabsPane.BeginTab(gui, (ReadOnlySpan<char>)"Alerts"))
				{
					if (alertlist != null || alertlist.Any())
					{
						foreach (string item2 in alertlist)
						{
							if (ImButton.Button(gui, (ReadOnlySpan<char>)item2, default(ImSize), (ImButtonFlag)0))
							{
								Logger.LogInfo((object)string.Join(", ", selectdic.Keys));
								selectedValues.Clear();
								curfilter = item2;
								filteredpluginnames = new List<string>(Chainloader.PluginInfos.Keys.Intersect(allfilters[item2]));
								if (filtermenumodes == menumodes.EditFilters)
								{
									selectedValues.UnionWith(selectdic[curfilter]);
									filteredpluginnames = new List<string>(Chainloader.PluginInfos.Keys);
								}
								checkboxValue = true;
							}
						}
					}
					ImTabsPane.EndTab(gui);
				}
				ImTabsPane.EndTabsPane(gui);
				ImLayoutUtility.EndVertical(gui);
				ImLayoutUtility.AddSpacing(gui, spacing);
				ImLayoutUtility.BeginVertical(gui, num, num2);
				ImSeparator.Separator(gui, (ReadOnlySpan<char>)"Mods Panel");
				ImText.Text(gui, (ReadOnlySpan<char>)("Filter: " + curfilter), false, (ImTextOverflow)0);
				ImList.BeginList(gui, ImSize.op_Implicit((num, num2 - ImLayoutUtility.GetRowHeight(gui) - spacing / 2f)));
				for (int i = 0; i < filteredpluginnames.Count; i++)
				{
					bool flag = selectedValues.Contains(i);
					if (ImList.ListItem(gui, flag, (ReadOnlySpan<char>)Chainloader.PluginInfos[filteredpluginnames[i]].Metadata.Name))
					{
						if (flag)
						{
							selectedValues.Remove(i);
						}
						else
						{
							selectedValues.Add(i);
						}
					}
				}
				gui.EndList((ImScrollFlag)0);
				ImLayoutUtility.EndVertical(gui);
				ImLayoutUtility.AddSpacing(gui, spacing);
				ImLayoutUtility.BeginVertical(gui, num - spacing / 2f, num2);
				ImSeparator.Separator(gui, (ReadOnlySpan<char>)"Tool Panel");
				if (filtermenumodes == menumodes.EditFilters)
				{
					ReadOnlySpan<char> readOnlySpan = "Save filter as";
					bool? flag2 = false;
					ImTextEdit.TextEdit(gui, ref filtersavebox, default(ImSize), flag2, 0, (ImTouchKeyboardType)0, readOnlySpan);
					ImLayoutUtility.BeginHorizontal(gui, 0f, 0f);
					if (ImButton.Button(gui, (ReadOnlySpan<char>)"Delete", default(ImSize), (ImButtonFlag)0) && curfilter != "ALL MODS")
					{
						UIUtility.ShowPopupForTime("Delete", 10f);
						selectedValues.Clear();
						allfilters.Remove(curfilter);
						selectdic.Remove(curfilter);
						if (alertlist.Remove(curfilter))
						{
							File.WriteAllLines(configfolder?.ToString() + "/alertlist.txt", alertlist);
						}
						File.Delete(configfolder?.ToString() + "/" + curfilter);
						curfilter = "ALL MODS";
					}
					ImTooltip.TooltipAtLastControl(gui, (ReadOnlySpan<char>)("Removes " + curfilter + "\nfrom the menu and your files"), (ImTooltipShow)1);
					if (ImButton.Button(gui, (ReadOnlySpan<char>)"Save", default(ImSize), (ImButtonFlag)0) && filtersavebox != "ALL MODS")
					{
						List<string> list = new List<string>();
						foreach (int selectedValue in selectedValues)
						{
							list.Add(filteredpluginnames[selectedValue]);
						}
						File.WriteAllLines(configfolder?.ToString() + "/" + filtersavebox + ".txt", list);
						list.Clear();
						allfilters[filtersavebox + ".txt"] = File.ReadAllLines(configfolder?.ToString() + "/" + filtersavebox + ".txt");
						selectdic[filtersavebox + ".txt"] = new HashSet<int>(selectedValues);
						UIUtility.ShowPopupForTime("Saved", 2f);
					}
					ImTooltip.TooltipAtLastControl(gui, (ReadOnlySpan<char>)"Saves the selected mods as a\nnew filter (to overwrite a filter,\nmake the name above the same as an\nexisting filter)", (ImTooltipShow)1);
					if (ImCheckbox.Checkbox(gui, ref checkboxValue, (ReadOnlySpan<char>)"<Set Alert", default(ImSize)))
					{
						if (checkboxValue)
						{
							alertlist.Add(curfilter);
						}
						else
						{
							alertlist.Remove(curfilter);
						}
						File.WriteAllLines(configfolder?.ToString() + "/alertlist.txt", alertlist);
					}
					ImTooltip.TooltipAtLastControl(gui, (ReadOnlySpan<char>)"If enabled, shows a window on\nlaunch listing any installed mods\non this filter", (ImTooltipShow)1);
					ImLayoutUtility.EndHorizontal(gui);
				}
				ImLayoutUtility.EndVertical(gui);
				ImLayoutUtility.EndHorizontal(gui);
				ImWindow.EndWindow(gui);
			}

			public override void HandleInput(ImGui gui)
			{
				if (InputUtility.GetKeyDown((KeyCode)306))
				{
					UIUtility.ShowPopupForTime(filtersavebox, 10f);
				}
			}
		}

		public static class SceneHandler
		{
			public static void OnSceneLoaded(Scene scene, LoadSceneMode mode)
			{
				bool flag = false;
				if (!(((Scene)(ref scene)).name == "Main-Menu") || popupseen)
				{
					return;
				}
				popupseen = true;
				ListListMenu.selectedValues.Clear();
				ListListMenu.filteredpluginnames = Chainloader.PluginInfos.Keys.ToList();
				string path = Paths.BepInExRootPath + "/plugins/Firebug-FB_Hand_Template_Palette/ailist.txt";
				bool flag2 = File.Exists(path);
				if (flag2)
				{
					File.WriteAllLines(configfolder?.ToString() + "/ailist.txt", File.ReadAllLines(path));
					File.Delete(path);
					if (!File.Exists(configfolder?.ToString() + "/alertlist.txt"))
					{
						File.WriteAllText(configfolder?.ToString() + "/alertlist.txt", "ailist.txt");
					}
				}
				if (File.Exists(configfolder?.ToString() + "/alertlist.txt"))
				{
					ListListMenu.alertlist = File.ReadAllLines(configfolder?.ToString() + "/alertlist.txt").ToList();
					if (flag2)
					{
						if (!ListListMenu.alertlist.Contains("ailist.txt"))
						{
							ListListMenu.alertlist.Add("ailist.txt");
						}
						File.WriteAllLines(configfolder?.ToString() + "/alertlist.txt", ListListMenu.alertlist);
					}
				}
				ListListPlugin.fileInfos = configfolder.GetFiles();
				for (int i = 0; i < Chainloader.PluginInfos.Count; i++)
				{
					ListListMenu.selectedValues.Add(i);
				}
				foreach (KeyValuePair<string, PluginInfo> pluginInfo in Chainloader.PluginInfos)
				{
					Logger.LogInfo((object)$"{pluginInfo}");
				}
				ListListMenu.selectdic.Add("ALL MODS", new HashSet<int>(ListListMenu.selectedValues));
				allfilters.Add("ALL MODS", Chainloader.PluginInfos.Keys.ToArray());
				string[] array = Chainloader.PluginInfos.Keys.ToArray();
				FileInfo[] fileInfos = ListListPlugin.fileInfos;
				foreach (FileInfo fileInfo in fileInfos)
				{
					ListListMenu.selectedValues.Clear();
					allfilters.Add(fileInfo.Name, File.ReadAllLines(configfolder?.ToString() + "/" + fileInfo.Name));
					for (int k = 0; k < Chainloader.PluginInfos.Count; k++)
					{
						if (allfilters[fileInfo.Name].Contains(array[k]))
						{
							ListListMenu.selectedValues.Add(k);
						}
					}
					ListListMenu.selectdic.Add(fileInfo.Name, new HashSet<int>(ListListMenu.selectedValues));
					ListListMenu.selectedValues.Clear();
				}
				allfilters.Remove("alertlist.txt");
				Dictionary<string, PluginInfo> dictionary = new Dictionary<string, PluginInfo>();
				string text = "";
				bool flag3 = false;
				if (File.Exists(configfolder?.ToString() + "/ailist.txt") && allfilters["ailist.txt"].Any(Chainloader.PluginInfos.ContainsKey))
				{
					text = "AI mods detected!\nView your \"ailist.txt\" filter in ListList to check\n";
					flag3 = true;
				}
				foreach (string item in ListListMenu.alertlist)
				{
					foreach (string item2 in Chainloader.PluginInfos.Keys.Intersect(allfilters[item]))
					{
						dictionary.Add(item2, Chainloader.PluginInfos[item2]);
						flag3 = true;
					}
				}
				if (!flag3)
				{
					return;
				}
				text += "Alert triggered! (List below)\n\n";
				foreach (KeyValuePair<string, PluginInfo> item3 in dictionary)
				{
					text = text + ((object)item3.Value)?.ToString() + " (" + item3.Key + ")\n";
				}
				UIUtility.ShowPopupForTime(text, 20f);
			}
		}

		public const string Guid = "firebug.listlist";

		public const string Name = "ListList";

		public const string Version = "0.9.0";

		internal static ManualLogSource Logger;

		public static WKLibAPI WKLibAPI;

		public static ListListMenu MyWindowObject = new ListListMenu();

		private static bool popupseen = false;

		public static string configpath;

		private static DirectoryInfo configfolder = new DirectoryInfo(Paths.ConfigPath + "/modfilters");

		private static FileInfo[] fileInfos;

		private static Dictionary<string, string[]> allfilters = new Dictionary<string, string[]>();

		private void Awake()
		{
			Logger = ((BaseUnityPlugin)this).Logger;
			Logger.LogInfo((object)"Plugin firebug.listlist is loaded!");
			SceneManager.sceneLoaded += SceneHandler.OnSceneLoaded;
			WKLibAPI = WKLibAPI.Create("ListList", "firebug.listlist");
			WKLibAPI.AddWindow((WKLibWindow)(object)MyWindowObject);
			WKLibAPI.AddToModList((ModTab)(object)new MyModListTab());
			configpath = Paths.ConfigPath + "/modfilters";
			if (!Directory.Exists(configpath))
			{
				Directory.CreateDirectory(configpath);
			}
		}

		private void OnDestroy()
		{
			WKLibAPI.Destroy();
		}
	}
	public static class CustomImList
	{
		public static void EndList(this ImGui gui, ImScrollFlag flags = (ImScrollFlag)0)
		{
			//IL_0002: Unknown result type (might be due to invalid IL or missing references)
			ImScroll.EndScrollable(gui, flags);
			gui.Canvas.PopClipRect();
			gui.Canvas.PopRectMask();
			gui.Layout.Pop();
		}
	}
}