@@ -1,6 +1,4 @@
using System;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using System.Threading.Tasks;
namespace Discord.Commands.Attributes.Preconditions
namespace Discord.Commands.Attributes.Preconditions
@@ -8,42 +6,44 @@ namespace Discord.Commands.Attributes.Preconditions
[AttributeUsage(AttributeTargets.Class | AttributeTargets.Method, AllowMultiple = true, Inherited = true)]
[AttributeUsage(AttributeTargets.Class | AttributeTargets.Method, AllowMultiple = true, Inherited = true)]
public class RequirePermission : PreconditionAttribute
public class RequirePermission : PreconditionAttribute
{
{
public GuildPermission? GuildPermission { get; set; }
public ChannelPermission? ChannelPermission { get; set; }
public GuildPermission? GuildPermission { get; }
public ChannelPermission? ChannelPermission { get; }
public RequirePermission(GuildPermission permission)
public RequirePermission(GuildPermission permission)
{
{
GuildPermission = permission;
GuildPermission = permission;
ChannelPermission = null;
ChannelPermission = null;
}
}
public RequirePermission(ChannelPermission permission)
public RequirePermission(ChannelPermission permission)
{
{
ChannelPermission = permission;
ChannelPermission = permission;
GuildPermission = null;
GuildPermission = null;
}
}
public override Task<PreconditionResult> CheckPermissions(IMessage context, Command executingCommand, object moduleInstance)
public override Task<PreconditionResult> CheckPermissions(IMessage context, Command executingCommand, object moduleInstance)
{
{
if (!(context.Channel is IGuildChannel))
return Task.FromResult(PreconditionResult.FromError("Command must be used in a guild channel"));
var author = context.Author as IGuildUser;
var guildUser = context.Author as IGuildUser;
if (GuildPermission.HasValue)
if (GuildPermission.HasValue)
{
{
var guildPerms = author.GuildPermissions.ToList();
if (!guildPerms.Contains(GuildPermission.Value))
return Task.FromResult(PreconditionResult.FromError($"User is missing guild permission {GuildPermission.Value}"));
if (guildUser == null)
return Task.FromResult(PreconditionResult.FromError("Command must be used in a guild channel"));
if (!guildUser.GuildPermissions.Has(GuildPermission.Value))
return Task.FromResult(PreconditionResult.FromError($"Command requires guild permission {GuildPermission.Value}"));
}
}
if (ChannelPermission.HasValue)
if (ChannelPermission.HasValue)
{
{
var channel = context.Channel as IGuildChannel;
var channelPerms = author.GetPermissions(channel).ToList();
var guildChannel = context.Channel as IGuildChannel;
ChannelPermissions perms;
if (guildChannel != null)
perms = guildUser.GetPermissions(guildChannel);
else
perms = ChannelPermissions.All(guildChannel);
if (!channelPerms.Contains(ChannelPermission.Value))
return Task.FromResult(PreconditionResult.FromError($"User is missing channel permission {ChannelPermission.Value}"));
if (!perms.Ha s(ChannelPermission.Value))
return Task.FromResult(PreconditionResult.FromError($"Command requires channel permission {ChannelPermission.Value}"));
}
}
return Task.FromResult(PreconditionResult.FromSuccess());
return Task.FromResult(PreconditionResult.FromSuccess());