Browse Source

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.
tags/2.0
Alex Gravely Christopher F 6 years ago
parent
commit
637d9fc794
3 changed files with 59 additions and 1 deletions
  1. +42
    -0
      src/Discord.Net.Commands/Extensions/CommandServiceExtensions.cs
  2. +12
    -0
      src/Discord.Net.Core/Extensions/EmbedBuilderExtensions.cs
  3. +5
    -1
      src/Discord.Net.WebSocket/Entities/Users/SocketUser.cs

+ 42
- 0
src/Discord.Net.Commands/Extensions/CommandServiceExtensions.cs 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;
}
}
}

+ 12
- 0
src/Discord.Net.Core/Extensions/EmbedBuilderExtensions.cs View File

@@ -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<EmbedFieldBuilder> 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());
}
}

+ 5
- 1
src/Discord.Net.WebSocket/Entities/Users/SocketUser.cs View File

@@ -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;
/// <inheritdoc />
public UserStatus Status => Presence.Status;
public IEnumerable<SocketGuild> MutualGuilds
=> Discord.Guilds.Where(g => g.Users.Any(u => u.Id == Id));

internal SocketUser(DiscordSocketClient discord, ulong id)
: base(discord, id)


Loading…
Cancel
Save