using System; using System.Threading.Tasks; namespace Discord.Commands { [AttributeUsage(AttributeTargets.Class | AttributeTargets.Method, AllowMultiple = true, Inherited = true)] public class RequirePermissionAttribute : PreconditionAttribute { public GuildPermission? GuildPermission { get; } public ChannelPermission? ChannelPermission { get; } public RequirePermissionAttribute(GuildPermission permission) { GuildPermission = permission; ChannelPermission = null; } public RequirePermissionAttribute(ChannelPermission permission) { ChannelPermission = permission; GuildPermission = null; } public override Task CheckPermissions(IMessage context, Command executingCommand, object moduleInstance) { var guildUser = context.Author as IGuildUser; if (GuildPermission.HasValue) { 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) { var guildChannel = context.Channel as IGuildChannel; ChannelPermissions perms; if (guildChannel != null) perms = guildUser.GetPermissions(guildChannel); else perms = ChannelPermissions.All(guildChannel); if (!perms.Has(ChannelPermission.Value)) return Task.FromResult(PreconditionResult.FromError($"Command requires channel permission {ChannelPermission.Value}")); } return Task.FromResult(PreconditionResult.FromSuccess()); } } }