add support for block limiter configs
This commit is contained in:
@@ -6,6 +6,7 @@ using Json.Schema.Generation;
|
|||||||
using NLog;
|
using NLog;
|
||||||
using Torch;
|
using Torch;
|
||||||
using Torch.API;
|
using Torch.API;
|
||||||
|
using Torch.API.Plugins;
|
||||||
using Torch.Managers;
|
using Torch.Managers;
|
||||||
using Torch.Server;
|
using Torch.Server;
|
||||||
using Torch.Server.Managers;
|
using Torch.Server.Managers;
|
||||||
@@ -17,8 +18,18 @@ namespace TorchRemote.Plugin.Managers;
|
|||||||
|
|
||||||
public class SettingManager : Manager
|
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 static readonly ILogger Log = LogManager.GetCurrentClassLogger();
|
||||||
|
|
||||||
|
private readonly Dictionary<Guid, (string? Type, string Field)> _pluginsCustomConfigPath = new()
|
||||||
|
{
|
||||||
|
[new(BlockLimiterGuid)] = ("BlockLimiter.Settings.BlockLimiterConfig", "_instance"),
|
||||||
|
[new(BlockLimiterPointSusGuid)] = ("BlockLimiter.Settings.BlockLimiterConfig", "_instance"),
|
||||||
|
};
|
||||||
|
|
||||||
[Dependency]
|
[Dependency]
|
||||||
private readonly InstanceManager _instanceManager = null!;
|
private readonly InstanceManager _instanceManager = null!;
|
||||||
[Dependency]
|
[Dependency]
|
||||||
@@ -37,11 +48,15 @@ public class SettingManager : Manager
|
|||||||
|
|
||||||
foreach (var plugin in _pluginManager.Plugins.Values)
|
foreach (var plugin in _pluginManager.Plugins.Values)
|
||||||
{
|
{
|
||||||
|
if (_pluginsCustomConfigPath.TryGetValue(plugin.Id, out var tuple))
|
||||||
|
{
|
||||||
|
RegisterCustomPluginSetting(plugin, tuple);
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
var type = plugin.GetType();
|
var type = plugin.GetType();
|
||||||
object persistentInstance;
|
object persistentInstance;
|
||||||
|
|
||||||
const BindingFlags flags = BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic;
|
|
||||||
|
|
||||||
bool IsSuitable(MemberInfo m, Type t) =>
|
bool IsSuitable(MemberInfo m, Type t) =>
|
||||||
t.IsGenericType && typeof(Persistent<>).IsAssignableFrom(t.GetGenericTypeDefinition()) &&
|
t.IsGenericType && typeof(Persistent<>).IsAssignableFrom(t.GetGenericTypeDefinition()) &&
|
||||||
(m.Name.Contains(
|
(m.Name.Contains(
|
||||||
@@ -49,8 +64,8 @@ public class SettingManager : Manager
|
|||||||
m.Name.Contains(
|
m.Name.Contains(
|
||||||
"cfg", StringComparison.InvariantCultureIgnoreCase));
|
"cfg", StringComparison.InvariantCultureIgnoreCase));
|
||||||
|
|
||||||
var fields = type.GetFields(flags).Where(b => IsSuitable(b, b.FieldType)).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();
|
var props = type.GetProperties(Flags).Where(b => IsSuitable(b, b.PropertyType)).ToArray();
|
||||||
|
|
||||||
if (fields.FirstOrDefault() is { } field)
|
if (fields.FirstOrDefault() is { } field)
|
||||||
{
|
{
|
||||||
@@ -73,16 +88,33 @@ public class SettingManager : Manager
|
|||||||
|
|
||||||
var settingType = persistentType.GenericTypeArguments[0];
|
var settingType = persistentType.GenericTypeArguments[0];
|
||||||
|
|
||||||
RegisterSetting(plugin.Name, getter.GetValue(persistentInstance), settingType);
|
RegisterPluginSetting(plugin, getter.GetValue(persistentInstance), settingType);
|
||||||
PluginSettings.Add(plugin.Id, settingType.FullName!);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
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)
|
private void InstanceManagerOnInstanceLoaded(ConfigDedicatedViewModel config)
|
||||||
{
|
{
|
||||||
RegisterSetting("Session Settings", config.SessionSettings, typeof(SessionSettingsViewModel));
|
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)
|
public void RegisterSetting(string name, object value, Type type)
|
||||||
{
|
{
|
||||||
var builder = new JsonSchemaBuilder().FromType(type, new()
|
var builder = new JsonSchemaBuilder().FromType(type, new()
|
||||||
|
@@ -2,5 +2,5 @@
|
|||||||
<PluginManifest xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
|
<PluginManifest xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
|
||||||
<Name>Torch Remote</Name>
|
<Name>Torch Remote</Name>
|
||||||
<Guid>284017F3-9682-4841-A544-EB04DB8CB9BA</Guid>
|
<Guid>284017F3-9682-4841-A544-EB04DB8CB9BA</Guid>
|
||||||
<Version>v1.0.6</Version>
|
<Version>v1.0.7</Version>
|
||||||
</PluginManifest>
|
</PluginManifest>
|
Reference in New Issue
Block a user