From e6c4b928f6c95033eafa7ec8cd4748b24423e08a Mon Sep 17 00:00:00 2001 From: zznty <94796179+zznty@users.noreply.github.com> Date: Mon, 21 Nov 2022 22:37:02 +0700 Subject: [PATCH] add support for block limiter configs --- TorchRemote.Plugin/Managers/SettingManager.cs | 44 ++++++++++++++++--- TorchRemote.Plugin/manifest.xml | 2 +- 2 files changed, 39 insertions(+), 7 deletions(-) diff --git a/TorchRemote.Plugin/Managers/SettingManager.cs b/TorchRemote.Plugin/Managers/SettingManager.cs index f3ee387..ac369d5 100644 --- a/TorchRemote.Plugin/Managers/SettingManager.cs +++ b/TorchRemote.Plugin/Managers/SettingManager.cs @@ -6,6 +6,7 @@ using Json.Schema.Generation; using NLog; using Torch; using Torch.API; +using Torch.API.Plugins; using Torch.Managers; using Torch.Server; using Torch.Server.Managers; @@ -17,8 +18,18 @@ namespace TorchRemote.Plugin.Managers; public class SettingManager : Manager { + private const string BlockLimiterGuid = "11fca5c4-01b6-4fc3-a215-602e2325be2b"; + private const string BlockLimiterPointSusGuid = "91CA8ED2-AB79-4538-BADC-0EE67F62A906"; + private const BindingFlags Flags = BindingFlags.Static | BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic; + private static readonly ILogger Log = LogManager.GetCurrentClassLogger(); + private readonly Dictionary _pluginsCustomConfigPath = new() + { + [new(BlockLimiterGuid)] = ("BlockLimiter.Settings.BlockLimiterConfig", "_instance"), + [new(BlockLimiterPointSusGuid)] = ("BlockLimiter.Settings.BlockLimiterConfig", "_instance"), + }; + [Dependency] private readonly InstanceManager _instanceManager = null!; [Dependency] @@ -37,10 +48,14 @@ public class SettingManager : Manager foreach (var plugin in _pluginManager.Plugins.Values) { + if (_pluginsCustomConfigPath.TryGetValue(plugin.Id, out var tuple)) + { + RegisterCustomPluginSetting(plugin, tuple); + continue; + } + var type = plugin.GetType(); object persistentInstance; - - const BindingFlags flags = BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic; bool IsSuitable(MemberInfo m, Type t) => t.IsGenericType && typeof(Persistent<>).IsAssignableFrom(t.GetGenericTypeDefinition()) && @@ -49,8 +64,8 @@ public class SettingManager : Manager m.Name.Contains( "cfg", StringComparison.InvariantCultureIgnoreCase)); - var fields = type.GetFields(flags).Where(b => IsSuitable(b, b.FieldType)).ToArray(); - var props = type.GetProperties(flags).Where(b => IsSuitable(b, b.PropertyType)).ToArray(); + var fields = type.GetFields(Flags).Where(b => IsSuitable(b, b.FieldType)).ToArray(); + var props = type.GetProperties(Flags).Where(b => IsSuitable(b, b.PropertyType)).ToArray(); if (fields.FirstOrDefault() is { } field) { @@ -73,16 +88,33 @@ public class SettingManager : Manager var settingType = persistentType.GenericTypeArguments[0]; - RegisterSetting(plugin.Name, getter.GetValue(persistentInstance), settingType); - PluginSettings.Add(plugin.Id, settingType.FullName!); + RegisterPluginSetting(plugin, getter.GetValue(persistentInstance), settingType); } } + private void RegisterCustomPluginSetting(ITorchPlugin plugin, (string? Type, string Field) tuple) + { + var customType = tuple.Type is null ? plugin.GetType() : plugin.GetType().Assembly.GetType(tuple.Type, true); + + var field = customType.GetField(tuple.Field, Flags) ?? throw new MissingFieldException(customType.FullName, tuple.Field); + + var value = field.GetValue(field.IsStatic ? null : plugin); + + if (value is not null) + RegisterPluginSetting(plugin, value, field.FieldType); + } + private void InstanceManagerOnInstanceLoaded(ConfigDedicatedViewModel config) { RegisterSetting("Session Settings", config.SessionSettings, typeof(SessionSettingsViewModel)); } + public void RegisterPluginSetting(ITorchPlugin plugin, object value, Type settingType) + { + RegisterSetting(plugin.Name, value, settingType); + PluginSettings.Add(plugin.Id, settingType.FullName!); + } + public void RegisterSetting(string name, object value, Type type) { var builder = new JsonSchemaBuilder().FromType(type, new() diff --git a/TorchRemote.Plugin/manifest.xml b/TorchRemote.Plugin/manifest.xml index 36ae4b7..30f2e41 100644 --- a/TorchRemote.Plugin/manifest.xml +++ b/TorchRemote.Plugin/manifest.xml @@ -2,5 +2,5 @@ Torch Remote 284017F3-9682-4841-A544-EB04DB8CB9BA - v1.0.6 + v1.0.7 \ No newline at end of file