Add module-level preconditions and precondition for individual permissions

This commit is contained in:
Finite Reality
2016-08-04 19:36:14 +01:00
parent 0e920da21f
commit 046d56cab5
7 changed files with 77 additions and 2 deletions

View File

@@ -5,6 +5,7 @@ using System.Threading.Tasks;
namespace Discord.Commands
{
[AttributeUsage(AttributeTargets.Method | AttributeTargets.Class, AllowMultiple = true, Inherited = true)]
public abstract class PreconditionAttribute : Attribute
{
public abstract Task<PreconditionResult> CheckPermissions(IMessage context);

View File

@@ -5,6 +5,7 @@ using System.Threading.Tasks;
namespace Discord.Commands
{
[AttributeUsage(AttributeTargets.Class | AttributeTargets.Method, AllowMultiple = false, Inherited = true)]
public class RequireDMAttribute : PreconditionAttribute
{
public override Task<PreconditionResult> CheckPermissions(IMessage context)

View File

@@ -5,6 +5,7 @@ using System.Threading.Tasks;
namespace Discord.Commands
{
[AttributeUsage(AttributeTargets.Class | AttributeTargets.Method, AllowMultiple = false, Inherited = true)]
public class RequireGuildAttribute : PreconditionAttribute
{
public override Task<PreconditionResult> CheckPermissions(IMessage context)

View File

@@ -0,0 +1,54 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
namespace Discord.Commands.Attributes.Preconditions
{
[AttributeUsage(AttributeTargets.Class | AttributeTargets.Method, AllowMultiple = true, Inherited = true)]
public class RequirePermission : RequireGuildAttribute
{
public GuildPermission? GuildPermission { get; set; }
public ChannelPermission? ChannelPermission { get; set; }
public RequirePermission(GuildPermission permission)
{
GuildPermission = permission;
ChannelPermission = null;
}
public RequirePermission(ChannelPermission permission)
{
ChannelPermission = permission;
GuildPermission = null;
}
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 (GuildPermission.HasValue)
{
var guildPerms = author.GuildPermissions.ToList();
if (!guildPerms.Contains(GuildPermission.Value))
return PreconditionResult.FromError($"User is missing guild permission {GuildPermission.Value}");
}
if (ChannelPermission.HasValue)
{
var channel = context.Channel as IGuildChannel;
var channelPerms = author.GetPermissions(channel).ToList();
if (!channelPerms.Contains(ChannelPermission.Value))
return PreconditionResult.FromError($"User is missing channel permission {ChannelPermission.Value}");
}
return PreconditionResult.FromSuccess();
}
}
}

View File

@@ -5,6 +5,7 @@ using System.Threading.Tasks;
namespace Discord.Commands
{
[AttributeUsage(AttributeTargets.Class | AttributeTargets.Method)]
public class RequireRoleAttribute : RequireGuildAttribute
{
public string Role { get; set; }