From eb1bd70abb4d76b4354fcd91378f62e3d52a5e88 Mon Sep 17 00:00:00 2001 From: mikx Date: Thu, 9 Jul 2020 23:43:11 -0400 Subject: [PATCH] Major Tweaks + SSF Removed + New Strict Level --- PoE-MxFilterGen/Properties/AssemblyInfo.cs | 2 +- PoE-MxFilterGen/json/settings.cs | 37 +-- PoE-MxFilterGen/main.cs | 275 ++++++++++----------- PoE-MxFilterGen/obj/Debug/mxfiltergen.exe | Bin 315904 -> 316928 bytes PoE-MxFilterGen/obj/Debug/mxfiltergen.pdb | Bin 67072 -> 69120 bytes PoE-MxFilterGen/web.cs | 1 - 6 files changed, 151 insertions(+), 164 deletions(-) diff --git a/PoE-MxFilterGen/Properties/AssemblyInfo.cs b/PoE-MxFilterGen/Properties/AssemblyInfo.cs index 2f24fac..d809034 100644 --- a/PoE-MxFilterGen/Properties/AssemblyInfo.cs +++ b/PoE-MxFilterGen/Properties/AssemblyInfo.cs @@ -32,5 +32,5 @@ using System.Runtime.InteropServices; // You can specify all the values or you can default the Build and Revision Numbers // by using the '*' as shown below: // [assembly: AssemblyVersion("1.0.*")] -[assembly: AssemblyVersion("1.0.0.0")] +[assembly: AssemblyVersion("8.1.0.0")] [assembly: AssemblyFileVersion("1.0.0.0")] diff --git a/PoE-MxFilterGen/json/settings.cs b/PoE-MxFilterGen/json/settings.cs index a69749f..f746bfb 100644 --- a/PoE-MxFilterGen/json/settings.cs +++ b/PoE-MxFilterGen/json/settings.cs @@ -12,7 +12,9 @@ namespace PoE_MxFilterGen.json { public string git { get; set; } public string api { get; set; } - public int minimumValue { get; set; } + public int uniqueValue { get; set; } + public int fossilValue { get; set; } + public int cardValue { get; set; } public bool verbose { get; set; } public bool ssf { get; set; } public string section { get; set; } @@ -20,28 +22,23 @@ namespace PoE_MxFilterGen.json class settings { - public static string GetGIT() + + public static int GetUniqueValue() { SETTINGS j = JsonConvert.DeserializeObject(File.ReadAllText("settings.json")); - return j.git; + return j.uniqueValue; } - public static string GetAPI() + public static int GetFossilValue() { SETTINGS j = JsonConvert.DeserializeObject(File.ReadAllText("settings.json")); - return j.api; + return j.fossilValue; } - public static int GetMinimumValue() + public static int GetCardValue() { SETTINGS j = JsonConvert.DeserializeObject(File.ReadAllText("settings.json")); - return j.minimumValue; - } - - public static bool GetVerbose() - { - SETTINGS j = JsonConvert.DeserializeObject(File.ReadAllText("settings.json")); - return j.verbose; + return j.cardValue; } public static string GetSection() @@ -50,22 +47,14 @@ namespace PoE_MxFilterGen.json return j.section; } - public static bool GetSSF() - { - SETTINGS j = JsonConvert.DeserializeObject(File.ReadAllText("settings.json")); - return j.ssf; - } - public static void WriteSection(string section) { SETTINGS js = JsonConvert.DeserializeObject(File.ReadAllText($@"settings.json")); SETTINGS se = new SETTINGS { - git = js.git, - api = js.api, - minimumValue = js.minimumValue, - verbose = js.verbose, - ssf = js.ssf, + uniqueValue = js.uniqueValue, + fossilValue = js.fossilValue, + cardValue = js.cardValue, section = section }; var raw = JsonConvert.SerializeObject(se, Formatting.Indented); diff --git a/PoE-MxFilterGen/main.cs b/PoE-MxFilterGen/main.cs index fba1a79..7b11616 100644 --- a/PoE-MxFilterGen/main.cs +++ b/PoE-MxFilterGen/main.cs @@ -9,6 +9,7 @@ using System.Security.Cryptography; using System.Security.Policy; using System.Text; using System.Threading.Tasks; +using System.Xml; using static System.Net.Mime.MediaTypeNames; namespace PoE_MxFilterGen @@ -17,7 +18,7 @@ namespace PoE_MxFilterGen { private static DateTime dt = DateTime.Now; - public static string version = "8.0.0"; + public static string version = "8.2.0"; public static string fDate = string.Format("{0}-{1}-{2}", dt.Day, dt.Month, dt.Year); public static string api = ""; @@ -68,10 +69,18 @@ namespace PoE_MxFilterGen web.DownloadFile("https://raw.githubusercontent.com/mikxqc/PoE-MxFilter-Data/master/json/mxfiltergen_temp_settings.json", "settings.json"); } - //web.DownloadFile("https://raw.githubusercontent.com/mikxqc/PoE-MxFilter-Data/master/bin/mxfiltergen_updater.exe", "PoE-MxFilterGen-Updater.exe"); - msg.Splash(); + //Update Logic + msg.CMW("Checking for update...",true,1); + string remote_version = web.ReadString(@"https://raw.githubusercontent.com/mikxqc/PoE-MxFilter-Data/master/txt/mxfiltergen_version.txt"); + if (remote_version != version && deb == false) + { + web.DownloadFile("https://raw.githubusercontent.com/mikxqc/PoE-MxFilter-Data/master/bin/mxfiltergen_updater.exe", "PoE-MxFilterGen-Updater.exe"); + Process.Start("PoE-MxFilterGen-Updater.exe"); + Process.GetCurrentProcess().Kill(); + } + // Get current league from MxD var ls = web.ReadString("https://raw.githubusercontent.com/mikxqc/PoE-MxFilter-Data/master/json/mxfiltergen_var.json"); REMVAR lj = JsonConvert.DeserializeObject(ls); @@ -79,150 +88,135 @@ namespace PoE_MxFilterGen api = $"https://poe.ninja/api/data/"; - msg.CMW(string.Format("GIT: {0}", json.settings.GetGIT()), true, 1); - msg.CMW(string.Format("API: {0}", json.settings.GetAPI()), true, 1); - msg.CMW(string.Format("League: {0}", league), true, 1); - msg.CMW(string.Format("Minimum Value: {0}c", json.settings.GetMinimumValue().ToString()), true, 1); - msg.CMW(string.Format("Verbose: {0}", json.settings.GetVerbose().ToString()), true, 1); - msg.CMW(string.Format("SSF: {0}", json.settings.GetSSF().ToString()), true, 1); + msg.CMW($"League: {league}", true, 1); + msg.CMW($"Min. Unique Value - {json.settings.GetUniqueValue()}c", true, 1); + msg.CMW($"Min. Fossil Value - {json.settings.GetFossilValue()}c", true, 1); + msg.CMW($"Min. Card Value - {json.settings.GetCardValue()}c", true, 1); - // Check for updates - string remote_version = web.ReadString(@"https://raw.githubusercontent.com/mikxqc/PoE-MxFilter-Data/master/txt/mxfiltergen_version.txt"); - //msg.CMW(remote_version,true,3); - if (deb == false) - { - //Process.Start("PoE-MxFilterGen-Updater.exe"); - //Process.GetCurrentProcess().Kill(); - } else - { - // Check if all the required dir exists - msg.CMW($"Checking for required dirs...",true,1); - if (!Directory.Exists(@"data\")) + // Check if all the required dir exists + msg.CMW($"Checking for required dirs...", true, 1); + if (!Directory.Exists(@"data\")) + { + Directory.CreateDirectory(@"data\"); + } + if (!Directory.Exists(@"gen\")) + { + Directory.CreateDirectory(@"gen\"); + } + if (!Directory.Exists(@"structure\")) + { + Directory.CreateDirectory(@"structure\"); + } + + // Clean all generated data + msg.CMW($"Cleaning the base dirs...", true, 1); + CleanDirData(); + + // Clean the latest generated filter from settings path + msg.CMW($"Cleaning the last filter from path...", true, 1); + File.Delete($@"{path}\My Games\Path of Exile\MxFilter_Normal.filter"); + File.Delete($@"{path}\My Games\Path of Exile\MxFilter_Strict.filter"); + File.Delete($@"{path}\My Games\Path of Exile\MxFilter_Strict_NSNLC.filter"); + + // Get latest poe.ninja api + msg.CMW($"Downloading the latest API data from poe.ninja...", true, 1); + + web.SaveString(api + $"itemoverview?league={league}&type=UniqueArmour&language=en", "data/ninja.armour.json"); + web.SaveString(api + $"itemoverview?league={league}&type=UniqueWeapon&language=en", "data/ninja.weapon.json"); + web.SaveString(api + $"itemoverview?league={league}&type=UniqueAccessory&language=en", "data/ninja.accessory.json"); + web.SaveString(api + $"itemoverview?league={league}&type=DivinationCard&language=en", "data/ninja.card.json"); + web.SaveString(api + $"currencyoverview?league={league}&type=Currency&language=en", "data/ninja.currency.json"); + web.SaveString(api + $"itemoverview?league={league}&type=Fossil&language=en", "data/ninja.fossil.json"); + + // Generate Filter Array + string[] filters; + filters = new string[] { "Normal", "Strict", "Strict_NSNLC" }; + + foreach (string f in filters) + { + // Setup basic variable + string filter_name = "MxFilter"; + + // Get the structure list + var js = web.ReadString($@"{giturl}/PoE-MxFilter-Structure/master/{f}.json"); + RootStructure j = JsonConvert.DeserializeObject(js); + + // Read the structure one by one to process gen + // Generator (dlls) are downloaded from the web and executed in a separate AppDomain before the AD is unloaded to execute a new generator. + // As we CAN'T unload an assembly, using AppDomains is the only way we can load/unload multiple assembly in a row. + msg.CMW($@"Generating the {f} filter using {j.structures.Count} source(s)...", true, 1); + ftotal = j.structures.Count; + foreach (var sec in j.structures) { - Directory.CreateDirectory(@"data\"); - } - if (!Directory.Exists(@"gen\")) - { - Directory.CreateDirectory(@"gen\"); - } - if (!Directory.Exists(@"structure\")) - { - Directory.CreateDirectory(@"structure\"); - } - - // Clean all generated data - msg.CMW($"Cleaning the base dirs...", true, 1); - CleanDirData(); - - // Clean the latest generated filter from settings path - msg.CMW($"Cleaning the last filter from path...", true, 1); - File.Delete($@"{path}\My Games\Path of Exile\MxFilter_Normal.filter"); - File.Delete($@"{path}\My Games\Path of Exile\MxFilter_Strict.filter"); - if (File.Exists($@"{path}\My Games\Path of Exile\MxFilter.filter")) { File.Delete($@"{path}\My Games\Path of Exile\MxFilter.filter"); } - - // Get latest poe.ninja api - msg.CMW($"Downloading the latest API data from poe.ninja...", true, 1); - - web.SaveString(api + $"itemoverview?league={league}&type=UniqueArmour&language=en", "data/ninja.armour.json"); - web.SaveString(api + $"itemoverview?league={league}&type=UniqueWeapon&language=en", "data/ninja.weapon.json"); - web.SaveString(api + $"itemoverview?league={league}&type=UniqueAccessory&language=en", "data/ninja.accessory.json"); - web.SaveString(api + $"itemoverview?league={league}&type=DivinationCard&language=en", "data/ninja.card.json"); - web.SaveString(api + $"currencyoverview?league={league}&type=Currency&language=en", "data/ninja.currency.json"); - web.SaveString(api + $"itemoverview?league={league}&type=Fossil&language=en", "data/ninja.fossil.json"); - - // Get Theme File(s) - web.DownloadFile($@"{giturl}/PoE-MxFilter-Structure/master/Chancing.json", @"structure\Chancing.json"); - - // Generate Filter Array - string[] filters; - if (json.settings.GetSSF()) { filters = new string[] { "SSF" }; } else { filters = new string[] { "Normal", "Strict" }; } - - foreach(string f in filters) - { - // Setup basic variable - string filter_name = "MxFilter"; - - // Get the structure list - var js = web.ReadString($@"{giturl}/PoE-MxFilter-Structure/master/{f}.json"); - RootStructure j = JsonConvert.DeserializeObject(js); - - // Read the structure one by one to process gen - // Generator (dlls) are downloaded from the web and executed in a separate AppDomain before the AD is unloaded to execute a new generator. - // As we CAN'T unload an assembly, using AppDomains is the only way we can load/unload multiple assembly in a row. - msg.CMW($@"Generating the {f} filter using {j.structures.Count} source(s)...", true, 1); - ftotal = j.structures.Count; - foreach (var sec in j.structures) + if (sec.gen == true) { - if (sec.gen == true) + fprog = fprog + 1; + msg.drawProgress(fprog, ftotal); + //msg.CMW(string.Format("REMOTE_GEN {0}", sec.section), true, 1); + web.DownloadFile($@"{giturl}/PoE-MxFilter-Structure/master/{f}/{sec.section}.dll", $@"structure\{sec.section}.dll"); + json.settings.WriteSection(sec.section); + var bytes = GenerateAssemblyAndGetRawBytes(sec.section); + + var appDomain = AppDomain.CreateDomain(sec.section, null, new AppDomainSetup { - fprog = fprog + 1; - msg.drawProgress(fprog, ftotal); - //msg.CMW(string.Format("REMOTE_GEN {0}", sec.section), true, 1); - web.DownloadFile($@"{giturl}/PoE-MxFilter-Structure/master/{f}/{sec.section}.dll", $@"structure\{sec.section}.dll"); - json.settings.WriteSection(sec.section); - var bytes = GenerateAssemblyAndGetRawBytes(sec.section); + ShadowCopyFiles = "true", + LoaderOptimization = LoaderOptimization.MultiDomainHost + }); - var appDomain = AppDomain.CreateDomain(sec.section, null, new AppDomainSetup - { - ShadowCopyFiles = "true", - LoaderOptimization = LoaderOptimization.MultiDomainHost - }); + var assmblyLoaderType = typeof(AssmeblyLoader); + var assemblyLoader = (IAssemblyLoader)appDomain.CreateInstanceFromAndUnwrap(assmblyLoaderType.Assembly.Location, assmblyLoaderType.FullName); + assemblyLoader.Load(bytes); - var assmblyLoaderType = typeof(AssmeblyLoader); - var assemblyLoader = (IAssemblyLoader)appDomain.CreateInstanceFromAndUnwrap(assmblyLoaderType.Assembly.Location, assmblyLoaderType.FullName); - assemblyLoader.Load(bytes); - - AppDomain.Unload(appDomain); - } - else - { - fprog = fprog + 1; - msg.drawProgress(fprog, ftotal); - //msg.CMW($@"REMOTE_GET {sec.section}", true, 1); - web.SaveString($@"{giturl}/PoE-MxFilter-Structure/master/{f}/{sec.section}.filter", $"structure/{sec.section}.filter"); - } + AppDomain.Unload(appDomain); } - - // Create the final filter. - msg.CMW($@"Creating the final filter...", true, 1); - foreach (var sec in j.structures) + else { - if (sec.gen == true) - { - File.AppendAllText($@"{path}\My Games\Path of Exile\{filter_name}_{f}.filter", File.ReadAllText(string.Format("gen\\{0}.filter", sec.section))); - File.AppendAllText($@"{path}\My Games\Path of Exile\{filter_name}_{f}.filter", "" + Environment.NewLine); - File.AppendAllText($@"{path}\My Games\Path of Exile\{filter_name}_{f}.filter", "" + Environment.NewLine); - } - else - { - File.AppendAllText($@"{path}\My Games\Path of Exile\{filter_name}_{f}.filter", string.Format("# Section: {0}", sec.section) + Environment.NewLine); - File.AppendAllText($@"{path}\My Games\Path of Exile\{filter_name}_{f}.filter", "" + Environment.NewLine); - File.AppendAllText($@"{path}\My Games\Path of Exile\{filter_name}_{f}.filter", File.ReadAllText(string.Format("structure\\{0}.filter", sec.section))); - File.AppendAllText($@"{path}\My Games\Path of Exile\{filter_name}_{f}.filter", "" + Environment.NewLine); - File.AppendAllText($@"{path}\My Games\Path of Exile\{filter_name}_{f}.filter", "" + Environment.NewLine); - } + fprog = fprog + 1; + msg.drawProgress(fprog, ftotal); + //msg.CMW($@"REMOTE_GET {sec.section}", true, 1); + web.SaveString($@"{giturl}/PoE-MxFilter-Structure/master/{f}/{sec.section}.filter", $"structure/{sec.section}.filter"); } - ftotal = 0; - fprog = 0; - CleanDir(); - } - - // Download the sounds from the remote list - msg.CMW($@"Downloading the latest sound...", true, 1); - var sl = web.ReadString("https://raw.githubusercontent.com/mikxqc/PoE-MxFilter-Data/master/json/mxfiltergen_sound.json"); - REMSND slj = JsonConvert.DeserializeObject(sl); - stotal = slj.sound.Count; - foreach (string s in slj.sound) - { - sprog = sprog + 1; - msg.drawProgress(sprog, stotal); - if (File.Exists($@"{path}\My Games\Path of Exile\{s}")) { File.Delete($@"{path}\My Games\Path of Exile\{s}"); } - web.DownloadFile($"https://raw.githubusercontent.com/mikxqc/PoE-MxFilter-Data/master/mp3/{s}",$@"{path}\My Games\Path of Exile\{s}"); } - // Clean all generated data - CleanDirData(); - } + // Create the final filter. + msg.CMW($@"Creating the final filter...", true, 1); + foreach (var sec in j.structures) + { + if (sec.gen == true) + { + File.AppendAllText($@"{path}\My Games\Path of Exile\{filter_name}_{f}.filter", File.ReadAllText(string.Format("gen\\{0}.filter", sec.section))); + File.AppendAllText($@"{path}\My Games\Path of Exile\{filter_name}_{f}.filter", "" + Environment.NewLine); + File.AppendAllText($@"{path}\My Games\Path of Exile\{filter_name}_{f}.filter", "" + Environment.NewLine); + } + else + { + File.AppendAllText($@"{path}\My Games\Path of Exile\{filter_name}_{f}.filter", string.Format("# Section: {0}", sec.section) + Environment.NewLine); + File.AppendAllText($@"{path}\My Games\Path of Exile\{filter_name}_{f}.filter", "" + Environment.NewLine); + File.AppendAllText($@"{path}\My Games\Path of Exile\{filter_name}_{f}.filter", File.ReadAllText(string.Format("structure\\{0}.filter", sec.section))); + File.AppendAllText($@"{path}\My Games\Path of Exile\{filter_name}_{f}.filter", "" + Environment.NewLine); + File.AppendAllText($@"{path}\My Games\Path of Exile\{filter_name}_{f}.filter", "" + Environment.NewLine); + } + } + ftotal = 0; + fprog = 0; + CleanDir(); + } + + // Download the sounds from the remote list + msg.CMW($@"Downloading the latest sound...", true, 1); + var sl = web.ReadString("https://raw.githubusercontent.com/mikxqc/PoE-MxFilter-Data/master/json/mxfiltergen_sound.json"); + REMSND slj = JsonConvert.DeserializeObject(sl); + stotal = slj.sound.Count; + foreach (string s in slj.sound) + { + sprog = sprog + 1; + msg.drawProgress(sprog, stotal); + if (File.Exists($@"{path}\My Games\Path of Exile\{s}")) { File.Delete($@"{path}\My Games\Path of Exile\{s}"); } + web.DownloadFile($"https://raw.githubusercontent.com/mikxqc/PoE-MxFilter-Data/master/mp3/{s}", $@"{path}\My Games\Path of Exile\{s}"); + } + + // Clean all generated data + CleanDirData(); } private static byte[] GenerateAssemblyAndGetRawBytes(string dll) @@ -264,6 +258,11 @@ namespace PoE_MxFilterGen file.Delete(); } } + + private static void AutoUpdater_ApplicationExitEvent() + { + System.Environment.Exit(-1); + } } public interface IAssemblyLoader @@ -280,8 +279,8 @@ namespace PoE_MxFilterGen Type type = AppDomain.CurrentDomain.GetAssemblies().SelectMany(t => t.GetTypes()).Where(t => String.Equals(t.Name, "Generator", StringComparison.Ordinal)).First(); object o = Activator.CreateInstance(type); MethodInfo mi = o.GetType().GetMethod("Gen"); - Object[] ob = new object[] { json.settings.GetSection(), json.settings.GetAPI(), main.league, json.settings.GetMinimumValue() }; + Object[] ob = new object[] { json.settings.GetSection(), "tobedeleted", main.league, json.settings.GetUniqueValue(), json.settings.GetFossilValue(), json.settings.GetCardValue() }; mi.Invoke(o, ob); } - } + } } diff --git a/PoE-MxFilterGen/obj/Debug/mxfiltergen.exe b/PoE-MxFilterGen/obj/Debug/mxfiltergen.exe index c7b824f0ebf2e71d5c5569f7f0247f4003f1c806..a4fb9f7f0f4202df8eee977fb6a64ca319833e9f 100644 GIT binary patch delta 17795 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 A>Hq)$ delta 17263 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 diff --git a/PoE-MxFilterGen/obj/Debug/mxfiltergen.pdb b/PoE-MxFilterGen/obj/Debug/mxfiltergen.pdb index 3d019623a87610cd1c947bc007a01e9f1c87b6fe..952289f4eeb370b1a69f00bbb54bc074c1cb32f2 100644 GIT binary patch delta 17594 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