Example #1
0
        private async Task LoadModulesAsync(ModuleInfo moduleInfo = null)
        {
            if (moduleInfo == null)
            {
                if (Modules.TryGetValue(0, out List <ModuleInfo> modules))
                {
                    foreach (var module in modules)
                    {
                        await LoadModulesAsync(module);
                    }
                    GC.Collect();
                }
            }
            else
            {
                try
                {
                    // Ignore if the module has declared the attribute [DontAutoLoad]
                    if (null == moduleInfo.Type.GetCustomAttribute <DontAutoLoadAttribute>())
                    {
                        var instance = moduleInfo.Type.CreateInstance() as ModuleBaseClass;
                        instance.Dispose();
                    }
                }
                catch (Exception ex)
                {
                    Log.Warn(ex);
                }

                // Load child modules
                foreach (var submodule in moduleInfo.SubModules)
                {
                    await LoadModulesAsync(submodule);
                }
            }
        }
Example #2
0
 internal static MethodInfo FindMethodInfo(ModuleInfo moduleInfo, string commandString)
 => moduleInfo.Methods.FirstOrDefault(a => a.Aliases.Any(n => commandString.StartsWith(n, StringComparison.InvariantCultureIgnoreCase)))?.MethodInfo;
Example #3
0
        private IEnumerable <ParseResult> ParseMethodsInternal(ModuleInfo moduleInfo, string input, ParsingState state)
        {
            var inputItem1 = input?.Split(' ', StringSplitOptions.RemoveEmptyEntries).FirstOrDefault() ?? string.Empty;
            var list       = new List <ParseResult>();

            // method or module + method
            foreach (var method in moduleInfo.Methods)
            {
                bool found           = false;
                var  methodNameMatch = method.Aliases.FirstOrDefault(n => inputItem1.Equals(n, StringComparison.OrdinalIgnoreCase));
                if ((method.MethodInfo.Name == "_" || (method.Aliases.Contains("") && methodNameMatch != null)) || !string.IsNullOrWhiteSpace(methodNameMatch))
                {
                    if (method.Accessibility.Has(state == ParsingState.BASE ? CommandAccessLevel.Global : CommandAccessLevel.Parents))
                    {
                        found = true;
                        list.Add(new ParseResult()
                        {
                            InputMessage = input,
                            Method       = method,
                            Module       = moduleInfo,
                            Priority     = method.Priority,
                        });
                    }
                    else
                    {
                        // Assume the class alias for the local "underscore" named methods.
                        if (method.MethodInfo.Name == "_" &&
                            state == ParsingState.BASE &&
                            method.Accessibility.Has(CommandAccessLevel.Local) &&
                            moduleInfo.Aliases.Any(n => n.Equals(inputItem1, StringComparison.CurrentCultureIgnoreCase))
                            )
                        {
                            found = true;
                            list.Add(new ParseResult()
                            {
                                InputMessage = input,
                                Method       = method,
                                Module       = moduleInfo,
                                Priority     = method.Priority
                            });
                        }
                    }
                }

                // try to not get duplicates
                if (!found)
                {
                    // check module level method
                    var moduleNameMatch = moduleInfo.Aliases.FirstOrDefault(n => inputItem1.Equals(n, StringComparison.OrdinalIgnoreCase));
                    if (!string.IsNullOrWhiteSpace(moduleNameMatch))
                    {
                        var inputModule      = input.Remove(0, moduleNameMatch.Length).TrimStart(' ');
                        var inputModuleItem1 = inputModule.Split(' ', StringSplitOptions.RemoveEmptyEntries).FirstOrDefault() ?? "";
                        methodNameMatch = method.Aliases.FirstOrDefault(n => inputModuleItem1.Equals(n, StringComparison.OrdinalIgnoreCase));
                        if (!string.IsNullOrWhiteSpace(methodNameMatch))
                        {
                            if (method.Accessibility.Has(CommandAccessLevel.Local))
                            {
                                list.Add(new ParseResult()
                                {
                                    InputMessage = inputModule,
                                    Method       = method,
                                    Priority     = method.Priority,
                                    Module       = moduleInfo,
                                });
                            }
                        }
                    }
                }
            }

            // Find parent module
            var    moduleMatch = moduleInfo.Aliases.FirstOrDefault(n => inputItem1.Equals(n, StringComparison.OrdinalIgnoreCase));
            string moduleInput = input;
            var    parent      = false;

            if (!string.IsNullOrWhiteSpace(moduleMatch))
            {
                moduleInput = moduleInput.Remove(0, moduleMatch.Length).TrimStart(' ');
                parent      = true;
            }

            // Submodule + method a.k.a. "youtube search":
            foreach (var submodule in moduleInfo.SubModules)
            {
                foreach (var name in submodule.Aliases)
                {
                    if (moduleInput.StartsWith(name, StringComparison.OrdinalIgnoreCase))
                    {
                        list.AddRange(ParseMethodsInternal(submodule, moduleInput, ParsingState.PARENT));
                    }
                }

                // Submodule.submodule, added at 20-11-2017
                // TODO: issues with "Local" :/
                foreach (var subsubmodule in submodule.SubModules)
                {
                    list.AddRange(ParseMethodsInternal(subsubmodule, moduleInput, ParsingState.BASE));
                }

                // Submodule method
                var moduleInputItem1 = moduleInput?.Split(' ', StringSplitOptions.RemoveEmptyEntries).FirstOrDefault() ?? string.Empty;
                foreach (var submethod in submodule.Methods)
                {
                    var submoduleMatch = submethod.Aliases.FirstOrDefault(n => n.Equals(moduleInputItem1, StringComparison.OrdinalIgnoreCase));
                    if (!string.IsNullOrWhiteSpace(submoduleMatch))
                    {
                        if (submethod.Accessibility.Has(parent ? CommandAccessLevel.Parents : CommandAccessLevel.Global))
                        {
                            list.Add(new ParseResult()
                            {
                                InputMessage = moduleInput,
                                Method       = submethod,
                                Module       = moduleInfo,
                                Priority     = submethod.Priority,
                            });
                        }
                    }
                }
            }
            return(list);
        }