Add SocketUser.MutualGuilds + various command ext. methods. (#1037)

* Add SocketUser.MutualGuilds + various ext. methods.

* Search through submodules for GetExecutableCommandAsync

* Allow GetExecutableCommandsAsync(ModuleInfo) to recurse properly to all submodules.

* Bump down lang. version & whitespace cleanup.

* Change to use Task.WhenAll

* Change to ICollection<CommandInfo>

* Resolve build errors.
This commit is contained in:
Alex Gravely
2018-10-20 14:40:13 -04:00
committed by Christopher F
parent 649a779c23
commit 637d9fc794
3 changed files with 59 additions and 1 deletions

View File

@@ -0,0 +1,42 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
namespace Discord.Commands
{
public static class CommandServiceExtensions
{
public static async Task<IReadOnlyCollection<CommandInfo>> GetExecutableCommandsAsync(this ICollection<CommandInfo> commands, ICommandContext context, IServiceProvider provider)
{
var executableCommands = new List<CommandInfo>();
var tasks = commands.Select(async c => { var result = await c.CheckPreconditionsAsync(context, provider).ConfigureAwait(false); return new { Command = c, PreconditionResult = result }; });
var results = await Task.WhenAll(tasks);
foreach (var result in results)
{
if (result.PreconditionResult.IsSuccess)
executableCommands.Add(result.Command);
}
return executableCommands;
}
public static Task<IReadOnlyCollection<CommandInfo>> GetExecutableCommandsAsync(this CommandService commandService, ICommandContext context, IServiceProvider provider)
=> GetExecutableCommandsAsync(commandService.Commands.ToArray(), context, provider);
public static async Task<IReadOnlyCollection<CommandInfo>> GetExecutableCommandsAsync(this ModuleInfo module, ICommandContext context, IServiceProvider provider)
{
var executableCommands = new List<CommandInfo>();
executableCommands.AddRange(await module.Commands.ToArray().GetExecutableCommandsAsync(context, provider).ConfigureAwait(false));
var tasks = module.Submodules.Select(async s => await s.GetExecutableCommandsAsync(context, provider).ConfigureAwait(false));
var results = await Task.WhenAll(tasks);
executableCommands.AddRange(results.SelectMany(c => c));
return executableCommands;
}
}
}