diff --git a/src/Discord.Net.Commands/Builders/ModuleClassBuilder.cs b/src/Discord.Net.Commands/Builders/ModuleClassBuilder.cs index 1663b3dba..2962b517f 100644 --- a/src/Discord.Net.Commands/Builders/ModuleClassBuilder.cs +++ b/src/Discord.Net.Commands/Builders/ModuleClassBuilder.cs @@ -166,10 +166,12 @@ namespace Discord.Commands instance.SetContext(ctx); try { + instance.BeforeExecute(); return method.Invoke(instance, args) as Task ?? Task.Delay(0); } finally { + instance.AfterExecute(); (instance as IDisposable)?.Dispose(); } }; diff --git a/src/Discord.Net.Commands/IModuleBase.cs b/src/Discord.Net.Commands/IModuleBase.cs index e65a059e3..fda768b53 100644 --- a/src/Discord.Net.Commands/IModuleBase.cs +++ b/src/Discord.Net.Commands/IModuleBase.cs @@ -3,5 +3,9 @@ internal interface IModuleBase { void SetContext(ICommandContext context); + + void BeforeExecute(); + + void AfterExecute(); } } diff --git a/src/Discord.Net.Commands/ModuleBase.cs b/src/Discord.Net.Commands/ModuleBase.cs index 4b8e1727d..a38ffce06 100644 --- a/src/Discord.Net.Commands/ModuleBase.cs +++ b/src/Discord.Net.Commands/ModuleBase.cs @@ -15,6 +15,14 @@ namespace Discord.Commands return await Context.Channel.SendMessageAsync(message, isTTS, embed, options).ConfigureAwait(false); } + protected virtual void BeforeExecute() + { + } + + protected virtual void AfterExecute() + { + } + //IModuleBase void IModuleBase.SetContext(ICommandContext context) { @@ -23,5 +31,9 @@ namespace Discord.Commands throw new InvalidOperationException($"Invalid context type. Expected {typeof(T).Name}, got {context.GetType().Name}"); Context = newValue; } + + void IModuleBase.BeforeExecute() => BeforeExecute(); + + void IModuleBase.AfterExecute() => AfterExecute(); } }