--- uid: FAQ.TextCommands.General title: General Questions about Text Commands --- # Chat Command-related Questions In the following section, you will find commonly asked questions and answered regarding general command usage when using @Discord.Commands. ## How can I restrict some of my commands so only specific users can execute them? You can use the built-in `RequireUserPermission` precondition, which allows you to restrict the command based on the user's current permissions in the guild or channel (*e.g., `GuildPermission.Administrator`, `ChannelPermission.ManageMessages`*). > [!NOTE] > There are many more preconditions to use, including being able to make some yourself. > Precondition documentation is covered [here](xref:Guides.TextCommands.Preconditions) [RequireUserPermission]: xref:Discord.Commands.RequireUserPermissionAttribute ## Why am I getting an error about `Assembly.GetEntryAssembly`? You may be confusing @Discord.Commands.CommandService.AddModulesAsync* with @Discord.Commands.CommandService.AddModuleAsync*. The former is used to add modules via the assembly, while the latter is used to add a single module. ## What does [Remainder] do in the command signature? The [RemainderAttribute] leaves the string unparsed, meaning you do not have to add quotes around the text for the text to be recognized as a single object. Please note that if your method has multiple parameters, the remainder attribute can only be applied to the last parameter. [!code-csharp[Remainder](samples/Remainder.cs)] [RemainderAttribute]: xref:Discord.Commands.RemainderAttribute ## Discord.Net keeps saying that a `MessageReceived` handler is blocking the gateway, what should I do? By default, the library warns the user about any long-running event handler that persists for **more than 3 seconds**. Any event handlers that are run on the same thread as the gateway task, the task in charge of keeping the connection alive, may block the processing of heartbeat, and thus terminating the connection. In this case, the library detects that a `MessageReceived` event handler is blocking the gateway thread. This warning is typically associated with the command handler as it listens for that particular event. If the command handler is blocking the thread, then this **might** mean that you have a long-running command. > [!NOTE] > In rare cases, runtime errors can also cause blockage, usually > associated with Mono, which is not supported by this library. To prevent a long-running command from blocking the gateway thread, a flag called [RunMode] is explicitly designed to resolve this issue. There are 2 main `RunMode`s. 1. `RunMode.Sync` 2. `RunMode.Async` `Sync` is the default behavior and makes the command to be run on the same thread as the gateway one. `Async` will spin the task off to a different thread from the gateway one. > [!IMPORTANT] > While specifying `RunMode.Async` allows the command to be spun off > to a different thread, keep in mind that by doing so, there will be > **potentially unwanted consequences**. Before applying this flag, > please consider whether it is necessary to do so. > > Further details regarding `RunMode.Async` can be found below. You can set the `RunMode` either by specifying it individually via the `CommandAttribute` or by setting the global default with the [DefaultRunMode] flag under `CommandServiceConfig`. # [CommandAttribute](#tab/cmdattrib) [!code-csharp[Command Attribute](samples/runmode-cmdattrib.cs)] # [CommandServiceConfig](#tab/cmdconfig) [!code-csharp[Command Service Config](samples/runmode-cmdconfig.cs)] *** *** [RunMode]: xref:Discord.Commands.RunMode [CommandAttribute]: xref:Discord.Commands.CommandAttribute [DefaultRunMode]: xref:Discord.Commands.CommandServiceConfig.DefaultRunMode ## How does `RunMode.Async` work, and why is Discord.Net *not* using it by default? `RunMode.Async` works by spawning a new `Task` with an unawaited [Task.Run], essentially making the task that is used to invoke the command task to be finished on a different thread. This design means that [ExecuteAsync] will be forced to return a successful [ExecuteResult] regardless of the actual execution result. The following are the known caveats with `RunMode.Async`, 1. You can potentially introduce a race condition. 2. Unnecessary overhead caused by the [async state machine]. 3. [ExecuteAsync] will immediately return [ExecuteResult] instead of other result types (this is particularly important for those who wish to utilize [RuntimeResult] in 2.0). 4. Exceptions are swallowed in the `ExecuteAsync` result. However, there are ways to remedy some of these. For #3, in Discord.Net 2.0, the library introduces a new event called [CommandService.CommandExecuted], which is raised whenever the command is executed. This event will be raised regardless of the `RunMode` type and will return the appropriate execution result and the associated @Discord.Commands.CommandInfo if applicable. For #4, exceptions are caught in [CommandService.Log] event under [LogMessage.Exception] as [CommandException] and in the [CommandService.CommandExecuted] event under the [IResult] as [ExecuteResult.Exception]. [Task.Run]: https://docs.microsoft.com/en-us/dotnet/api/system.threading.tasks.task.run [async state machine]: https://www.red-gate.com/simple-talk/dotnet/net-tools/c-async-what-is-it-and-how-does-it-work/ [ExecuteAsync]: xref:Discord.Commands.CommandService.ExecuteAsync* [ExecuteResult]: xref:Discord.Commands.ExecuteResult [RuntimeResult]: xref:Discord.Commands.RuntimeResult [CommandService.CommandExecuted]: xref:Discord.Commands.CommandService.CommandExecuted [CommandService.Log]: xref:Discord.Commands.CommandService.Log [LogMessage.Exception]: xref:Discord.LogMessage.Exception* [ExecuteResult.Exception]: xref:Discord.Commands.ExecuteResult.Exception* [CommandException]: xref:Discord.Commands.CommandException [IResult]: xref:Discord.Commands.IResult