From 637d9fc79404700dbe8a0c76d741f01b8986b422 Mon Sep 17 00:00:00 2001 From: Alex Gravely Date: Sat, 20 Oct 2018 14:40:13 -0400 Subject: [PATCH] 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 * Resolve build errors. --- .../Extensions/CommandServiceExtensions.cs | 42 +++++++++++++++++++ .../Extensions/EmbedBuilderExtensions.cs | 12 ++++++ .../Entities/Users/SocketUser.cs | 6 ++- 3 files changed, 59 insertions(+), 1 deletion(-) create mode 100644 src/Discord.Net.Commands/Extensions/CommandServiceExtensions.cs diff --git a/src/Discord.Net.Commands/Extensions/CommandServiceExtensions.cs b/src/Discord.Net.Commands/Extensions/CommandServiceExtensions.cs new file mode 100644 index 000000000..0a1c1646c --- /dev/null +++ b/src/Discord.Net.Commands/Extensions/CommandServiceExtensions.cs @@ -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> GetExecutableCommandsAsync(this ICollection commands, ICommandContext context, IServiceProvider provider) + { + var executableCommands = new List(); + + 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> GetExecutableCommandsAsync(this CommandService commandService, ICommandContext context, IServiceProvider provider) + => GetExecutableCommandsAsync(commandService.Commands.ToArray(), context, provider); + public static async Task> GetExecutableCommandsAsync(this ModuleInfo module, ICommandContext context, IServiceProvider provider) + { + var executableCommands = new List(); + + 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; + } + } +} diff --git a/src/Discord.Net.Core/Extensions/EmbedBuilderExtensions.cs b/src/Discord.Net.Core/Extensions/EmbedBuilderExtensions.cs index 2d72dc985..60fdcfbee 100644 --- a/src/Discord.Net.Core/Extensions/EmbedBuilderExtensions.cs +++ b/src/Discord.Net.Core/Extensions/EmbedBuilderExtensions.cs @@ -1,4 +1,6 @@ using System; +using System.Collections.Generic; +using System.Linq; namespace Discord { @@ -65,5 +67,15 @@ namespace Discord return builder; } + + public static EmbedBuilder WithFields(this EmbedBuilder builder, IEnumerable fields) + { + foreach (var field in fields) + builder.AddField(field); + + return builder; + } + public static EmbedBuilder WithFields(this EmbedBuilder builder, params EmbedFieldBuilder[] fields) + => WithFields(builder, fields.AsEnumerable()); } } diff --git a/src/Discord.Net.WebSocket/Entities/Users/SocketUser.cs b/src/Discord.Net.WebSocket/Entities/Users/SocketUser.cs index 9a101cddb..f0dc92b1c 100644 --- a/src/Discord.Net.WebSocket/Entities/Users/SocketUser.cs +++ b/src/Discord.Net.WebSocket/Entities/Users/SocketUser.cs @@ -1,7 +1,9 @@ -using Discord.Rest; using System; +using System.Collections.Generic; using System.Diagnostics; +using System.Linq; using System.Threading.Tasks; +using Discord.Rest; using Model = Discord.API.User; namespace Discord.WebSocket @@ -35,6 +37,8 @@ namespace Discord.WebSocket public IActivity Activity => Presence.Activity; /// public UserStatus Status => Presence.Status; + public IEnumerable MutualGuilds + => Discord.Guilds.Where(g => g.Users.Any(u => u.Id == Id)); internal SocketUser(DiscordSocketClient discord, ulong id) : base(discord, id)