From f6db2b7f49544014692f8445e182b666c5978725 Mon Sep 17 00:00:00 2001 From: John Date: Sat, 10 Feb 2018 13:26:41 -0500 Subject: [PATCH] addition of post action attribute --- .../Attributes/PostActionAttribute.cs | 11 +++++++++++ .../Builders/CommandBuilder.cs | 12 ++++++++++-- .../Builders/ModuleBuilder.cs | 10 +++++++++- .../Builders/ModuleClassBuilder.cs | 6 ++++++ src/Discord.Net.Commands/CommandMatch.cs | 4 +++- src/Discord.Net.Commands/CommandService.cs | 8 ++++++-- src/Discord.Net.Commands/Info/CommandInfo.cs | 12 ++++++++++++ src/Discord.Net.Commands/Info/ModuleInfo.cs | 16 ++++++++++++++++ .../Results/PreconditionResult.cs | 2 +- 9 files changed, 74 insertions(+), 7 deletions(-) create mode 100644 src/Discord.Net.Commands/Attributes/PostActionAttribute.cs diff --git a/src/Discord.Net.Commands/Attributes/PostActionAttribute.cs b/src/Discord.Net.Commands/Attributes/PostActionAttribute.cs new file mode 100644 index 000000000..1ba2a8f05 --- /dev/null +++ b/src/Discord.Net.Commands/Attributes/PostActionAttribute.cs @@ -0,0 +1,11 @@ +using System; +using System.Threading.Tasks; + +namespace Discord.Commands +{ + [AttributeUsage(AttributeTargets.Method | AttributeTargets.Class, AllowMultiple = true, Inherited = true)] + public abstract class PostActionAttribute : Attribute + { + public abstract Task ExecuteAsync(ICommandContext context, CommandInfo command, IResult result, IServiceProvider services); + } +} diff --git a/src/Discord.Net.Commands/Builders/CommandBuilder.cs b/src/Discord.Net.Commands/Builders/CommandBuilder.cs index b6d002c70..f3388f8d7 100644 --- a/src/Discord.Net.Commands/Builders/CommandBuilder.cs +++ b/src/Discord.Net.Commands/Builders/CommandBuilder.cs @@ -1,4 +1,4 @@ -using System; +using System; using System.Linq; using System.Threading.Tasks; using System.Collections.Generic; @@ -9,6 +9,7 @@ namespace Discord.Commands.Builders public class CommandBuilder { private readonly List _preconditions; + private readonly List _postActions; private readonly List _parameters; private readonly List _attributes; private readonly List _aliases; @@ -24,6 +25,7 @@ namespace Discord.Commands.Builders public int Priority { get; set; } public IReadOnlyList Preconditions => _preconditions; + public IReadOnlyList PostActions => _postActions; public IReadOnlyList Parameters => _parameters; public IReadOnlyList Attributes => _attributes; public IReadOnlyList Aliases => _aliases; @@ -34,6 +36,7 @@ namespace Discord.Commands.Builders Module = module; _preconditions = new List(); + _postActions = new List(); _parameters = new List(); _attributes = new List(); _aliases = new List(); @@ -96,6 +99,11 @@ namespace Discord.Commands.Builders _preconditions.Add(precondition); return this; } + public CommandBuilder AddPostAction(PostActionAttribute postAction) + { + _postActions.Add(postAction); + return this; + } public CommandBuilder AddParameter(string name, Action createFunc) { var param = new ParameterBuilder(this, name, typeof(T)); @@ -140,4 +148,4 @@ namespace Discord.Commands.Builders return new CommandInfo(this, info, service); } } -} \ No newline at end of file +} diff --git a/src/Discord.Net.Commands/Builders/ModuleBuilder.cs b/src/Discord.Net.Commands/Builders/ModuleBuilder.cs index 0a33c9e26..8c2aeae83 100644 --- a/src/Discord.Net.Commands/Builders/ModuleBuilder.cs +++ b/src/Discord.Net.Commands/Builders/ModuleBuilder.cs @@ -1,4 +1,4 @@ -using System; +using System; using System.Collections.Generic; using System.Threading.Tasks; using Microsoft.Extensions.DependencyInjection; @@ -10,6 +10,7 @@ namespace Discord.Commands.Builders private readonly List _commands; private readonly List _submodules; private readonly List _preconditions; + private readonly List _postActions; private readonly List _attributes; private readonly List _aliases; @@ -22,6 +23,7 @@ namespace Discord.Commands.Builders public IReadOnlyList Commands => _commands; public IReadOnlyList Modules => _submodules; public IReadOnlyList Preconditions => _preconditions; + public IReadOnlyList PostActions => _postActions; public IReadOnlyList Attributes => _attributes; public IReadOnlyList Aliases => _aliases; @@ -34,6 +36,7 @@ namespace Discord.Commands.Builders _commands = new List(); _submodules = new List(); _preconditions = new List(); + _postActions = new List(); _attributes = new List(); _aliases = new List(); } @@ -82,6 +85,11 @@ namespace Discord.Commands.Builders _preconditions.Add(precondition); return this; } + public ModuleBuilder AddPostAction(PostActionAttribute postAction) + { + _postActions.Add(postAction); + return this; + } public ModuleBuilder AddCommand(string primaryAlias, Func callback, Action createFunc) { var builder = new CommandBuilder(this, primaryAlias, callback); diff --git a/src/Discord.Net.Commands/Builders/ModuleClassBuilder.cs b/src/Discord.Net.Commands/Builders/ModuleClassBuilder.cs index 5a3a1f25a..6ba5fa830 100644 --- a/src/Discord.Net.Commands/Builders/ModuleClassBuilder.cs +++ b/src/Discord.Net.Commands/Builders/ModuleClassBuilder.cs @@ -122,6 +122,9 @@ namespace Discord.Commands case PreconditionAttribute precondition: builder.AddPrecondition(precondition); break; + case PostActionAttribute postAction: + builder.AddPostAction(postAction); + break; default: builder.AddAttributes(attribute); break; @@ -176,6 +179,9 @@ namespace Discord.Commands case PreconditionAttribute precondition: builder.AddPrecondition(precondition); break; + case PostActionAttribute postAction: + builder.AddPostAction(postAction); + break; default: builder.AddAttributes(attribute); break; diff --git a/src/Discord.Net.Commands/CommandMatch.cs b/src/Discord.Net.Commands/CommandMatch.cs index d922a2229..35c267e88 100644 --- a/src/Discord.Net.Commands/CommandMatch.cs +++ b/src/Discord.Net.Commands/CommandMatch.cs @@ -1,4 +1,4 @@ -using System; +using System; using System.Collections.Generic; using System.Threading.Tasks; using Microsoft.Extensions.DependencyInjection; @@ -18,6 +18,8 @@ namespace Discord.Commands public Task CheckPreconditionsAsync(ICommandContext context, IServiceProvider services = null) => Command.CheckPreconditionsAsync(context, services); + public Task ExecutePostActionsAsync(ICommandContext context, IResult result, IServiceProvider services = null) + => Command.ExecutePostActionsAsync(context, result, services); public Task ParseAsync(ICommandContext context, SearchResult searchResult, PreconditionResult preconditionResult = null, IServiceProvider services = null) => Command.ParseAsync(context, Alias.Length, searchResult, preconditionResult, services); public Task ExecuteAsync(ICommandContext context, IEnumerable argList, IEnumerable paramList, IServiceProvider services) diff --git a/src/Discord.Net.Commands/CommandService.cs b/src/Discord.Net.Commands/CommandService.cs index 8e7dab898..6d8c1426b 100644 --- a/src/Discord.Net.Commands/CommandService.cs +++ b/src/Discord.Net.Commands/CommandService.cs @@ -1,4 +1,4 @@ -using Discord.Commands.Builders; +using Discord.Commands.Builders; using Discord.Logging; using System; using System.Collections.Concurrent; @@ -362,7 +362,11 @@ namespace Discord.Commands //If we get this far, at least one parse was successful. Execute the most likely overload. var chosenOverload = successfulParses[0]; - return await chosenOverload.Key.ExecuteAsync(context, chosenOverload.Value, services).ConfigureAwait(false); + var result = await chosenOverload.Key.ExecuteAsync(context, chosenOverload.Value, services).ConfigureAwait(false); + + await chosenOverload.Key.ExecutePostActionsAsync(context, result, services).ConfigureAwait(false); + + return result; } } } diff --git a/src/Discord.Net.Commands/Info/CommandInfo.cs b/src/Discord.Net.Commands/Info/CommandInfo.cs index f0d406e8d..a0cbbfa67 100644 --- a/src/Discord.Net.Commands/Info/CommandInfo.cs +++ b/src/Discord.Net.Commands/Info/CommandInfo.cs @@ -32,6 +32,7 @@ namespace Discord.Commands public IReadOnlyList Aliases { get; } public IReadOnlyList Parameters { get; } public IReadOnlyList Preconditions { get; } + public IReadOnlyList PostActions { get; } public IReadOnlyList Attributes { get; } internal CommandInfo(CommandBuilder builder, ModuleInfo module, CommandService service) @@ -59,6 +60,7 @@ namespace Discord.Commands .ToImmutableArray(); Preconditions = builder.Preconditions.ToImmutableArray(); + PostActions = builder.PostActions.ToImmutableArray(); Attributes = builder.Attributes.ToImmutableArray(); Parameters = builder.Parameters.Select(x => x.Build(this)).ToImmutableArray(); @@ -109,6 +111,16 @@ namespace Discord.Commands return PreconditionResult.FromSuccess(); } + public async Task ExecutePostActionsAsync(ICommandContext context, IResult result, IServiceProvider services = null) + { + services = services ?? EmptyServiceProvider.Instance; + + foreach (var postAction in Enumerable.Concat(PostActions, Module.PostActions)) + { + await postAction.ExecuteAsync(context, this, result, services).ConfigureAwait(false); + } + } + public async Task ParseAsync(ICommandContext context, int startIndex, SearchResult searchResult, PreconditionResult preconditionResult = null, IServiceProvider services = null) { services = services ?? EmptyServiceProvider.Instance; diff --git a/src/Discord.Net.Commands/Info/ModuleInfo.cs b/src/Discord.Net.Commands/Info/ModuleInfo.cs index 97b90bf4e..6c00ccdce 100644 --- a/src/Discord.Net.Commands/Info/ModuleInfo.cs +++ b/src/Discord.Net.Commands/Info/ModuleInfo.cs @@ -17,6 +17,7 @@ namespace Discord.Commands public IReadOnlyList Aliases { get; } public IReadOnlyList Commands { get; } public IReadOnlyList Preconditions { get; } + public IReadOnlyList PostActions { get; } public IReadOnlyList Attributes { get; } public IReadOnlyList Submodules { get; } public ModuleInfo Parent { get; } @@ -34,6 +35,7 @@ namespace Discord.Commands Aliases = BuildAliases(builder, service).ToImmutableArray(); Commands = builder.Commands.Select(x => x.Build(this, service)).ToImmutableArray(); Preconditions = BuildPreconditions(builder).ToImmutableArray(); + PostActions = BuildPostActions(builder).ToImmutableArray(); Attributes = BuildAttributes(builder).ToImmutableArray(); Submodules = BuildSubmodules(builder, service).ToImmutableArray(); @@ -90,6 +92,20 @@ namespace Discord.Commands return result; } + private static List BuildPostActions(ModuleBuilder builder) + { + var result = new List(); + + ModuleBuilder parent = builder; + while (parent != null) + { + result.AddRange(parent.PostActions); + parent = parent.Parent; + } + + return result; + } + private static List BuildAttributes(ModuleBuilder builder) { var result = new List(); diff --git a/src/Discord.Net.Commands/Results/PreconditionResult.cs b/src/Discord.Net.Commands/Results/PreconditionResult.cs index ca65a373e..e1b6418a2 100644 --- a/src/Discord.Net.Commands/Results/PreconditionResult.cs +++ b/src/Discord.Net.Commands/Results/PreconditionResult.cs @@ -1,4 +1,4 @@ -using System.Diagnostics; +using System.Diagnostics; namespace Discord.Commands {