@@ -2,9 +2,11 @@ | |||||
title: Entities | title: Entities | ||||
--- | --- | ||||
>[!NOTE] | |||||
This article is written with the Socket variants of entities in mind, | |||||
not the general interfaces or Rest/Rpc entities. | |||||
# Entities in Discord.NET | |||||
> [!NOTE] | |||||
> This article is written with the Socket variants of entities in mind, | |||||
> not the general interfaces or Rest/Rpc entities. | |||||
Discord.Net provides a versatile entity system for navigating the | Discord.Net provides a versatile entity system for navigating the | ||||
Discord API. | Discord API. | ||||
@@ -15,9 +17,9 @@ Due to the nature of the Discord API, some entities are designed with | |||||
multiple variants; for example, `SocketUser` and `SocketGuildUser`. | multiple variants; for example, `SocketUser` and `SocketGuildUser`. | ||||
All models will contain the most detailed version of an entity | All models will contain the most detailed version of an entity | ||||
possible, even if the type is less detailed. | |||||
possible, even if the type is less detailed. | |||||
For example, in the case of the `MessageReceived` event, a | |||||
For example, in the case of the `MessageReceived` event, a | |||||
`SocketMessage` is passed in with a channel property of type | `SocketMessage` is passed in with a channel property of type | ||||
`SocketMessageChannel`. All messages come from channels capable of | `SocketMessageChannel`. All messages come from channels capable of | ||||
messaging, so this is the only variant of a channel that can cover | messaging, so this is the only variant of a channel that can cover | ||||
@@ -42,11 +44,11 @@ The most basic forms of entities, `SocketGuild`, `SocketUser`, and | |||||
cache, and can be retrieved using the respective `GetXXX` method on | cache, and can be retrieved using the respective `GetXXX` method on | ||||
DiscordSocketClient. | DiscordSocketClient. | ||||
>[!TIP] | |||||
It is **vital** that you use the proper IDs for an entity when using | |||||
a GetXXX method. It is recommended that you enable Discord's | |||||
_developer mode_ to allow easy access to entity IDs, found in | |||||
Settings > Appearance > Advanced | |||||
> [!TIP] | |||||
> It is **vital** that you use the proper IDs for an entity when using | |||||
> a GetXXX method. It is recommended that you enable Discord's | |||||
> _developer mode_ to allow easy access to entity IDs, found in | |||||
> Settings > Appearance > Advanced. | |||||
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 | ||||
@@ -54,18 +56,6 @@ entities, e.g. `SocketGuild.GetUser`, 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. | ||||
### Samples | |||||
[!code-csharp[Entity Sample](samples/entities.cs)] | |||||
### Tips | |||||
Avoid using boxing-casts to coerce entities into a variant, use the | |||||
[`as`] keyword, and a null-conditional operator instead. | |||||
This allows you to write safer code and avoid [InvalidCastExceptions]. | |||||
For example, `(message.Author as SocketGuildUser)?.Nickname`. | |||||
### Sample | |||||
[`as`]: https://docs.microsoft.com/en-us/dotnet/csharp/language-reference/keywords/as | |||||
[InvalidCastExceptions]: https://msdn.microsoft.com/en-us/library/system.invalidcastexception(v=vs.110).aspx | |||||
[!code-csharp[Entity Sample](samples/entities.cs)] |
@@ -2,6 +2,8 @@ | |||||
title: Working with Events | title: Working with Events | ||||
--- | --- | ||||
# Events in Discord.NET | |||||
Events in Discord.Net are consumed in a similar manner to the standard | Events in Discord.Net are consumed in a similar manner to the standard | ||||
convention, with the exception that every event must be of the type | convention, with the exception that every event must be of the type | ||||
`System.Threading.Tasks.Task` and instead of using `EventArgs`, the | `System.Threading.Tasks.Task` and instead of using `EventArgs`, the | ||||
@@ -61,7 +63,7 @@ This pattern is typically only found on `EntityUpdated` events. | |||||
#### Cacheable | #### Cacheable | ||||
An event handler with a signature of `Func<Cacheable, Entity, Task>` | An event handler with a signature of `Func<Cacheable, Entity, Task>` | ||||
means that the `before` state of the entity was not provided by the | |||||
means that the `before` state of the entity was not provided by the | |||||
API, so it can either be pulled from the client's cache or | API, so it can either be pulled from the client's cache or | ||||
downloaded from the API. | downloaded from the API. | ||||
@@ -70,15 +72,12 @@ object. | |||||
[Cacheable]: xref:Discord.Cacheable`2 | [Cacheable]: xref:Discord.Cacheable`2 | ||||
### Samples | |||||
[!code-csharp[Event Sample](samples/events.cs)] | |||||
> [!NOTE] | |||||
> Many events relating to a Message entity (i.e. `MessageUpdated` and | |||||
> `ReactionAdded`) rely on the client's message cache, which is | |||||
> **not** enabled by default. Set the `MessageCacheSize` flag in | |||||
> @Discord.WebSocket.DiscordSocketConfig to enable it. | |||||
### Tips | |||||
### Sample | |||||
Many events relating to a Message entity (i.e. `MessageUpdated` and | |||||
`ReactionAdded`) rely on the client's message cache, which is | |||||
**not** enabled by default. Set the `MessageCacheSize` flag in | |||||
[DiscordSocketConfig] to enable it. | |||||
[DiscordSocketConfig]: xref:Discord.WebSocket.DiscordSocketConfig | |||||
[!code-csharp[Event Sample](samples/events.cs)] |
@@ -2,18 +2,26 @@ | |||||
title: Logging | title: Logging | ||||
--- | --- | ||||
Discord.Net's clients provide a [Log] event that all messages will be | |||||
# Logging in Discord.NET | |||||
Discord.Net's clients provide a log event that all messages will be | |||||
dispatched over. | dispatched over. | ||||
For more information about events in Discord.Net, see the [Events] | For more information about events in Discord.Net, see the [Events] | ||||
section. | section. | ||||
[Log]: xref:Discord.Rest.BaseDiscordClient.Log | |||||
[Events]: events.md | [Events]: events.md | ||||
### Usage | |||||
> [!WARNING] | |||||
> Due to the nature of Discord.Net's event system, all log event | |||||
> 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 | |||||
> to wrap your output in a `Task.Run` so the gateway thread does not | |||||
> become blocked while waiting for logging data to be written. | |||||
### Usage in Client(s) | |||||
To receive log events, simply hook the discord client's log method | |||||
To receive log events, simply hook the Discord client's @Discord.Rest.BaseDiscordClient.Log | |||||
to a `Task` with a single parameter of type [LogMessage]. | to a `Task` with a single parameter of type [LogMessage]. | ||||
It is recommended that you use an established function instead of a | It is recommended that you use an established function instead of a | ||||
@@ -24,8 +32,8 @@ to a logging function to write their own messages. | |||||
### Usage in Commands | ### Usage in Commands | ||||
Discord.Net's [CommandService] also provides a log event, identical | |||||
in signature to other log events. | |||||
Discord.Net's [CommandService] also provides a @Discord.Commands.CommandService.Log | |||||
event, identical in signature to other log events. | |||||
Data logged through this event is typically coupled with a | Data logged through this event is typically coupled with a | ||||
[CommandException], where information about the command's context | [CommandException], where information about the command's context | ||||
@@ -34,14 +42,6 @@ and error can be found and handled. | |||||
[CommandService]: xref:Discord.Commands.CommandService | [CommandService]: xref:Discord.Commands.CommandService | ||||
[CommandException]: xref:Discord.Commands.CommandException | [CommandException]: xref:Discord.Commands.CommandException | ||||
#### Samples | |||||
### Sample | |||||
[!code-csharp[Logging Sample](samples/logging.cs)] | [!code-csharp[Logging Sample](samples/logging.cs)] | ||||
#### Tips | |||||
Due to the nature of Discord.Net's event system, all log event | |||||
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 | |||||
to wrap your output in a `Task.Run` so the gateway thread does not | |||||
become blocked while waiting for logging data to be written. |
@@ -27,12 +27,12 @@ required. When using .NET Framework, it is suggested to target | |||||
Release builds of Discord.Net will be published to the | Release builds of Discord.Net will be published to the | ||||
[official NuGet feed]. | [official NuGet feed]. | ||||
Development builds of Discord.Net, as well as addons *(TODO)* are | |||||
published to our development [MyGet feed]. | |||||
Development builds of Discord.Net, as well as add-ons are published to | |||||
our development [MyGet feed]. | |||||
Direct feed link: `https://www.myget.org/F/discord-net/api/v3/index.json` | Direct feed link: `https://www.myget.org/F/discord-net/api/v3/index.json` | ||||
Not sure how to add a direct feed? See how [with Visual Studio] or | |||||
Not sure how to add a direct feed? See how [with Visual Studio] or | |||||
[without Visual Studio]. | [without Visual Studio]. | ||||
[official NuGet feed]: https://nuget.org | [official NuGet feed]: https://nuget.org | ||||
@@ -15,16 +15,15 @@ account on Discord. | |||||
1. Visit the [Discord Applications Portal]. | 1. Visit the [Discord Applications Portal]. | ||||
2. Create a New Application. | 2. Create a New Application. | ||||
3. Give the application a name (this will be the bot's initial | |||||
username). | |||||
3. Give the application a name (this will be the bot's initial username). | |||||
4. Create the Application. | 4. Create the Application. | ||||
 | |||||
 | |||||
5. In the application review page, click **Create a Bot User**. | 5. In the application review page, click **Create a Bot User**. | ||||
 | |||||
 | |||||
6. Confirm the popup. | 6. Confirm the popup. | ||||
7. If this bot will be public, check "Public Bot." **Do not tick any | 7. If this bot will be public, check "Public Bot." **Do not tick any | ||||
other options!** | other options!** | ||||
@@ -33,26 +32,25 @@ other options!** | |||||
## Adding your bot to a server | ## Adding your bot to a server | ||||
Bots **cannot** use invite links, they must be explicitly invited | |||||
Bots **cannot** use invite links; they must be explicitly invited | |||||
through the OAuth2 flow. | through the OAuth2 flow. | ||||
1. Open your bot's application on the [Discord Applications Portal]. | 1. Open your bot's application on the [Discord Applications Portal]. | ||||
2. Retrieve the app's **Client ID**. | 2. Retrieve the app's **Client ID**. | ||||
 | |||||
 | |||||
3. Create an OAuth2 authorization URL | 3. Create an OAuth2 authorization URL | ||||
`https://discordapp.com/oauth2/authorize?client_id=<CLIENT ID>&scope=bot` | `https://discordapp.com/oauth2/authorize?client_id=<CLIENT ID>&scope=bot` | ||||
4. Open the authorization URL in your browser. | 4. Open the authorization URL in your browser. | ||||
5. Select a server. | 5. Select a server. | ||||
6. Click on authorize. | 6. Click on authorize. | ||||
>[!NOTE] | |||||
Only servers where you have the `MANAGE_SERVER` permission will be | |||||
present in this list. | |||||
 | |||||
> [!NOTE] | |||||
> Only servers where you have the `MANAGE_SERVER` permission will be | |||||
> present in this list. | |||||
 | |||||
## Connecting to Discord | ## Connecting to Discord | ||||
@@ -75,7 +73,7 @@ async main. | |||||
[!code-csharp[Async Context](samples/intro/async-context.cs)] | [!code-csharp[Async Context](samples/intro/async-context.cs)] | ||||
As a result of this, your program will now start and immediately | As a result of this, your program will now start and immediately | ||||
jump into an async context. This will allow us to create a connection | |||||
jump into an async context. This will allow us to create a connection | |||||
to Discord later on without needing to worry about setting up the | to Discord later on without needing to worry about setting up the | ||||
correct async implementation. | correct async implementation. | ||||
@@ -123,7 +121,7 @@ log handler that was just created. Events in Discord.Net work | |||||
similarly to other events in C#, so hook this event the way that | similarly to other events in C#, so hook this event the way that | ||||
you typically would. | you typically would. | ||||
Next, you will need to "login to Discord" with the `LoginAsync` | |||||
Next, you will need to "login to Discord" with the `LoginAsync` | |||||
method. | method. | ||||
You may create a variable to hold your bot's token (this can be found | You may create a variable to hold your bot's token (this can be found | ||||
@@ -131,11 +129,11 @@ on your bot's application page on the [Discord Applications Portal]). | |||||
 |  | ||||
>[!IMPORTANT] | |||||
Your bot's token can be used to gain total access to your bot, so | |||||
**do __NOT__ share this token with anyone else!** It may behoove you | |||||
to store this token in an external file if you plan on distributing | |||||
the source code for your bot. | |||||
> [!IMPORTANT] | |||||
> Your bot's token can be used to gain total access to your bot, so | |||||
> **do __NOT__ share this token with anyone else!** It may behoove you | |||||
> to store this token in an external file if you plan on distributing | |||||
> the source code for your bot. | |||||
We may now invoke the client's `StartAsync` method, which will | We may now invoke the client's `StartAsync` method, which will | ||||
start connection/reconnection logic. It is important to note that | start connection/reconnection logic. It is important to note that | ||||
@@ -156,27 +154,26 @@ The following lines can now be added: | |||||
At this point, feel free to start your program and see your bot come | At this point, feel free to start your program and see your bot come | ||||
online in Discord. | online in Discord. | ||||
>[!TIP] | |||||
Encountering a `PlatformNotSupportedException` when starting your bot? | |||||
This means that you are targeting a platform where .NET's default | |||||
WebSocket client is not supported. Refer to the [installation guide] | |||||
for how to fix this. | |||||
> [!TIP] | |||||
> Encountering a `PlatformNotSupportedException` when starting your bot? | |||||
> This means that you are targeting a platform where .NET's default | |||||
> WebSocket client is not supported. Refer to the [installation guide] | |||||
> for how to fix this. | |||||
[DiscordSocketClient]: xref:Discord.WebSocket.DiscordSocketClient | [DiscordSocketClient]: xref:Discord.WebSocket.DiscordSocketClient | ||||
[installation guide]: installing.md#installing-on-net-standard-11 | [installation guide]: installing.md#installing-on-net-standard-11 | ||||
### Handling a 'ping' | ### Handling a 'ping' | ||||
>[!WARNING] | |||||
Please note that this is *not* a proper way to create a command. | |||||
Use the `CommandService` provided by the library instead, as explained | |||||
in the [Command Guide] section. | |||||
> [!WARNING] | |||||
> Please note that this is *not* a proper way to create a command. | |||||
> Use the `CommandService` provided by the library instead, as explained | |||||
> in the [Command Guide] section. | |||||
Now that we have learned how to open a connection to Discord, we can | Now that we have learned how to open a connection to Discord, we can | ||||
begin handling messages that users are sending. | |||||
To start out, our bot will listen for any message where the content | |||||
is equal to `!ping` and respond back with "Pong!". | |||||
begin handling messages that users are sending. To start out, our bot | |||||
will listen for any message where the content is equal to `!ping` and | |||||
respond back with "Pong!". | |||||
Since we want to listen for new messages, the event to hook into | Since we want to listen for new messages, the event to hook into | ||||
is [MessageReceived]. | is [MessageReceived]. | ||||
@@ -201,7 +198,7 @@ channel object is of type [SocketMessageChannel], we can invoke the | |||||
`SendMessageAsync` instance method. For the message content, send back | `SendMessageAsync` instance method. For the message content, send back | ||||
a string containing "Pong!". | a string containing "Pong!". | ||||
You should have now added the following lines: | |||||
You should have now added the following lines, | |||||
[!code-csharp[Message](samples/intro/message.cs)] | [!code-csharp[Message](samples/intro/message.cs)] | ||||
@@ -1,17 +1,15 @@ | |||||
<Project Sdk="Microsoft.NET.Sdk"> | <Project Sdk="Microsoft.NET.Sdk"> | ||||
<!-- | <!-- | ||||
The following may differ depending on the latest version of | The following may differ depending on the latest version of | ||||
.NET Core Framework or Discord.NET. | .NET Core Framework or Discord.NET. | ||||
--> | --> | ||||
<PropertyGroup> | <PropertyGroup> | ||||
<OutputType>Exe</OutputType> | <OutputType>Exe</OutputType> | ||||
<TargetFramework>netcoreapp1.1</TargetFramework> | |||||
<NoWin32Manifest>true</NoWin32Manifest> | |||||
<TargetFramework>netcoreapp2.0</TargetFramework> | |||||
</PropertyGroup> | </PropertyGroup> | ||||
<ItemGroup> | <ItemGroup> | ||||
<PackageReference Include="Discord.Net" Version="1.*" /> | |||||
<PackageReference Include="Discord.Net" Version="2.*" /> | |||||
</ItemGroup> | </ItemGroup> | ||||
</Project> | </Project> |