|
|
@@ -134,29 +134,29 @@ namespace Discord.Commands |
|
|
|
return null; |
|
|
|
} |
|
|
|
|
|
|
|
public async Task<Module> Load(object module) |
|
|
|
public async Task<Module> Load(object moduleInstance) |
|
|
|
{ |
|
|
|
await _moduleLock.WaitAsync().ConfigureAwait(false); |
|
|
|
try |
|
|
|
{ |
|
|
|
if (_modules.ContainsKey(module)) |
|
|
|
if (_modules.ContainsKey(moduleInstance)) |
|
|
|
throw new ArgumentException($"This module has already been loaded."); |
|
|
|
|
|
|
|
var typeInfo = module.GetType().GetTypeInfo(); |
|
|
|
var typeInfo = moduleInstance.GetType().GetTypeInfo(); |
|
|
|
if (typeInfo.GetCustomAttribute<ModuleAttribute>() == null) |
|
|
|
throw new ArgumentException($"Modules must be marked with ModuleAttribute."); |
|
|
|
|
|
|
|
return LoadInternal(module, typeInfo); |
|
|
|
return LoadInternal(moduleInstance, typeInfo); |
|
|
|
} |
|
|
|
finally |
|
|
|
{ |
|
|
|
_moduleLock.Release(); |
|
|
|
} |
|
|
|
} |
|
|
|
private Module LoadInternal(object module, TypeInfo typeInfo) |
|
|
|
private Module LoadInternal(object moduleInstance, TypeInfo typeInfo) |
|
|
|
{ |
|
|
|
var loadedModule = new Module(this, module, typeInfo); |
|
|
|
_modules[module] = loadedModule; |
|
|
|
var loadedModule = new Module(this, moduleInstance, typeInfo); |
|
|
|
_modules[moduleInstance] = loadedModule; |
|
|
|
|
|
|
|
foreach (var cmd in loadedModule.Commands) |
|
|
|
{ |
|
|
@@ -169,7 +169,7 @@ namespace Discord.Commands |
|
|
|
} |
|
|
|
public async Task<IEnumerable<Module>> LoadAssembly(Assembly assembly) |
|
|
|
{ |
|
|
|
List<Module> modules = new List<Module>(); |
|
|
|
var modules = ImmutableArray.CreateBuilder<Module>(); |
|
|
|
await _moduleLock.WaitAsync().ConfigureAwait(false); |
|
|
|
try |
|
|
|
{ |
|
|
@@ -178,11 +178,11 @@ namespace Discord.Commands |
|
|
|
var typeInfo = type.GetTypeInfo(); |
|
|
|
if (typeInfo.GetCustomAttribute<ModuleAttribute>() != null) |
|
|
|
{ |
|
|
|
var module = ReflectionUtils.CreateObject(typeInfo); |
|
|
|
modules.Add(LoadInternal(module, typeInfo)); |
|
|
|
var moduleInstance = ReflectionUtils.CreateObject(typeInfo); |
|
|
|
modules.Add(LoadInternal(moduleInstance, typeInfo)); |
|
|
|
} |
|
|
|
} |
|
|
|
return modules; |
|
|
|
return modules.ToImmutable(); |
|
|
|
} |
|
|
|
finally |
|
|
|
{ |
|
|
@@ -202,12 +202,12 @@ namespace Discord.Commands |
|
|
|
_moduleLock.Release(); |
|
|
|
} |
|
|
|
} |
|
|
|
public async Task<bool> Unload(object module) |
|
|
|
public async Task<bool> Unload(object moduleInstance) |
|
|
|
{ |
|
|
|
await _moduleLock.WaitAsync().ConfigureAwait(false); |
|
|
|
try |
|
|
|
{ |
|
|
|
return UnloadInternal(module); |
|
|
|
return UnloadInternal(moduleInstance); |
|
|
|
} |
|
|
|
finally |
|
|
|
{ |
|
|
@@ -233,8 +233,7 @@ namespace Discord.Commands |
|
|
|
else |
|
|
|
return false; |
|
|
|
} |
|
|
|
|
|
|
|
//TODO: C#7 Candidate for tuple |
|
|
|
|
|
|
|
public SearchResult Search(string input) |
|
|
|
{ |
|
|
|
string lowerInput = input.ToLowerInvariant(); |
|
|
|