Browse Source

Add grouping of preconditions to allow for flexible precondition logic.

pull/672/head
Joe4evr 8 years ago
parent
commit
a0c48fb1ef
2 changed files with 48 additions and 8 deletions
  1. +10
    -0
      src/Discord.Net.Commands/Attributes/PreconditionAttribute.cs
  2. +38
    -8
      src/Discord.Net.Commands/Info/CommandInfo.cs

+ 10
- 0
src/Discord.Net.Commands/Attributes/PreconditionAttribute.cs View File

@@ -6,6 +6,16 @@ namespace Discord.Commands
[AttributeUsage(AttributeTargets.Method | AttributeTargets.Class, AllowMultiple = true, Inherited = true)]
public abstract class PreconditionAttribute : Attribute
{
/// <summary>
/// Specify a group that this precondition belongs to.
/// Preconditions of the same group require only one
/// of the preconditions to pass in order to be
/// successful (A || B). Specifying <see cref="Group"/> = 0
/// or not at all will require *all* preconditions
/// to pass, just like normal (A && B).
/// </summary>
public int Group { get; set; } = 0;

public abstract Task<PreconditionResult> CheckPermissions(ICommandContext context, CommandInfo command, IServiceProvider services);
}
}

+ 38
- 8
src/Discord.Net.Commands/Info/CommandInfo.cs View File

@@ -68,18 +68,48 @@ namespace Discord.Commands
{
services = services ?? EmptyServiceProvider.Instance;

foreach (PreconditionAttribute precondition in Module.Preconditions)
foreach (IGrouping<int, PreconditionAttribute> preconditionGroup in Module.Preconditions.GroupBy(p => p.Group))
{
var result = await precondition.CheckPermissions(context, this, services).ConfigureAwait(false);
if (!result.IsSuccess)
return result;
if (preconditionGroup.Key == 0)
{
foreach (PreconditionAttribute precondition in preconditionGroup)
{
var result = await precondition.CheckPermissions(context, this, services).ConfigureAwait(false);
if (!result.IsSuccess)
return result;
}
}
else
{
var results = new List<PreconditionResult>();
foreach (PreconditionAttribute precondition in preconditionGroup)
results.Add(await precondition.CheckPermissions(context, this, services).ConfigureAwait(false));

if (!results.Any(p => p.IsSuccess))
return results[0];
}
}

foreach (PreconditionAttribute precondition in Preconditions)
foreach (IGrouping<int, PreconditionAttribute> preconditionGroup in Module.Preconditions.GroupBy(p => p.Group))
{
var result = await precondition.CheckPermissions(context, this, services).ConfigureAwait(false);
if (!result.IsSuccess)
return result;
if (preconditionGroup.Key == 0)
{
foreach (PreconditionAttribute precondition in Preconditions)
{
var result = await precondition.CheckPermissions(context, this, services).ConfigureAwait(false);
if (!result.IsSuccess)
return result;
}
}
else
{
var results = new List<PreconditionResult>();
foreach (PreconditionAttribute precondition in preconditionGroup)
results.Add(await precondition.CheckPermissions(context, this, services).ConfigureAwait(false));

if (!results.Any(p => p.IsSuccess))
return results[0];
}
}

return PreconditionResult.FromSuccess();


Loading…
Cancel
Save