- ---
- uid: Guides.Commands.Preconditions
- title: Preconditions
- ---
-
- # Preconditions
-
- Preconditions serve as a permissions system for your Commands. Keep in
- mind, however, that they are not limited to _just_ permissions and can
- be as complex as you want them to be.
-
- There are two types of Preconditions you can use:
-
- * [PreconditionAttribute] can be applied to Modules, Groups, or Commands.
- * [ParameterPreconditionAttribute] can be applied to Parameters.
-
- You may visit their respective API documentation to find out more.
-
- [PreconditionAttribute]: xref:Discord.Commands.PreconditionAttribute
- [ParameterPreconditionAttribute]: xref:Discord.Commands.ParameterPreconditionAttribute
-
- ## Bundled Preconditions
-
- @Discord.Commands ships with several bundled Preconditions for you
- to use.
-
- * @Discord.Commands.RequireContextAttribute
- * @Discord.Commands.RequireOwnerAttribute
- * @Discord.Commands.RequireBotPermissionAttribute
- * @Discord.Commands.RequireUserPermissionAttribute
- * @Discord.Commands.RequireNsfwAttribute
-
- ## Using Preconditions
-
- To use a precondition, simply apply any valid precondition candidate to
- a command method signature as an attribute.
-
- ### Example - Using a Precondition
-
- [!code-csharp[Precondition usage](samples/preconditions/precondition_usage.cs)]
-
- ## ORing Preconditions
-
- When writing commands, you may want to allow some of them to be
- executed when only some of the precondition checks are passed.
-
- This is where the [Group] property of a precondition attribute comes in
- handy. By assigning two or more preconditions to a group, the command
- system will allow the command to be executed when one of the
- precondition passes.
-
- ### Example - ORing Preconditions
-
- [!code-csharp[OR Precondition](samples/preconditions/group_precondition.cs)]
-
- [Group]: xref:Discord.Commands.PreconditionAttribute.Group
-
- ## Custom Preconditions
-
- To write your own Precondition, create a new class that inherits from
- either [PreconditionAttribute] or [ParameterPreconditionAttribute]
- depending on your use.
-
- In order for your Precondition to function, you will need to override
- the [CheckPermissionsAsync] method.
-
- If the context meets the required parameters, return
- [PreconditionResult.FromSuccess], otherwise return
- [PreconditionResult.FromError] and include an error message if
- necessary.
-
- > [!NOTE]
- > Visual Studio can help you implement missing members
- > from the abstract class by using the "Implement Abstract Class"
- > IntelliSense hint.
-
- ### Example - Creating a Custom Precondition
-
- [!code-csharp[Custom Precondition](samples/preconditions/require_owner.cs)]
-
- [CheckPermissionsAsync]: xref:Discord.Commands.PreconditionAttribute.CheckPermissionsAsync*
- [PreconditionResult.FromSuccess]: xref:Discord.Commands.PreconditionResult.FromSuccess*
- [PreconditionResult.FromError]: xref:Discord.Commands.PreconditionResult.FromError*
|