|
|
@@ -12,21 +12,38 @@ namespace Discord.Commands |
|
|
|
public string Name { get; } |
|
|
|
public IEnumerable<Command> Commands { get; } |
|
|
|
|
|
|
|
internal Module(object module, TypeInfo typeInfo) |
|
|
|
internal Module(object parent, TypeInfo typeInfo) |
|
|
|
{ |
|
|
|
List<Command> commands = new List<Command>(); |
|
|
|
SearchClass(commands); |
|
|
|
SearchClass(parent, commands, typeInfo); |
|
|
|
Commands = commands; |
|
|
|
} |
|
|
|
|
|
|
|
private void SearchClass(List<Command> commands) |
|
|
|
private void SearchClass(object parent, List<Command> commands, TypeInfo typeInfo) |
|
|
|
{ |
|
|
|
//TODO: Implement |
|
|
|
foreach (var method in typeInfo.DeclaredMethods) |
|
|
|
{ |
|
|
|
if (typeInfo.GetCustomAttribute<CommandAttribute>() != null) |
|
|
|
{ |
|
|
|
|
|
|
|
} |
|
|
|
} |
|
|
|
foreach (var type in typeInfo.DeclaredNestedTypes) |
|
|
|
{ |
|
|
|
if (typeInfo.GetCustomAttribute<GroupAttribute>() != null) |
|
|
|
{ |
|
|
|
SearchClass(CommandParser.CreateObject(typeInfo), commands, type); |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
public class Command |
|
|
|
{ |
|
|
|
public string SourceName { get; } |
|
|
|
|
|
|
|
internal Command(TypeInfo typeInfo) |
|
|
|
{ |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
public class CommandParser |
|
|
@@ -46,7 +63,10 @@ namespace Discord.Commands |
|
|
|
{ |
|
|
|
if (_modules.ContainsKey(module)) |
|
|
|
throw new ArgumentException($"This module has already been loaded."); |
|
|
|
return LoadInternal(module, module.GetType().GetTypeInfo()); |
|
|
|
var typeInfo = module.GetType().GetTypeInfo(); |
|
|
|
if (typeInfo.GetCustomAttribute<ModuleAttribute>() == null) |
|
|
|
throw new ArgumentException($"Modules must be marked with ModuleAttribute."); |
|
|
|
return LoadInternal(module, typeInfo); |
|
|
|
} |
|
|
|
finally |
|
|
|
{ |
|
|
@@ -70,15 +90,7 @@ namespace Discord.Commands |
|
|
|
var typeInfo = type.GetTypeInfo(); |
|
|
|
if (typeInfo.GetCustomAttribute<ModuleAttribute>() != null) |
|
|
|
{ |
|
|
|
var constructor = typeInfo.DeclaredConstructors.Where(x => x.GetParameters().Length == 0).FirstOrDefault(); |
|
|
|
if (constructor == null) |
|
|
|
throw new InvalidOperationException($"Failed to find a valid constructor for \"{typeInfo.FullName}\""); |
|
|
|
object module; |
|
|
|
try { module = constructor.Invoke(null); } |
|
|
|
catch (Exception ex) |
|
|
|
{ |
|
|
|
throw new InvalidOperationException($"Failed to create \"{typeInfo.FullName}\"", ex); |
|
|
|
} |
|
|
|
var module = CreateObject(typeInfo); |
|
|
|
modules.Add(LoadInternal(module, typeInfo)); |
|
|
|
} |
|
|
|
} |
|
|
@@ -102,5 +114,20 @@ namespace Discord.Commands |
|
|
|
_moduleLock.Release(); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
internal static object CreateObject(TypeInfo typeInfo) |
|
|
|
{ |
|
|
|
var constructor = typeInfo.DeclaredConstructors.Where(x => x.GetParameters().Length == 0).FirstOrDefault(); |
|
|
|
if (constructor == null) |
|
|
|
throw new InvalidOperationException($"Failed to find a valid constructor for \"{typeInfo.FullName}\""); |
|
|
|
try |
|
|
|
{ |
|
|
|
return constructor.Invoke(null); |
|
|
|
} |
|
|
|
catch (Exception ex) |
|
|
|
{ |
|
|
|
throw new InvalidOperationException($"Failed to create \"{typeInfo.FullName}\"", ex); |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
} |