Complete Preconditions implementation

This commit is contained in:
Finite Reality
2016-08-03 17:21:38 +01:00
parent a5393dc937
commit 0e920da21f
10 changed files with 108 additions and 50 deletions

View File

@@ -7,6 +7,6 @@ namespace Discord.Commands
{
public abstract class PreconditionAttribute : Attribute
{
public abstract void CheckPermissions(PreconditionContext context);
public abstract Task<PreconditionResult> CheckPermissions(IMessage context);
}
}

View File

@@ -7,10 +7,12 @@ namespace Discord.Commands
{
public class RequireDMAttribute : PreconditionAttribute
{
public override void CheckPermissions(PreconditionContext context)
public override Task<PreconditionResult> CheckPermissions(IMessage context)
{
if (context.Message.Channel is IGuildChannel)
context.Handled = true;
if (context.Channel is IGuildChannel)
return Task.FromResult(PreconditionResult.FromError("Command must be used in a DM"));
return Task.FromResult(PreconditionResult.FromSuccess());
}
}
}

View File

@@ -7,10 +7,12 @@ namespace Discord.Commands
{
public class RequireGuildAttribute : PreconditionAttribute
{
public override void CheckPermissions(PreconditionContext context)
public override Task<PreconditionResult> CheckPermissions(IMessage context)
{
if (!(context.Message.Channel is IGuildChannel))
context.Handled = true;
if (!(context.Channel is IGuildChannel))
return Task.FromResult(PreconditionResult.FromError("Command must be used in a guild"));
return Task.FromResult(PreconditionResult.FromSuccess());
}
}
}

View File

@@ -0,0 +1,45 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
namespace Discord.Commands
{
public class RequireRoleAttribute : RequireGuildAttribute
{
public string Role { get; set; }
public StringComparer Comparer { get; set; }
public RequireRoleAttribute(string roleName)
{
Role = roleName;
Comparer = StringComparer.Ordinal;
}
public RequireRoleAttribute(string roleName, StringComparer comparer)
{
Role = roleName;
Comparer = comparer;
}
public override async Task<PreconditionResult> CheckPermissions(IMessage context)
{
var result = await base.CheckPermissions(context).ConfigureAwait(false);
if (!result.IsSuccess)
return result;
var author = (context.Author as IGuildUser);
if (author != null)
{
var hasRole = author.Roles.Any(x => Comparer.Compare(x.Name, Role) == 0);
if (!hasRole)
return PreconditionResult.FromError($"User does not have the '{Role}' role.");
}
return PreconditionResult.FromSuccess();
}
}
}