public XmppBotCommand(string helpInfo, PluginMethod method) { this.HelpInfo = HelpInfo; this.Method = method; }
public XmppBotCommand(string helpInfo, PluginMethod method) { this.HelpInfo = helpInfo; this.Method = method; }
private static void AttemptPluginExecution(Plugin plg, PluginMethod mthd, string[] args) { var asms = AppDomain.CurrentDomain.GetAssemblies(); var hasRun = false; foreach (var asm in asms) { foreach (var t in asm.GetExportedTypes() .Where(itm => itm?.Assembly?.FullName?.ToLower() == plg.AssemblyName.ToLower())) { if (string.Equals(t.Name, plg.ClassName, StringComparison.CurrentCultureIgnoreCase)) { var methods = t.GetMethods().Where(itm => itm.Name.ToLower() == mthd.MethodName.ToLower()); foreach (var method in methods) { var parameters = method.GetParameters(); var obj = new List <object>(); var matching = parameters.Length == args.Length; if (!matching) { continue; } for (var i = 0; i < parameters.Length; i++) { var parameter = parameters[i]; var access = SingleOperators .FirstOrDefault(itm => itm.Value == SingleOperator.VariableAccess).Key.ToString(); if (args[i].StartsWith(access)) { var tmp = args[i].Replace(access, ""); if (GetInstance(tmp, out var instance)) { if (instance.Value.GetType() != parameter.ParameterType) { matching = false; break; } obj.Add(instance.Value); } else { throw new RuntimeException( $"ERROR: No matching variable '{tmp}' in current scope"); } } else if (i >= 0 && args.Length > i) { if (parameter.ParameterType.ToString().ToLower() == "system.string") { if (args[i].StartsWith('"') && args[i].EndsWith('"')) { var tmp = args[i]; tmp = RemoveContainingQuote(tmp); tmp = RemoveContainingQuote(tmp); obj.Add(tmp); } else { throw new RuntimeException("Error: string not wrapped in quotation marks"); } } else { var typeAsm = AppDomain.CurrentDomain.GetAssemblies().FirstOrDefault(itm => itm.GetTypes().Any(type => string.Equals(type.Name.ToString(), parameter.ParameterType.Name.ToString(), StringComparison.CurrentCultureIgnoreCase))); var type = typeAsm.GetTypes().FirstOrDefault(type => string.Equals(type.Name.ToString(), parameter.ParameterType.Name.ToString(), StringComparison.CurrentCultureIgnoreCase)); var tryParse = type.GetMethods().FirstOrDefault(itm => itm.Name == "TryParse"); var parseParameters = new object[] { args[i], null }; var parseResult = tryParse.Invoke(null, parseParameters); var blResult = parseResult != null && (bool)parseResult; if (blResult) { obj.Add(parseParameters[1]); } else { throw new RuntimeException("ERROR: param value non-convertible"); } } } } if (!matching) { continue; } method.Invoke(t.IsAbstract ? null : Activator.CreateInstance(t), obj.ToArray()); hasRun = true; break; } } if (hasRun) { break; } } if (hasRun) { break; } } if (!hasRun) { throw new RuntimeException( $"ERROR: {plg.Alias} did not have a matching {mthd.Alias} with the provided parameter(s)"); } }