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); } } }
internal static MethodInfo FindMethodInfo(ModuleInfo moduleInfo, string commandString) => moduleInfo.Methods.FirstOrDefault(a => a.Aliases.Any(n => commandString.StartsWith(n, StringComparison.InvariantCultureIgnoreCase)))?.MethodInfo;
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); }