using BirthdayBot.Data; using Discord.Interactions; namespace BirthdayBot.ApplicationCommands; /// /// Precondition requiring the executing user be recognized as a bot moderator.
/// A bot moderator has either the Manage Server permission or is a member of the designated bot moderator role. ///
class RequireBotModeratorAttribute : PreconditionAttribute { public const string Error = "User did not pass the mod check."; public const string Reply = ":x: You must be a moderator to use this command."; public override string ErrorMessage => Error; public override Task CheckRequirementsAsync( IInteractionContext context, ICommandInfo commandInfo, IServiceProvider services) { // A bot moderator can only exist in a guild context, so we must do this check. // This check causes this precondition to become a functional equivalent to RequireGuildContextAttribute... if (context.User is not SocketGuildUser user) return Task.FromResult(PreconditionResult.FromError(RequireGuildContextAttribute.Error)); if (user.GuildPermissions.ManageGuild) return Task.FromResult(PreconditionResult.FromSuccess()); using var db = new BotDatabaseContext(); var checkRole = (ulong?)db.GuildConfigurations .Where(g => g.GuildId == ((SocketGuild)context.Guild).Id) .Select(g => g.ModeratorRole).FirstOrDefault(); if (checkRole.HasValue && user.Roles.Any(r => r.Id == checkRole.Value)) return Task.FromResult(PreconditionResult.FromSuccess()); return Task.FromResult(PreconditionResult.FromError(Error)); } }