add support for block limiter configs

This commit is contained in:
zznty
2022-11-21 22:37:02 +07:00
parent d16cdd11a1
commit e6c4b928f6
2 changed files with 39 additions and 7 deletions

View File

@@ -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()

View File

@@ -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>