| @@ -8,7 +8,7 @@ title: Questions about Basic Operations | |||||
| ## How should I safely check a type? | ## How should I safely check a type? | ||||
| > [!WARNING] | > [!WARNING] | ||||
| > Direct casting (e.g. `(Type)type`) is **the least recommended** | |||||
| > Direct casting (e.g., `(Type)type`) is **the least recommended** | |||||
| > way of casting, as it *can* throw an [InvalidCastException] | > way of casting, as it *can* throw an [InvalidCastException] | ||||
| > when the object isn't the desired type. | > when the object isn't the desired type. | ||||
| > | > | ||||
| @@ -28,9 +28,9 @@ A good and safe casting example: | |||||
| ## How do I send a message? | ## How do I send a message? | ||||
| > [!TIP] | > [!TIP] | ||||
| > The [GetChannel] method by default returns an [IChannel]. | |||||
| > This means channels such as [IVoiceChannel], [ICategoryChannel] | |||||
| > can be returned. This is why that you cannot send message | |||||
| > The [GetChannel] method by default returns an [IChannel], allowing | |||||
| > channel types such as [IVoiceChannel], [ICategoryChannel] | |||||
| > to be returned; consequently, you cannot send a message | |||||
| > to channels like those. | > to channels like those. | ||||
| Any implementation of [IMessageChannel] has a [SendMessageAsync] | Any implementation of [IMessageChannel] has a [SendMessageAsync] | ||||
| @@ -21,7 +21,7 @@ There are few possible reasons why this may occur. | |||||
| bot account created from the Discord Developer portal, you should | bot account created from the Discord Developer portal, you should | ||||
| be using `TokenType.Bot`. | be using `TokenType.Bot`. | ||||
| 2. You are not using the correct login credentials. Please keep in | 2. You are not using the correct login credentials. Please keep in | ||||
| mind that tokens is **different** from a *client secret*. | |||||
| mind that a token is **different** from a *client secret*. | |||||
| [TokenType]: xref:Discord.TokenType | [TokenType]: xref:Discord.TokenType | ||||
| [827]: https://github.com/RogueException/Discord.Net/issues/827 | [827]: https://github.com/RogueException/Discord.Net/issues/827 | ||||
| @@ -33,11 +33,11 @@ There are few possible reasons why this may occur. | |||||
| Your bot should **not** attempt to interact in any way with | Your bot should **not** attempt to interact in any way with | ||||
| guilds/servers until the [Ready] event fires. When the bot | guilds/servers until the [Ready] event fires. When the bot | ||||
| connects, it first has to download guild information from | connects, it first has to download guild information from | ||||
| Discord in order for you to get access to any server | |||||
| Discord for you to get access to any server | |||||
| information; the client is not ready at this point. | information; the client is not ready at this point. | ||||
| Technically, the [GuildAvailable] event fires once the data for a | Technically, the [GuildAvailable] event fires once the data for a | ||||
| particular guild has downloaded; however, it's best to wait for all | |||||
| particular guild has downloaded; however, it is best to wait for all | |||||
| guilds to be downloaded. Once all downloads are complete, the [Ready] | guilds to be downloaded. Once all downloads are complete, the [Ready] | ||||
| event is triggered, then you can proceed to do whatever you like. | event is triggered, then you can proceed to do whatever you like. | ||||
| @@ -46,7 +46,7 @@ event is triggered, then you can proceed to do whatever you like. | |||||
| ## How do I get a message's previous content when that message is edited? | ## How do I get a message's previous content when that message is edited? | ||||
| If you need to do anything with messages (e.g. checking Reactions, | |||||
| If you need to do anything with messages (e.g., checking Reactions, | |||||
| checking the content of edited/deleted messages), you must set the | checking the content of edited/deleted messages), you must set the | ||||
| [MessageCacheSize] in your [DiscordSocketConfig] settings in order to | [MessageCacheSize] in your [DiscordSocketConfig] settings in order to | ||||
| use the cached message entity. Read more about it [here](xref:Guides.Concepts.Events#cacheable). | use the cached message entity. Read more about it [here](xref:Guides.Concepts.Events#cacheable). | ||||
| @@ -8,25 +8,27 @@ title: Beginner Questions / How to Get Started | |||||
| ## How do I add my bot to my server/guild? | ## How do I add my bot to my server/guild? | ||||
| You can do so by using the [permission calculator] provided | You can do so by using the [permission calculator] provided | ||||
| by FiniteReality. | |||||
| This tool allows you to set the permissions that the bot will be | |||||
| added with, and invite the bot into your guild. With this method, | |||||
| bots will also be assigned their own special roles that normal users | |||||
| cannot use; this is what we call a `Managed` role, and this is a much | |||||
| safer method of permission management than to create a role that any | |||||
| users can be assigned to. | |||||
| by [FiniteReality]. | |||||
| This tool allows you to set permissions that the bot will be assigned | |||||
| with, and invite the bot into your guild. With this method, bots will | |||||
| also be assigned a unique role that a regular user cannot use; this | |||||
| is what we call a `Managed` role. Because you cannot assign this | |||||
| role to any other users, it is much safer than creating a single | |||||
| role which, intentionally or not, can be applied to other users | |||||
| to escalate their privilege. | |||||
| [FiniteReality]: https://github.com/FiniteReality/permissions-calculator | |||||
| [permission calculator]: https://finitereality.github.io/permissions-calculator | [permission calculator]: https://finitereality.github.io/permissions-calculator | ||||
| ## What is a token? | ## What is a token? | ||||
| A token is a credential used to log into an account. This information | A token is a credential used to log into an account. This information | ||||
| should be kept **private** and for your eyes only. Anyone with your | should be kept **private** and for your eyes only. Anyone with your | ||||
| token can log into your account. This applies to both user and bot | |||||
| accounts. That also means that you should never ever hardcode your | |||||
| token or add it into source control, as your identity may be stolen | |||||
| by scrape bots on the internet that scours through constantly to | |||||
| obtain a token. | |||||
| token can log into your account. This risk applies to both user | |||||
| and bot accounts. That also means that you should **never** hardcode | |||||
| your token or add it into source control, as your identity may be | |||||
| stolen by scrape bots on the internet that scours through | |||||
| constantly to obtain a token. | |||||
| ## What is a client/user/object ID? | ## What is a client/user/object ID? | ||||
| @@ -5,37 +5,35 @@ title: Questions about Commands | |||||
| # Command-related Questions | # Command-related Questions | ||||
| ## How can I restrict some of my commands so only certain users can execute them? | |||||
| ## How can I restrict some of my commands so only specific users can execute them? | |||||
| Based on how you want to implement the restrictions, you can use the | Based on how you want to implement the restrictions, you can use the | ||||
| built-in [RequireUserPermission] precondition, which allows you to | built-in [RequireUserPermission] precondition, which allows you to | ||||
| restrict the command based on the user's current permissions in the | restrict the command based on the user's current permissions in the | ||||
| guild or channel (*e.g. `GuildPermission.Administrator`, | |||||
| `ChannelPermission.ManageMessages` etc.*). | |||||
| guild or channel (*e.g., `GuildPermission.Administrator`, | |||||
| `ChannelPermission.ManageMessages`*). | |||||
| If, however, you wish to restrict the commands based on the user's | If, however, you wish to restrict the commands based on the user's | ||||
| role, you can either create your own custom precondition or use | |||||
| role, you can either create your custom precondition or use | |||||
| Joe4evr's [Preconditions Addons] that provides a few custom | Joe4evr's [Preconditions Addons] that provides a few custom | ||||
| preconditions that aren't provided in the stock library. | preconditions that aren't provided in the stock library. | ||||
| Its source can also be used as an example for creating your own | |||||
| Its source can also be used as an example for creating your | |||||
| custom preconditions. | custom preconditions. | ||||
| [RequireUserPermission]: xref:Discord.Commands.RequireUserPermissionAttribute | [RequireUserPermission]: xref:Discord.Commands.RequireUserPermissionAttribute | ||||
| [Preconditions Addons]: https://github.com/Joe4evr/Discord.Addons/tree/master/src/Discord.Addons.Preconditions | [Preconditions Addons]: https://github.com/Joe4evr/Discord.Addons/tree/master/src/Discord.Addons.Preconditions | ||||
| ## I'm getting an error about `Assembly#GetEntryAssembly`. | |||||
| ## I am getting an error about `Assembly.GetEntryAssembly`. | |||||
| You may be confusing [CommandService#AddModulesAsync] with | |||||
| [CommandService#AddModuleAsync]. The former is used to add modules | |||||
| via the assembly, while the latter is used to add a single module. | |||||
| [CommandService#AddModulesAsync]: xref:Discord.Commands.CommandService.AddModulesAsync* | |||||
| [CommandService#AddModuleAsync]: xref:Discord.Commands.CommandService.AddModuleAsync* | |||||
| 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? | ## What does [Remainder] do in the command signature? | ||||
| The [RemainderAttribute] leaves the string unparsed, meaning you | The [RemainderAttribute] leaves the string unparsed, meaning you | ||||
| don't have to add quotes around the text for the text to be | |||||
| 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 | recognized as a single object. Please note that if your method has | ||||
| multiple parameters, the remainder attribute can only be applied to | multiple parameters, the remainder attribute can only be applied to | ||||
| the last parameter. | the last parameter. | ||||
| @@ -47,13 +45,14 @@ the last parameter. | |||||
| ## What is a service? Why does my module not hold any data after execution? | ## What is a service? Why does my module not hold any data after execution? | ||||
| In Discord.Net, modules are created similarly to ASP.NET, meaning | In Discord.Net, modules are created similarly to ASP.NET, meaning | ||||
| that they have a transient nature. This means that they are spawned | |||||
| every time when a request is received, and are killed from memory | |||||
| when the execution finishes. This is why you cannot store persistent | |||||
| data inside a module. To workaround this, consider using a service. | |||||
| Service is often used to hold data externally, so that they will | |||||
| persist throughout execution. Think of it like a chest that holds | |||||
| that they have a transient nature; modules are spawned whenever a | |||||
| request is received, and are killed from memory when the execution | |||||
| finishes. In other words, you cannot store persistent | |||||
| data inside a module. Consider using a service if you wish to | |||||
| workaround this. | |||||
| Service is often used to hold data externally so that they persist | |||||
| throughout execution. Think of it like a chest that holds | |||||
| whatever you throw at it that won't be affected by anything unless | whatever you throw at it that won't be affected by anything unless | ||||
| you want it to. Note that you should also learn Microsoft's | you want it to. Note that you should also learn Microsoft's | ||||
| implementation of [Dependency Injection] \([video]) before proceeding, | implementation of [Dependency Injection] \([video]) before proceeding, | ||||
| @@ -68,15 +67,23 @@ A brief example of service and dependency injection can be seen below. | |||||
| ## I have a long-running Task in my command, and Discord.Net keeps saying that a `MessageReceived` handler is blocking the gateway. What gives? | ## I have a long-running Task in my command, and Discord.Net keeps saying that a `MessageReceived` handler is blocking the gateway. What gives? | ||||
| By default, all commands are executed on the same thread as the | |||||
| gateway task, which is responsible for keeping the connection from | |||||
| your client to Discord alive. When you execute a command, | |||||
| this blocks the gateway from communicating for as long as the command | |||||
| task is being executed. The library will warn you about any long | |||||
| running event handler (in this case, the command handler) that | |||||
| persists for **more than 3 seconds**. | |||||
| 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 (in rare | |||||
| cases, runtime errors can also cause blockage, usually associated | |||||
| with Mono, which is not supported by this library). | |||||
| To resolve this, the library has designed a flag called [RunMode]. | |||||
| 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. | There are 2 main `RunMode`s. | ||||
| @@ -84,7 +91,7 @@ There are 2 main `RunMode`s. | |||||
| 2. `RunMode.Async` | 2. `RunMode.Async` | ||||
| You can set the `RunMode` either by specifying it individually via | You can set the `RunMode` either by specifying it individually via | ||||
| the `CommandAttribute`, or by setting the global default with | |||||
| the `CommandAttribute` or by setting the global default with | |||||
| the [DefaultRunMode] flag under `CommandServiceConfig`. | the [DefaultRunMode] flag under `CommandServiceConfig`. | ||||
| # [CommandAttribute](#tab/cmdattrib) | # [CommandAttribute](#tab/cmdattrib) | ||||
| @@ -101,10 +108,9 @@ the [DefaultRunMode] flag under `CommandServiceConfig`. | |||||
| > [!IMPORTANT] | > [!IMPORTANT] | ||||
| > While specifying `RunMode.Async` allows the command to be spun off | > While specifying `RunMode.Async` allows the command to be spun off | ||||
| > to a different thread instead of the gateway thread, | |||||
| > keep in mind that there will be **potential consequences** | |||||
| > by doing so. Before applying this flag, please | |||||
| > consider whether it is necessary to do so. | |||||
| > 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. | > Further details regarding `RunMode.Async` can be found below. | ||||
| @@ -115,16 +121,15 @@ the [DefaultRunMode] flag under `CommandServiceConfig`. | |||||
| ## How does `RunMode.Async` work, and why is Discord.Net *not* using it by default? | ## 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 | `RunMode.Async` works by spawning a new `Task` with an unawaited | ||||
| [Task.Run], essentially making `ExecuteAsyncInternalAsync`, the task | |||||
| that is used to invoke the command task, to be finished on a | |||||
| different thread. This means that [ExecuteAsync] will be forced to | |||||
| return a successful [ExecuteResult] regardless of the actual | |||||
| execution result. | |||||
| [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`, | The following are the known caveats with `RunMode.Async`, | ||||
| 1. You can potentially introduce race condition. | |||||
| 2. Unnecessary overhead caused by [async state machine]. | |||||
| 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 | 3. [ExecuteAsync] will immediately return [ExecuteResult] instead of | ||||
| other result types (this is particularly important for those who wish | other result types (this is particularly important for those who wish | ||||
| to utilize [RuntimeResult] in 2.0). | to utilize [RuntimeResult] in 2.0). | ||||
| @@ -16,5 +16,5 @@ public Task EchoAsync(string text) => ReplyAsync(text); | |||||
| // Wrapping the message in quotes solves this. | // Wrapping the message in quotes solves this. | ||||
| // This way, the system knows the entire message is to be parsed as a | // This way, the system knows the entire message is to be parsed as a | ||||
| // single String. | // single String. | ||||
| // e.g. | |||||
| // e.g., | |||||
| // !echo "Coffee Cake" | // !echo "Coffee Cake" | ||||
| @@ -7,8 +7,8 @@ title: Questions about Legacy Versions | |||||
| ## X, Y, Z does not work! It doesn't return a valid value anymore | ## X, Y, Z does not work! It doesn't return a valid value anymore | ||||
| If you're currently using an older version in stable branch, please | |||||
| upgrade to the latest pre-release version to ensure maximum | |||||
| If you are currently using an older version of the stable branch, | |||||
| please upgrade to the latest pre-release version to ensure maximum | |||||
| compatibility. Several features may be broken in older | compatibility. Several features may be broken in older | ||||
| versions and will likely not be fixed in the version branch due to | versions and will likely not be fixed in the version branch due to | ||||
| their breaking nature. | their breaking nature. | ||||
| @@ -107,7 +107,7 @@ be found in @Guides.Commands.TypeReaders. | |||||
| #### Optional Parameters | #### Optional Parameters | ||||
| Parameters, by default, are always required. To make a parameter | Parameters, by default, are always required. To make a parameter | ||||
| optional, give it a default value (i.e. `int num = 0`). | |||||
| optional, give it a default value (i.e., `int num = 0`). | |||||
| #### Parameters with Spaces | #### Parameters with Spaces | ||||
| @@ -6,18 +6,18 @@ title: Post-command Execution Handling | |||||
| # Preface | # Preface | ||||
| When developing commands, you may want to consider building a | When developing commands, you may want to consider building a | ||||
| post-execution handling system so you can have a finer control | |||||
| post-execution handling system so you can have finer control | |||||
| over commands. Discord.Net offers several post-execution workflows | over commands. Discord.Net offers several post-execution workflows | ||||
| for you to work with. | for you to work with. | ||||
| If you recall, in the [Command Guide], we've shown the following | |||||
| If you recall, in the [Command Guide], we have shown the following | |||||
| example for executing and handling commands, | example for executing and handling commands, | ||||
| [!code[Command Handler](samples/command_handler.cs)] | [!code[Command Handler](samples/command_handler.cs)] | ||||
| You may notice that after we perform [ExecuteAsync], we store the | You may notice that after we perform [ExecuteAsync], we store the | ||||
| result and print it to the chat. This is essentially the most | |||||
| basic post-execution handling. | |||||
| result and print it to the chat, essentially creating the most | |||||
| fundamental form of a post-execution handler. | |||||
| With this in mind, we could start doing things like the following, | With this in mind, we could start doing things like the following, | ||||
| @@ -25,8 +25,8 @@ With this in mind, we could start doing things like the following, | |||||
| However, this may not always be preferred, because you are | However, this may not always be preferred, because you are | ||||
| creating your post-execution logic *with* the essential command | creating your post-execution logic *with* the essential command | ||||
| handler. This could lead to messy code and could potentially be a | |||||
| violation of the SRP (Single Responsibility Principle). | |||||
| handler. This design could lead to messy code and could potentially | |||||
| be a violation of the SRP (Single Responsibility Principle). | |||||
| Another major issue is if your command is marked with | Another major issue is if your command is marked with | ||||
| `RunMode.Async`, [ExecuteAsync] will **always** return a successful | `RunMode.Async`, [ExecuteAsync] will **always** return a successful | ||||
| @@ -37,8 +37,8 @@ about the impact in the [FAQ](xref:FAQ.Commands). | |||||
| Enter [CommandExecuted], an event that was introduced in | Enter [CommandExecuted], an event that was introduced in | ||||
| Discord.Net 2.0. This event is raised whenever a command is | Discord.Net 2.0. This event is raised whenever a command is | ||||
| successfully executed **without any run-time exceptions** or **without | |||||
| any parsing or precondition failure**. This means this event can be | |||||
| successfully executed **without any run-time exceptions** or **any | |||||
| parsing or precondition failure**. This means this event can be | |||||
| used to streamline your post-execution design, and the best thing | used to streamline your post-execution design, and the best thing | ||||
| about this event is that it is not prone to `RunMode.Async`'s | about this event is that it is not prone to `RunMode.Async`'s | ||||
| [ExecuteAsync] drawbacks. | [ExecuteAsync] drawbacks. | ||||
| @@ -52,7 +52,7 @@ next? We can take this further by using [RuntimeResult]. | |||||
| ### RuntimeResult | ### RuntimeResult | ||||
| `RuntimeResult` was originally introduced in 1.0 to allow | |||||
| `RuntimeResult` was initially introduced in 1.0 to allow | |||||
| developers to centralize their command result logic. | developers to centralize their command result logic. | ||||
| In other words, it is a result type that is designed to be | In other words, it is a result type that is designed to be | ||||
| returned when the command has finished its execution. | returned when the command has finished its execution. | ||||
| @@ -62,7 +62,7 @@ However, it wasn't widely adopted due to the aforementioned | |||||
| result-handler via the [CommandExecuted] event, we can start | result-handler via the [CommandExecuted] event, we can start | ||||
| making use of this class. | making use of this class. | ||||
| The best way to make use of it is to create your own version of | |||||
| The best way to make use of it is to create your version of | |||||
| `RuntimeResult`. You can achieve this by inheriting the `RuntimeResult` | `RuntimeResult`. You can achieve this by inheriting the `RuntimeResult` | ||||
| class. | class. | ||||
| @@ -71,16 +71,16 @@ of `RuntimeResult`, | |||||
| [!code[Base Use](samples/customresult_base.cs)] | [!code[Base Use](samples/customresult_base.cs)] | ||||
| The sky's the limit from here. You can add any additional information | |||||
| you'd like regarding the execution result. | |||||
| The sky is the limit from here. You can add any additional information | |||||
| you would like regarding the execution result. | |||||
| For example, you may want to add your own result type or other | |||||
| For example, you may want to add your result type or other | |||||
| helpful information regarding the execution, or something | helpful information regarding the execution, or something | ||||
| simple like static methods to help you create return types easily. | simple like static methods to help you create return types easily. | ||||
| [!code[Extended Use](samples/customresult_extended.cs)] | [!code[Extended Use](samples/customresult_extended.cs)] | ||||
| After you're done creating your own [RuntimeResult], you can | |||||
| After you're done creating your [RuntimeResult], you can | |||||
| implement it in your command by marking the command return type to | implement it in your command by marking the command return type to | ||||
| `Task<RuntimeResult>`. | `Task<RuntimeResult>`. | ||||
| @@ -100,12 +100,12 @@ And now we can check for it in our [CommandExecuted] handler: | |||||
| ## CommandService.Log Event | ## CommandService.Log Event | ||||
| We have so far covered the handling of various result types, but we | We have so far covered the handling of various result types, but we | ||||
| haven't talked about what to do if the command enters a catastrophic | |||||
| failure (i.e. exceptions). To resolve this, we can make use of the | |||||
| have not talked about what to do if the command enters a catastrophic | |||||
| failure (i.e., exceptions). To resolve this, we can make use of the | |||||
| [CommandService.Log] event. | [CommandService.Log] event. | ||||
| All exceptions thrown during a command execution will be caught and | |||||
| be sent to the Log event under the [LogMessage.Exception] property | |||||
| All exceptions thrown during a command execution are caught and sent | |||||
| to the Log event under the [LogMessage.Exception] property | |||||
| as a [CommandException] type. The [CommandException] class allows | as a [CommandException] type. The [CommandException] class allows | ||||
| us to access the exception thrown, as well as the context | us to access the exception thrown, as well as the context | ||||
| of the command. | of the command. | ||||
| @@ -11,14 +11,14 @@ stopped. | |||||
| To start a connection, invoke the `StartAsync` method on a client that | To start a connection, invoke the `StartAsync` method on a client that | ||||
| supports a WebSocket connection; to end a connection, invoke the | supports a WebSocket connection; to end a connection, invoke the | ||||
| `StopAsync` method. This will gracefully close any open WebSocket or | |||||
| `StopAsync` method, which gracefully closes any open WebSocket or | |||||
| UdpSocket connections. | UdpSocket connections. | ||||
| Since the Start/Stop methods only signal to an underlying connection | Since the Start/Stop methods only signal to an underlying connection | ||||
| manager that a connection needs to be started, **they return before a | manager that a connection needs to be started, **they return before a | ||||
| connection is actually made.** | |||||
| connection is made.** | |||||
| As a result, you will need to hook into one of the connection-state | |||||
| As a result, you need to hook into one of the connection-state | |||||
| based events to have an accurate representation of when a client is | based events to have an accurate representation of when a client is | ||||
| ready for use. | ready for use. | ||||
| @@ -29,7 +29,7 @@ ready to be used. | |||||
| A separate event, `Ready`, is provided on [DiscordSocketClient], which | A separate event, `Ready`, is provided on [DiscordSocketClient], which | ||||
| is raised only when the client has finished guild stream or guild | is raised only when the client has finished guild stream or guild | ||||
| sync, and has a complete guild cache. | |||||
| sync and has a completed guild cache. | |||||
| [DiscordSocketClient]: xref:Discord.WebSocket.DiscordSocketClient | [DiscordSocketClient]: xref:Discord.WebSocket.DiscordSocketClient | ||||
| @@ -41,8 +41,8 @@ sync, and has a complete guild cache. | |||||
| > [!TIP] | > [!TIP] | ||||
| > Avoid running long-running code on the gateway! If you deadlock the | > Avoid running long-running code on the gateway! If you deadlock the | ||||
| > gateway (as explained in [events]), the connection manager will be | |||||
| > unable to recover and reconnect. | |||||
| > gateway (as explained in [events]), the connection manager will | |||||
| > **NOT** be able to recover and reconnect. | |||||
| Assuming the client disconnected because of a fault on Discord's end, | Assuming the client disconnected because of a fault on Discord's end, | ||||
| and not a deadlock on your end, we will always attempt to reconnect | and not a deadlock on your end, we will always attempt to reconnect | ||||
| @@ -50,6 +50,6 @@ and resume a connection. | |||||
| Don't worry about trying to maintain your own connections, the | Don't worry about trying to maintain your own connections, the | ||||
| connection manager is designed to be bulletproof and never fail - if | connection manager is designed to be bulletproof and never fail - if | ||||
| your client doesn't manage to reconnect, you've found a bug! | |||||
| your client does not manage to reconnect, you have found a bug! | |||||
| [events]: xref:Guides.Concepts.Events | [events]: xref:Guides.Concepts.Events | ||||
| @@ -68,7 +68,7 @@ for use on another machine without installing the dependencies first. | |||||
| This can be achieved by using the dotnet CLI too on the development | This can be achieved by using the dotnet CLI too on the development | ||||
| machine: | machine: | ||||
| `dotnet publish -c Release` | |||||
| * `dotnet publish -c Release` | |||||
| Additionally, you may want to target a specific platform when | Additionally, you may want to target a specific platform when | ||||
| publishing the application so you may use the application without | publishing the application so you may use the application without | ||||
| @@ -80,7 +80,7 @@ For example, when targeting a Windows 10 machine, you may want to use | |||||
| the following to create the application in Windows executable | the following to create the application in Windows executable | ||||
| format (.exe): | format (.exe): | ||||
| `dotnet publish -c Release -r win10-x64` | |||||
| * `dotnet publish -c Release -r win10-x64` | |||||
| [.NET Core application deployment]: https://docs.microsoft.com/en-us/dotnet/core/deploying/ | [.NET Core application deployment]: https://docs.microsoft.com/en-us/dotnet/core/deploying/ | ||||
| [Runtime ID]: https://docs.microsoft.com/en-us/dotnet/core/rid-catalog | [Runtime ID]: https://docs.microsoft.com/en-us/dotnet/core/rid-catalog | ||||
| @@ -56,7 +56,7 @@ DiscordSocketClient. | |||||
| > [FAQ](xref:FAQ.Basics.GetStarted) page. | > [FAQ](xref:FAQ.Basics.GetStarted) page. | ||||
| More detailed versions of entities can be pulled from the basic | More detailed versions of entities can be pulled from the basic | ||||
| entities, e.g. `SocketGuild.GetUser`, which returns a | |||||
| entities, e.g., `SocketGuild.GetUser`, which returns a | |||||
| `SocketGuildUser`, or `SocketGuild.GetChannel`, which returns a | `SocketGuildUser`, or `SocketGuild.GetChannel`, which returns a | ||||
| `SocketGuildChannel`. Again, you may need to cast these objects to get | `SocketGuildChannel`. Again, you may need to cast these objects to get | ||||
| a variant of the type that you need. | a variant of the type that you need. | ||||
| @@ -74,7 +74,7 @@ object. | |||||
| [Cacheable]: xref:Discord.Cacheable`2 | [Cacheable]: xref:Discord.Cacheable`2 | ||||
| > [!NOTE] | > [!NOTE] | ||||
| > Many events relating to a Message entity (i.e. `MessageUpdated` and | |||||
| > Many events relating to a Message entity (i.e., `MessageUpdated` and | |||||
| > `ReactionAdded`) rely on the client's message cache, which is | > `ReactionAdded`) rely on the client's message cache, which is | ||||
| > **not** enabled by default. Set the `MessageCacheSize` flag in | > **not** enabled by default. Set the `MessageCacheSize` flag in | ||||
| > @Discord.WebSocket.DiscordSocketConfig to enable it. | > @Discord.WebSocket.DiscordSocketConfig to enable it. | ||||
| @@ -16,7 +16,7 @@ section. | |||||
| > [!WARNING] | > [!WARNING] | ||||
| > Due to the nature of Discord.Net's event system, all log event | > Due to the nature of Discord.Net's event system, all log event | ||||
| > handlers will be executed synchronously on the gateway thread. If your | > handlers will be executed synchronously on the gateway thread. If your | ||||
| > log output will be dumped to a Web API (e.g. Sentry), you are advised | |||||
| > log output will be dumped to a Web API (e.g., Sentry), you are advised | |||||
| > to wrap your output in a `Task.Run` so the gateway thread does not | > to wrap your output in a `Task.Run` so the gateway thread does not | ||||
| > become blocked while waiting for logging data to be written. | > become blocked while waiting for logging data to be written. | ||||
| @@ -28,13 +28,13 @@ addon will run on all platforms. | |||||
| `Discord.Net.Rest` provides a set of concrete classes to be used | `Discord.Net.Rest` provides a set of concrete classes to be used | ||||
| **strictly** with the REST portion of Discord's API. Entities in this | **strictly** with the REST portion of Discord's API. Entities in this | ||||
| implementation are prefixed with `Rest` (e.g. `RestChannel`). | |||||
| implementation are prefixed with `Rest` (e.g., `RestChannel`). | |||||
| `Discord.Net.Rpc` provides a set of concrete classes that are used | `Discord.Net.Rpc` provides a set of concrete classes that are used | ||||
| with Discord's RPC API. Entities in this implementation are prefixed | with Discord's RPC API. Entities in this implementation are prefixed | ||||
| with `Rpc` (e.g. `RpcChannel`). | |||||
| with `Rpc` (e.g., `RpcChannel`). | |||||
| `Discord.Net.WebSocket` provides a set of concrete classes that are | `Discord.Net.WebSocket` provides a set of concrete classes that are | ||||
| used primarily with Discord's WebSocket API or entities that are kept | used primarily with Discord's WebSocket API or entities that are kept | ||||
| in cache. When developing bots, you will be using this implementation. | in cache. When developing bots, you will be using this implementation. | ||||
| All entities are prefixed with `Socket` (e.g. `SocketChannel`). | |||||
| All entities are prefixed with `Socket` (e.g., `SocketChannel`). | |||||