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)");
            }
        }