You can not select more than 25 topics Topics must start with a chinese character,a letter or number, can include dashes ('-') and can be up to 35 characters long.

CommandServiceExtensions.cs 2.0 kB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Threading.Tasks;
  5. namespace Discord.Commands
  6. {
  7. public static class CommandServiceExtensions
  8. {
  9. public static async Task<IReadOnlyCollection<CommandInfo>> GetExecutableCommandsAsync(this ICollection<CommandInfo> commands, ICommandContext context, IServiceProvider provider)
  10. {
  11. var executableCommands = new List<CommandInfo>();
  12. var tasks = commands.Select(async c =>
  13. {
  14. var result = await c.CheckPreconditionsAsync(context, provider).ConfigureAwait(false);
  15. return new { Command = c, PreconditionResult = result };
  16. });
  17. var results = await Task.WhenAll(tasks).ConfigureAwait(false);
  18. foreach (var result in results)
  19. {
  20. if (result.PreconditionResult.IsSuccess)
  21. executableCommands.Add(result.Command);
  22. }
  23. return executableCommands;
  24. }
  25. public static Task<IReadOnlyCollection<CommandInfo>> GetExecutableCommandsAsync(this CommandService commandService, ICommandContext context, IServiceProvider provider)
  26. => GetExecutableCommandsAsync(commandService.Commands.ToArray(), context, provider);
  27. public static async Task<IReadOnlyCollection<CommandInfo>> GetExecutableCommandsAsync(this ModuleInfo module, ICommandContext context, IServiceProvider provider)
  28. {
  29. var executableCommands = new List<CommandInfo>();
  30. executableCommands.AddRange(await module.Commands.ToArray().GetExecutableCommandsAsync(context, provider).ConfigureAwait(false));
  31. var tasks = module.Submodules.Select(async s => await s.GetExecutableCommandsAsync(context, provider).ConfigureAwait(false));
  32. var results = await Task.WhenAll(tasks).ConfigureAwait(false);
  33. executableCommands.AddRange(results.SelectMany(c => c));
  34. return executableCommands;
  35. }
  36. }
  37. }