From 9c06049628ba828a577b612bf46035235acc9855 Mon Sep 17 00:00:00 2001 From: sirhamsteralot Date: Thu, 27 Dec 2018 00:57:58 +0100 Subject: [PATCH 1/7] Add extra command constructor for easier use of dynamic methods. --- Torch/Commands/Command.cs | 46 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 46 insertions(+) diff --git a/Torch/Commands/Command.cs b/Torch/Commands/Command.cs index 2922f67..55d8c52 100644 --- a/Torch/Commands/Command.cs +++ b/Torch/Commands/Command.cs @@ -19,6 +19,7 @@ namespace Torch.Commands public string Name { get; } public string Description { get; } public string HelpText { get; } + public Delegate Action { get; } public Type Module { get; } public List Path { get; } = new List(); public ITorchPlugin Plugin { get; } @@ -29,6 +30,51 @@ namespace Torch.Commands private int? _requiredParamCount; private static readonly Logger Log = LogManager.GetCurrentClassLogger(); + public Command(string name, string description, Delegate action, ITorchPlugin plugin, MyPromoteLevel? minimumPromoteLevel = null, string helpText = null) + { + HelpText = helpText; + Action = action; + Plugin = plugin; + MinimumPromoteLevel = minimumPromoteLevel ?? MyPromoteLevel.Admin; + + var split = name.Split(' '); + Name = split.Last(); + Description = description; + HelpText = helpText ?? description; + + Path.AddRange(split); + + var commandMethod = action.Method; + + _method = commandMethod; + Module = commandMethod.DeclaringType; + + //parameters + _parameters = commandMethod.GetParameters(); + + var sb = new StringBuilder(); + sb.Append($"!{string.Join(" ", Path)} "); + for (var i = 0; i < _parameters.Length; i++) + { + var param = _parameters[i]; + + if (param.HasDefaultValue) + { + _requiredParamCount = _requiredParamCount ?? i; + + sb.Append($"[{param.ParameterType.Name} {param.Name}] "); + } + else + { + sb.Append($"<{param.ParameterType.Name} {param.Name}> "); + } + } + + _requiredParamCount = _requiredParamCount ?? _parameters.Length; + Log.Debug($"Params: {_parameters.Length} ({_requiredParamCount} required)"); + SyntaxHelp = sb.ToString(); + } + public Command(ITorchPlugin plugin, MethodInfo commandMethod) { Plugin = plugin; From a7c6ae7382490c78c3b225794e1d039aa17262f9 Mon Sep 17 00:00:00 2001 From: sirhamsteralot Date: Thu, 27 Dec 2018 22:57:27 +0100 Subject: [PATCH 2/7] Invoke the Action directly --- Torch/Commands/Command.cs | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/Torch/Commands/Command.cs b/Torch/Commands/Command.cs index 55d8c52..3a167ac 100644 --- a/Torch/Commands/Command.cs +++ b/Torch/Commands/Command.cs @@ -15,11 +15,13 @@ namespace Torch.Commands { public class Command { + public delegate void CommandAction(CommandContext context, object[] arguments); + public MyPromoteLevel MinimumPromoteLevel { get; } public string Name { get; } public string Description { get; } public string HelpText { get; } - public Delegate Action { get; } + public CommandAction Action { get; } public Type Module { get; } public List Path { get; } = new List(); public ITorchPlugin Plugin { get; } @@ -30,7 +32,7 @@ namespace Torch.Commands private int? _requiredParamCount; private static readonly Logger Log = LogManager.GetCurrentClassLogger(); - public Command(string name, string description, Delegate action, ITorchPlugin plugin, MyPromoteLevel? minimumPromoteLevel = null, string helpText = null) + public Command(string name, string description, CommandAction action, ITorchPlugin plugin, MyPromoteLevel? minimumPromoteLevel = null, string helpText = null) { HelpText = helpText; Action = action; @@ -155,6 +157,11 @@ namespace Torch.Commands parameters[i] = _parameters[i].DefaultValue; } + if (Action != null) + { + Action.Invoke(context, parameters); + return true; + } var moduleInstance = (CommandModule)Activator.CreateInstance(Module); moduleInstance.Context = context; _method.Invoke(moduleInstance, parameters); From 68e6774e26d674512617813247f7318011688485 Mon Sep 17 00:00:00 2001 From: sirhamsteralot Date: Thu, 27 Dec 2018 23:13:54 +0100 Subject: [PATCH 3/7] performed an Exterminatus on code that doesnt work with the new Delegate system. --- Torch/Commands/Command.cs | 69 ++++++++++++++------------------------- 1 file changed, 24 insertions(+), 45 deletions(-) diff --git a/Torch/Commands/Command.cs b/Torch/Commands/Command.cs index 3a167ac..74cfbe8 100644 --- a/Torch/Commands/Command.cs +++ b/Torch/Commands/Command.cs @@ -32,7 +32,7 @@ namespace Torch.Commands private int? _requiredParamCount; private static readonly Logger Log = LogManager.GetCurrentClassLogger(); - public Command(string name, string description, CommandAction action, ITorchPlugin plugin, MyPromoteLevel? minimumPromoteLevel = null, string helpText = null) + public Command(string name, string description, CommandAction action, ITorchPlugin plugin, MyPromoteLevel? minimumPromoteLevel = null, string helpText = null, int requiredParamCount = 0) { HelpText = helpText; Action = action; @@ -46,34 +46,11 @@ namespace Torch.Commands Path.AddRange(split); - var commandMethod = action.Method; - - _method = commandMethod; - Module = commandMethod.DeclaringType; - - //parameters - _parameters = commandMethod.GetParameters(); - var sb = new StringBuilder(); sb.Append($"!{string.Join(" ", Path)} "); - for (var i = 0; i < _parameters.Length; i++) - { - var param = _parameters[i]; - if (param.HasDefaultValue) - { - _requiredParamCount = _requiredParamCount ?? i; - - sb.Append($"[{param.ParameterType.Name} {param.Name}] "); - } - else - { - sb.Append($"<{param.ParameterType.Name} {param.Name}> "); - } - } - - _requiredParamCount = _requiredParamCount ?? _parameters.Length; - Log.Debug($"Params: {_parameters.Length} ({_requiredParamCount} required)"); + _requiredParamCount = requiredParamCount; + Log.Debug($"Params: ({_requiredParamCount} required)"); SyntaxHelp = sb.ToString(); } @@ -136,35 +113,37 @@ namespace Torch.Commands { try { + var invokeByAction = Action != null; var parameters = new object[_parameters.Length]; if (context.Args.Count < _requiredParamCount) return false; - //Convert args from string - for (var i = 0; i < _parameters.Length && i < context.Args.Count; i++) + if (!invokeByAction) { - if (context.Args[i].TryConvert(_parameters[i].ParameterType, out object obj)) - parameters[i] = obj; - else - return false; - } + //Convert args from string + for (var i = 0; i < _parameters.Length && i < context.Args.Count; i++) + { + if (context.Args[i].TryConvert(_parameters[i].ParameterType, out object obj)) + parameters[i] = obj; + else + return false; + } - //Fill remaining parameters with default values - for (var i = 0; i < parameters.Length; i++) - { - if (parameters[i] == null) - parameters[i] = _parameters[i].DefaultValue; - } + //Fill remaining parameters with default values + for (var i = 0; i < parameters.Length; i++) + { + if (parameters[i] == null) + parameters[i] = _parameters[i].DefaultValue; + } - if (Action != null) - { - Action.Invoke(context, parameters); + var moduleInstance = (CommandModule)Activator.CreateInstance(Module); + moduleInstance.Context = context; + _method.Invoke(moduleInstance, parameters); return true; } - var moduleInstance = (CommandModule)Activator.CreateInstance(Module); - moduleInstance.Context = context; - _method.Invoke(moduleInstance, parameters); + + Action.Invoke(context, parameters); return true; } catch (Exception e) From 8625db7ae4ec966b3eb2b94ef709c81e3ca0cd70 Mon Sep 17 00:00:00 2001 From: sirhamsteralot Date: Thu, 27 Dec 2018 23:21:29 +0100 Subject: [PATCH 4/7] fixed nullref crash when invoking --- Torch/Commands/Command.cs | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/Torch/Commands/Command.cs b/Torch/Commands/Command.cs index 74cfbe8..966a5ce 100644 --- a/Torch/Commands/Command.cs +++ b/Torch/Commands/Command.cs @@ -114,13 +114,15 @@ namespace Torch.Commands try { var invokeByAction = Action != null; - var parameters = new object[_parameters.Length]; + object[] parameters; if (context.Args.Count < _requiredParamCount) return false; if (!invokeByAction) { + parameters = new object[_parameters.Length]; + //Convert args from string for (var i = 0; i < _parameters.Length && i < context.Args.Count; i++) { From e7065a7159ac31a44faaa739349deed5d2f242ab Mon Sep 17 00:00:00 2001 From: sirhamsteralot Date: Thu, 27 Dec 2018 23:27:47 +0100 Subject: [PATCH 5/7] forgot to actually fill the parameters --- Torch/Commands/Command.cs | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/Torch/Commands/Command.cs b/Torch/Commands/Command.cs index 966a5ce..0956059 100644 --- a/Torch/Commands/Command.cs +++ b/Torch/Commands/Command.cs @@ -143,6 +143,17 @@ namespace Torch.Commands moduleInstance.Context = context; _method.Invoke(moduleInstance, parameters); return true; + } else + { + parameters = new object[context.Args.Count]; + + for (var i = 0; i < parameters.Length && i < context.Args.Count; i++) + { + if (context.Args[i].TryConvert(_parameters[i].ParameterType, out object obj)) + parameters[i] = obj; + else + return false; + } } Action.Invoke(context, parameters); From 7fd814d5954ea5963503efc5046f19c23521afbc Mon Sep 17 00:00:00 2001 From: sirhamsteralot Date: Thu, 27 Dec 2018 23:40:56 +0100 Subject: [PATCH 6/7] fix arrayoutofboundsthing --- Torch/Commands/Command.cs | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/Torch/Commands/Command.cs b/Torch/Commands/Command.cs index 0956059..ffc303c 100644 --- a/Torch/Commands/Command.cs +++ b/Torch/Commands/Command.cs @@ -149,10 +149,7 @@ namespace Torch.Commands for (var i = 0; i < parameters.Length && i < context.Args.Count; i++) { - if (context.Args[i].TryConvert(_parameters[i].ParameterType, out object obj)) - parameters[i] = obj; - else - return false; + parameters[i] = context.Args[i]; } } From c9adb2a2123196484a6a4fe160056dd16faa9c31 Mon Sep 17 00:00:00 2001 From: sirhamsteralot Date: Fri, 28 Dec 2018 02:11:24 +0100 Subject: [PATCH 7/7] add a way to delete nodes from the tree --- Torch/Commands/CommandTree.cs | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/Torch/Commands/CommandTree.cs b/Torch/Commands/CommandTree.cs index 4871a72..d67a177 100644 --- a/Torch/Commands/CommandTree.cs +++ b/Torch/Commands/CommandTree.cs @@ -141,6 +141,19 @@ namespace Torch.Commands } } + public bool DeleteNode(CommandNode node) + { + if (node.Parent != null) + { + node.Parent.RemoveNode(node); + return true; + } + if (node.Command?.Path != null) + return _root.Remove(node.Command.Path.First()); + + return false; + } + private void DebugNode(CommandNode commandNode, StringBuilder sb, ref int indent) { sb.AppendLine(new string(' ', indent) + commandNode.Name);