using System; using System.Collections.Concurrent; using Dalamud.Plugin; using KamiToolKit.Classes; using Serilog.Events; namespace KamiToolKit; public static class KamiToolKitLibrary { internal static bool IsInitialized { get; private set; } internal static ConcurrentDictionary? AllocatedNodes; internal static string? DefaultWindowSubtitle; /// /// Main initialization method for KamiToolKit. This method is required to be invoked before any KamiToolKit features are used. /// Failure to do so will not result in any direct warnings, but will result in undefined behavior. /// public static void Initialize(IDalamudPluginInterface pluginInterface, string? defaultWindowSubtitle = null) { IsInitialized = true; DefaultWindowSubtitle = defaultWindowSubtitle; // Inject non-Experimental Properties pluginInterface.Inject(DalamudInterface.Instance); DalamudInterface.Instance.GameInteropProvider.InitializeFromAttributes(DalamudInterface.Instance); // Create node data share AllocatedNodes = DalamudInterface.Instance.PluginInterface.GetOrCreateData("KamiToolKitAllocatedNodes", () => new ConcurrentDictionary()); // Inject Experimental Properties pluginInterface.Inject(Experimental.Instance); DalamudInterface.Instance.GameInteropProvider.InitializeFromAttributes(Experimental.Instance); Experimental.Instance.EnableHooks(); // Force enable Verbose so that users are able to get advanced logging information on request. DalamudInterface.Instance.Log.MinimumLogLevel = LogEventLevel.Verbose; DalamudInterface.Instance.Log.Info($"KamiToolKit initialized for {pluginInterface.InternalName}"); } /// /// Alias for Cleanup /// public static void Dispose() => Cleanup(); /// /// Alias for Cleanup /// public static void Shutdown() => Cleanup(); /// /// Cleans up any potentially leaked resources that KamiToolKit has allocated. /// public static void Cleanup() { if (MainThreadSafety.TryAssertMainThread()) return; NodeBase.DisposeNodes(); NativeAddon.DisposeAddons(); DalamudInterface.Instance.PluginInterface.RelinquishData("KamiToolKitAllocatedNodes"); Experimental.Instance.DisposeHooks(); } }