Browse Source

Add support for void-returning commands

tags/1.0.0-rc2
RogueException 8 years ago
parent
commit
a6469e9021
2 changed files with 18 additions and 9 deletions
  1. +1
    -1
      src/Discord.Net.Commands/Builders/ModuleClassBuilder.cs
  2. +17
    -8
      src/Discord.Net.Commands/Info/CommandInfo.cs

+ 1
- 1
src/Discord.Net.Commands/Builders/ModuleClassBuilder.cs View File

@@ -252,7 +252,7 @@ namespace Discord.Commands
private static bool IsValidCommandDefinition(MethodInfo methodInfo) private static bool IsValidCommandDefinition(MethodInfo methodInfo)
{ {
return methodInfo.IsDefined(typeof(CommandAttribute)) && return methodInfo.IsDefined(typeof(CommandAttribute)) &&
methodInfo.ReturnType == typeof(Task) &&
(methodInfo.ReturnType == typeof(Task) || methodInfo.ReturnType == typeof(void)) &&
!methodInfo.IsStatic && !methodInfo.IsStatic &&
!methodInfo.IsGenericMethod; !methodInfo.IsGenericMethod;
} }


+ 17
- 8
src/Discord.Net.Commands/Info/CommandInfo.cs View File

@@ -1,13 +1,13 @@
using Discord.Commands.Builders;
using System; using System;
using System.Linq;
using System.Collections.Generic; using System.Collections.Generic;
using System.Collections.Immutable; using System.Collections.Immutable;
using System.Collections.Concurrent; using System.Collections.Concurrent;
using System.Threading.Tasks;
using System.Reflection;

using Discord.Commands.Builders;
using System.Diagnostics; using System.Diagnostics;
using System.Linq;
using System.Reflection;
using System.Runtime.ExceptionServices;
using System.Threading.Tasks;


namespace Discord.Commands namespace Discord.Commands
{ {
@@ -166,10 +166,19 @@ namespace Discord.Commands
} }
catch (Exception ex) catch (Exception ex)
{ {
ex = new CommandException(this, context, ex);
await Module.Service._cmdLogger.ErrorAsync(ex).ConfigureAwait(false);
var originalEx = ex;
while (ex is TargetInvocationException) //Happens with void-returning commands
ex = ex.InnerException;

var wrappedEx = new CommandException(this, context, ex);
await Module.Service._cmdLogger.ErrorAsync(wrappedEx).ConfigureAwait(false);
if (Module.Service._throwOnError) if (Module.Service._throwOnError)
throw;
{
if (ex == originalEx)
throw;
else
ExceptionDispatchInfo.Capture(ex).Throw();
}
} }
await Module.Service._cmdLogger.VerboseAsync($"Executed {GetLogText(context)}").ConfigureAwait(false); await Module.Service._cmdLogger.VerboseAsync($"Executed {GetLogText(context)}").ConfigureAwait(false);
} }


Loading…
Cancel
Save