diff --git a/docs/guides/int_framework/preconditions.md b/docs/guides/int_framework/preconditions.md index 75e5727982..bfa7168eb1 100644 --- a/docs/guides/int_framework/preconditions.md +++ b/docs/guides/int_framework/preconditions.md @@ -29,6 +29,7 @@ to use. * @Discord.Interactions.RequireUserPermissionAttribute * @Discord.Interactions.RequireNsfwAttribute * @Discord.Interactions.RequireRoleAttribute +* @Discord.Interactions.RequireTeamAttribute ## Using Preconditions diff --git a/src/Discord.Net.Interactions/Attributes/Preconditions/RequireTeamAttribute.cs b/src/Discord.Net.Interactions/Attributes/Preconditions/RequireTeamAttribute.cs new file mode 100644 index 0000000000..18ff9e396e --- /dev/null +++ b/src/Discord.Net.Interactions/Attributes/Preconditions/RequireTeamAttribute.cs @@ -0,0 +1,68 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Threading.Tasks; + +namespace Discord.Interactions +{ + /// + /// Requires the command to be invoked by a member of the team that owns the bot. + /// + /// + /// This precondition will restrict the access of the command or module to the a member of the team of the Discord application, narrowed to specific team roles if specified. + /// If the precondition fails to be met, an erroneous will be returned with the + /// message "Command can only be run by a member of the bot's team." + /// + /// This precondition will only work if the account has a of + /// ;otherwise, this precondition will always fail. + /// + /// + [AttributeUsage(AttributeTargets.Class | AttributeTargets.Method, AllowMultiple = true, Inherited = true)] + public class RequireTeamAttribute : PreconditionAttribute + { + /// + /// The team roles to require. Valid values: "*", "admin", "developer", or "read_only" + /// + public string[] TeamRoles { get; } = []; + + /// + /// Requires that the user invoking the command to have a specific team role. + /// + /// The team roles to require. Valid values: "*", "admin", "developer", or "read_only" + public RequireTeamAttribute(params string[] teamRoles) + { + TeamRoles = teamRoles ?? TeamRoles; + } + + /// + public override async Task CheckRequirementsAsync(IInteractionContext context, ICommandInfo command, IServiceProvider services) + { + switch (context.Client.TokenType) + { + case TokenType.Bot: + var application = await context.Client.GetApplicationInfoAsync().ConfigureAwait(false); + + var idFound = false; + + foreach (var member in application.Team.TeamMembers) + { + if (member.User.Id == context.User.Id) + { + if (TeamRoles.Length == 0 || TeamRoles.Any(role => member.Permissions.Contains(role))) + { + idFound = true; + } + + break; + } + } + + if (idFound == false) + return PreconditionResult.FromError(ErrorMessage ?? $"Command can only be run by a member of the bot's team {(TeamRoles.Length == 0 ? "." : "with the specified permissions.")}"); + return PreconditionResult.FromSuccess(); + default: + return PreconditionResult.FromError($"{nameof(RequireTeamAttribute)} is not supported by this {nameof(TokenType)}."); + } + } + } +}