From 25bd5efe91312115c24571091ff65d03dddc5e25 Mon Sep 17 00:00:00 2001 From: Limiana <5073202+Limiana@users.noreply.github.com> Date: Mon, 30 Dec 2024 20:50:32 +0300 Subject: [PATCH] Enhance dtr bar display --- Splatoon/Gui/Priority/PriorityPopupWindow.cs | 2 +- Splatoon/Gui/Scripting/TabScripting.cs | 4 +- Splatoon/Services/InfoBar.cs | 3 +- Splatoon/Splatoon.cs | 8 +-- .../SplatoonScripting/ScriptingProcessor.cs | 67 ++++++++++++++++--- 5 files changed, 65 insertions(+), 19 deletions(-) diff --git a/Splatoon/Gui/Priority/PriorityPopupWindow.cs b/Splatoon/Gui/Priority/PriorityPopupWindow.cs index 4d02e8d0..f10c660a 100644 --- a/Splatoon/Gui/Priority/PriorityPopupWindow.cs +++ b/Splatoon/Gui/Priority/PriorityPopupWindow.cs @@ -264,7 +264,7 @@ internal int GetOrderedRoleIndex(Job job) public bool ShouldAutoOpen() { - return ScriptingProcessor.Scripts.Any(x => !x.IsDisabledByUser && x.InternalData.ContainsPriorityLists() && x.ValidTerritories?.Contains(this.TerritoryType) == true && !P.Config.NoPrioPopupTerritories.Contains(this.TerritoryType)) && !Svc.Condition[ConditionFlag.DutyRecorderPlayback]; + return ScriptingProcessor.AnyScriptUsesPriority(this.TerritoryType) && !P.Config.NoPrioPopupTerritories.Contains(this.TerritoryType) && !Svc.Condition[ConditionFlag.DutyRecorderPlayback]; } public void Open(bool force) diff --git a/Splatoon/Gui/Scripting/TabScripting.cs b/Splatoon/Gui/Scripting/TabScripting.cs index 8bfe353b..bcb5eb1e 100644 --- a/Splatoon/Gui/Scripting/TabScripting.cs +++ b/Splatoon/Gui/Scripting/TabScripting.cs @@ -276,7 +276,7 @@ void DrawScriptGroup(IEnumerable scripts) { P.Config.DisabledScripts.Add(script.InternalData.FullName); } - ScriptingProcessor.Scripts.ForEach(x => x.UpdateState()); + ScriptingProcessor.Scripts.Each(x => x.UpdateState()); } ImGuiEx.Tooltip(e ? "Enable script".Loc() : "Disable script".Loc()); } @@ -332,7 +332,7 @@ void DrawScriptGroup(IEnumerable scripts) new TickScheduler(() => { script.Disable(); - ScriptingProcessor.Scripts = ScriptingProcessor.Scripts.Remove(script); + ScriptingProcessor.RemoveScript(script); DeleteFileToRecycleBin(script.InternalData.Path); }); } diff --git a/Splatoon/Services/InfoBar.cs b/Splatoon/Services/InfoBar.cs index 9d011dde..869b0c28 100644 --- a/Splatoon/Services/InfoBar.cs +++ b/Splatoon/Services/InfoBar.cs @@ -4,6 +4,7 @@ using ECommons.EzEventManager; using ECommons.GameHelpers; using Splatoon.Gui.Priority; +using Splatoon.SplatoonScripting; using System; using System.Collections.Generic; using System.Linq; @@ -33,7 +34,7 @@ public void Update(bool force) { try { - Entry.Shown = true; + Entry.Shown = ScriptingProcessor.AnyScriptUsesPriority(); var newRole = -1; if(P.PriorityPopupWindow?.Assignments != null) { diff --git a/Splatoon/Splatoon.cs b/Splatoon/Splatoon.cs index 53c75440..e43c7754 100644 --- a/Splatoon/Splatoon.cs +++ b/Splatoon/Splatoon.cs @@ -380,7 +380,7 @@ internal void TerritoryChangedEvent(ushort e) { ResetLayout(l); } - ScriptingProcessor.Scripts.ForEach(x => x.Controller.Layouts.Values.Each(ResetLayout)); + ScriptingProcessor.Scripts.Each(x => x.Controller.Layouts.Values.Each(ResetLayout)); AttachedInfo.VFXInfos.Clear(); Logger.OnTerritoryChanged(); ScriptingProcessor.TerritoryChanged(); @@ -505,7 +505,7 @@ internal void Tick(IFramework framework) ResetLayout(l); } } - ScriptingProcessor.Scripts.ForEach(x => x.Controller.Layouts.Values.Each(ResetLayout)); + ScriptingProcessor.Scripts.Each(x => x.Controller.Layouts.Values.Each(ResetLayout)); } } @@ -550,8 +550,8 @@ internal void Tick(IFramework framework) ProcessLayout(i); } - ScriptingProcessor.Scripts.ForEach(x => { if(x.IsEnabled) x.Controller.Layouts.Values.Each(ProcessLayout); }); - ScriptingProcessor.Scripts.ForEach(x => { if(x.IsEnabled || x.InternalData.UnconditionalDraw) x.Controller.Elements.Each(z => S.RenderManager.GetRenderer(z.Value).ProcessElement(z.Value, null, x.InternalData.UnconditionalDraw && x.InternalData.UnconditionalDrawElements.Contains(z.Key))); }); + ScriptingProcessor.Scripts.Each(x => { if(x.IsEnabled) x.Controller.Layouts.Values.Each(ProcessLayout); }); + ScriptingProcessor.Scripts.Each(x => { if(x.IsEnabled || x.InternalData.UnconditionalDraw) x.Controller.Elements.Each(z => S.RenderManager.GetRenderer(z.Value).ProcessElement(z.Value, null, x.InternalData.UnconditionalDraw && x.InternalData.UnconditionalDrawElements.Contains(z.Key))); }); foreach(var e in InjectedElements) { S.RenderManager.GetRenderer(e).ProcessElement(e); diff --git a/Splatoon/SplatoonScripting/ScriptingProcessor.cs b/Splatoon/SplatoonScripting/ScriptingProcessor.cs index 57ad1cb8..216fa92b 100644 --- a/Splatoon/SplatoonScripting/ScriptingProcessor.cs +++ b/Splatoon/SplatoonScripting/ScriptingProcessor.cs @@ -4,6 +4,7 @@ using FFXIVClientStructs.FFXIV.Client.Game; using Splatoon.Gui.Scripting; using System.Collections.Immutable; +using System.Diagnostics; using System.Security.Cryptography; using System.Text.RegularExpressions; using System.Threading; @@ -12,11 +13,12 @@ namespace Splatoon.SplatoonScripting; internal static partial class ScriptingProcessor { - internal static ImmutableList Scripts = ImmutableList.Empty; + private static ImmutableList ScriptsInternal = []; + internal static IReadOnlyList Scripts => ScriptsInternal; internal static ConcurrentQueue<(string code, string path)> LoadScriptQueue = new(); internal static volatile bool ThreadIsRunning = false; - internal readonly static string[] TrustedURLs = new string[] - { + internal readonly static string[] TrustedURLs = + [ "https://github.com/NightmareXIV/", "https://www.github.com/NightmareXIV/", "https://raw.githubusercontent.com/NightmareXIV/", @@ -24,11 +26,54 @@ internal static partial class ScriptingProcessor "https://www.github.com/PunishXIV/", "https://raw.githubusercontent.com/PunishXIV/", "https://nightmarexiv.com/" - }; + ]; internal static ImmutableList Blacklist = ImmutableList.Empty; internal static volatile bool UpdateCompleted = false; internal static List ForceUpdate = []; + internal static void AddScript(SplatoonScript script) + { + AssertOnFrameworkThread(); + ScriptsInternal = ScriptsInternal.Add(script); + S.InfoBar?.Update(true); + } + + internal static void RemoveScript(SplatoonScript script) + { + AssertOnFrameworkThread(); + ScriptsInternal = ScriptsInternal.Remove(script); + S.InfoBar?.Update(true); + } + + internal static void RemoveScripts(Predicate predicate) + { + AssertOnFrameworkThread(); + ArgumentNullException.ThrowIfNull(predicate); + ScriptsInternal = ScriptsInternal.RemoveAll(predicate); + S.InfoBar?.Update(true); + } + + internal static void ClearScripts() + { + AssertOnFrameworkThread(); + ScriptsInternal = ScriptsInternal.Clear(); + S.InfoBar?.Update(true); + } + + private static void AssertOnFrameworkThread() + { + if(!Svc.Framework.IsInFrameworkUpdateThread) + { + PluginLog.Error($"Operation performed outside of allowed bounds. Please report this to developer.\n{new StackTrace(true)}"); + } + } + + internal static bool AnyScriptUsesPriority(uint? territory = null) + { + territory ??= Svc.ClientState.TerritoryType; + return ScriptingProcessor.Scripts.Any(x => !x.IsDisabledByUser && x.InternalData.ContainsPriorityLists() && x.ValidTerritories?.Contains(territory.Value) == true); + } + internal static string ExtractNamespaceFromCode(string code) { var regex = NamespaceRegex(); @@ -208,8 +253,8 @@ internal static void ReloadAll() return; } UpdateCompleted = false; - Scripts.ForEach(x => x.Disable()); - Scripts = ImmutableList.Empty; + Scripts.Each(x => x.Disable()); + ClearScripts(); var dir = Path.Combine(Svc.PluginInterface.GetPluginConfigDirectory(), "Scripts"); if(!Directory.Exists(dir)) { @@ -229,7 +274,7 @@ internal static void ReloadScript(SplatoonScript s) return; } s.Disable(); - Scripts = Scripts.Remove(s); + RemoveScript(s); CompileAndLoad(File.ReadAllText(s.InternalData.Path, Encoding.UTF8), s.InternalData.Path, false); } @@ -243,7 +288,7 @@ internal static void ReloadScripts(IEnumerable scripts, bool isF foreach(var s in scripts) { s.Disable(); - Scripts = Scripts.Remove(s); + RemoveScript(s); CompileAndLoad(File.ReadAllText(s.InternalData.Path, Encoding.UTF8), s.InternalData.Path, isFirst); } } @@ -330,10 +375,10 @@ internal static void CompileAndLoad(string sourceCode, string fpath, bool isFirs previousVersion = loadedScript.Metadata?.Version ?? 0; result.path = loadedScript.InternalData.Path; loadedScript.Disable(); - Scripts = Scripts.RemoveAll(x => ReferenceEquals(loadedScript, x)); + RemoveScripts(x => ReferenceEquals(loadedScript, x)); rewrite = true; } - Scripts = Scripts.Add(instance); + AddScript(instance); if(result.path == null) { var dir = Path.Combine(Svc.PluginInterface.GetPluginConfigDirectory(), "Scripts", instance.InternalData.Namespace); @@ -779,7 +824,7 @@ internal static void Dispose() { Scripts[i].Disable(); } - Scripts = ImmutableList.Empty; + ClearScripts(); } internal static void LogError(this SplatoonScript s, Exception e, string methodName)