|
@@ -12,7 +12,7 @@ namespace Discord.Commands |
|
|
public class CommandService |
|
|
public class CommandService |
|
|
{ |
|
|
{ |
|
|
private readonly SemaphoreSlim _moduleLock; |
|
|
private readonly SemaphoreSlim _moduleLock; |
|
|
private readonly ConcurrentDictionary<object, Module> _modules; |
|
|
|
|
|
|
|
|
private readonly ConcurrentDictionary<Type, Module> _modules; |
|
|
private readonly ConcurrentDictionary<Type, TypeReader> _typeReaders; |
|
|
private readonly ConcurrentDictionary<Type, TypeReader> _typeReaders; |
|
|
private readonly CommandMap _map; |
|
|
private readonly CommandMap _map; |
|
|
|
|
|
|
|
@@ -22,7 +22,7 @@ namespace Discord.Commands |
|
|
public CommandService() |
|
|
public CommandService() |
|
|
{ |
|
|
{ |
|
|
_moduleLock = new SemaphoreSlim(1, 1); |
|
|
_moduleLock = new SemaphoreSlim(1, 1); |
|
|
_modules = new ConcurrentDictionary<object, Module>(); |
|
|
|
|
|
|
|
|
_modules = new ConcurrentDictionary<Type, Module>(); |
|
|
_map = new CommandMap(); |
|
|
_map = new CommandMap(); |
|
|
_typeReaders = new ConcurrentDictionary<Type, TypeReader> |
|
|
_typeReaders = new ConcurrentDictionary<Type, TypeReader> |
|
|
{ |
|
|
{ |
|
@@ -100,7 +100,7 @@ namespace Discord.Commands |
|
|
await _moduleLock.WaitAsync().ConfigureAwait(false); |
|
|
await _moduleLock.WaitAsync().ConfigureAwait(false); |
|
|
try |
|
|
try |
|
|
{ |
|
|
{ |
|
|
if (_modules.ContainsKey(moduleInstance)) |
|
|
|
|
|
|
|
|
if (_modules.ContainsKey(moduleInstance.GetType())) |
|
|
throw new ArgumentException($"This module has already been loaded."); |
|
|
throw new ArgumentException($"This module has already been loaded."); |
|
|
|
|
|
|
|
|
var typeInfo = moduleInstance.GetType().GetTypeInfo(); |
|
|
var typeInfo = moduleInstance.GetType().GetTypeInfo(); |
|
@@ -117,8 +117,11 @@ namespace Discord.Commands |
|
|
} |
|
|
} |
|
|
private Module LoadInternal(object moduleInstance, ModuleAttribute moduleAttr, TypeInfo typeInfo) |
|
|
private Module LoadInternal(object moduleInstance, ModuleAttribute moduleAttr, TypeInfo typeInfo) |
|
|
{ |
|
|
{ |
|
|
|
|
|
if (_modules.ContainsKey(moduleInstance.GetType())) |
|
|
|
|
|
return _modules[moduleInstance.GetType()]; |
|
|
|
|
|
|
|
|
var loadedModule = new Module(this, moduleInstance, moduleAttr, typeInfo); |
|
|
var loadedModule = new Module(this, moduleInstance, moduleAttr, typeInfo); |
|
|
_modules[moduleInstance] = loadedModule; |
|
|
|
|
|
|
|
|
_modules[moduleInstance.GetType()] = loadedModule; |
|
|
|
|
|
|
|
|
foreach (var cmd in loadedModule.Commands) |
|
|
foreach (var cmd in loadedModule.Commands) |
|
|
_map.AddCommand(cmd); |
|
|
_map.AddCommand(cmd); |
|
@@ -176,7 +179,7 @@ namespace Discord.Commands |
|
|
private bool UnloadInternal(object module) |
|
|
private bool UnloadInternal(object module) |
|
|
{ |
|
|
{ |
|
|
Module unloadedModule; |
|
|
Module unloadedModule; |
|
|
if (_modules.TryRemove(module, out unloadedModule)) |
|
|
|
|
|
|
|
|
if (_modules.TryRemove(module.GetType(), out unloadedModule)) |
|
|
{ |
|
|
{ |
|
|
foreach (var cmd in unloadedModule.Commands) |
|
|
foreach (var cmd in unloadedModule.Commands) |
|
|
_map.RemoveCommand(cmd); |
|
|
_map.RemoveCommand(cmd); |
|
|