From 6a5cf07e0a619ab3aa7f457bf48e3f31fc271719 Mon Sep 17 00:00:00 2001 From: Hsu Still <341464@gmail.com> Date: Mon, 19 Mar 2018 14:09:50 +0800 Subject: [PATCH] Comply with CONTRIBUTING.md - As well as making minor adjustments here and there --- docs/faq/0-GettingStarted.md | 37 ------ docs/faq/1-Basics.md | 18 --- docs/faq/2-BasicOperations.md | 75 ------------ docs/faq/4-Commands.md | 81 ------------- docs/faq/5-Legacy.md | 11 -- ...cedOperations.md => AdvancedOperations.md} | 0 docs/faq/BasicOperations.md | 74 ++++++++++++ docs/faq/ClientBasics.md | 47 ++++++++ docs/faq/Commands.md | 114 ++++++++++++++++++ docs/faq/GettingStarted.md | 71 +++++++++++ docs/faq/Glossary.md | 18 +++ docs/faq/Legacy.md | 19 +++ docs/faq/images/snowflake.png | Bin 0 -> 73062 bytes docs/faq/samples/basics/cast.cs | 15 +++ docs/faq/samples/basics/emoji.cs | 18 +++ docs/faq/samples/commands/DI.cs | 27 +++++ docs/faq/samples/commands/Remainder.cs | 19 +++ docs/faq/toc.yml | 14 ++- 18 files changed, 430 insertions(+), 228 deletions(-) delete mode 100644 docs/faq/0-GettingStarted.md delete mode 100644 docs/faq/1-Basics.md delete mode 100644 docs/faq/2-BasicOperations.md delete mode 100644 docs/faq/4-Commands.md delete mode 100644 docs/faq/5-Legacy.md rename docs/faq/{3-AdvancedOperations.md => AdvancedOperations.md} (100%) create mode 100644 docs/faq/BasicOperations.md create mode 100644 docs/faq/ClientBasics.md create mode 100644 docs/faq/Commands.md create mode 100644 docs/faq/GettingStarted.md create mode 100644 docs/faq/Glossary.md create mode 100644 docs/faq/Legacy.md create mode 100644 docs/faq/images/snowflake.png create mode 100644 docs/faq/samples/basics/cast.cs create mode 100644 docs/faq/samples/basics/emoji.cs create mode 100644 docs/faq/samples/commands/DI.cs create mode 100644 docs/faq/samples/commands/Remainder.cs diff --git a/docs/faq/0-GettingStarted.md b/docs/faq/0-GettingStarted.md deleted file mode 100644 index 4b0c5cc36..000000000 --- a/docs/faq/0-GettingStarted.md +++ /dev/null @@ -1,37 +0,0 @@ -# Basic Concepts / Getting Started - -## How do I get started? -First of all, welcome! Before you delve into using the library, however, you should have some decent understanding of the language you are about to use. This library touches on TAP (Task-based Asynchronous Pattern), polymorphism, interface and many more advanced topics extensively. Please make sure that you understand these topics to some extent before proceeding. - - Here are some examples: - 1. [Official quick start guide](https://github.com/RogueException/Discord.Net/blob/dev/docs/guides/getting_started/samples/intro/structure.cs) - 2. [Official template](https://github.com/foxbot/DiscordBotBase/tree/csharp/src/DiscordBot) - -Please note that you should *not* try to blindly copy paste the code. It is meant to be a template or a guide. It is not meant to be something that will work out of the box. - -## How do I add my bot to my server/guild? - -The [OAuth2 URL](https://discordapp.com/developers/tools/oauth2-url-generator) can be generated via the Discord developer page. This allows you to set the permissions that the bot will be added with. With this method, bots will also be assigned their own special roles that normal users cannot use, which is what we call a `Managed` role. - -## What is a Client/User/Object ID? Is it the token? - -Each user and object on Discord has its own snowflake ID generated based on various conditions, see [here](https://this.is-a-professional-domain.com/7da0e4.png). The ID can be seen by anyone; it is public. It is merely used to identify an object in the Discord ecosystem. Many things in the library require an ID to retrieve the said object. - - There are 2 ways to obtain the said ID. - 1. Enable Discord's developer mode. With developer mode enabled, you can - as an example - right click on a guild and copy the guild id (please note that this does not apply to Role IDs, see below). - ![Developer Mode](images/dev-mode.png) - 2. Escape the object using `\` in front the object. For example, when you do `\@Example#1234`, it will return the user ID of the aforementioned user. - -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 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. - -## How do I get the role ID? - -Several common ways to do this: - 1. Make the role mentionable and mention the role, and escape it using the `\` character in front. - 2. Inspect the roles collection within the guild via your debugger. - -Please note that right-clicking on the role and copying the ID will **not** work. It will only copy the message ID. - -## I have more questions! - -Please visit us at #dotnet_discord-net at the Discord API server. Describe the problem in details to us, and preferably with the problematic code uploaded onto [Hastebin](https://hastebin.com). diff --git a/docs/faq/1-Basics.md b/docs/faq/1-Basics.md deleted file mode 100644 index a30e1c252..000000000 --- a/docs/faq/1-Basics.md +++ /dev/null @@ -1,18 +0,0 @@ -# Client Basics Questions - -## My client keeps returning 401 upon logging in! - - There are few possible reasons why this may occur. - 1. You are not using the appropriate `TokenType`. If you are using a bot account created from the Discord Developer portal, you should be using `TokenType.Bot`. - 2. You are not using the correct login credentials. Please keep in mind that tokens start with `Mj*`. If it starts with any other characters, chances are, you are using the *client secret*, which has nothing to do with the login token. - -## How do I do X, Y, Z when my bot connects/logs on? Why do I get a `NullReferenceException` upon calling any client methods after connect? - - Your bot should not attempt to interact in any way with guilds/servers until the `Ready` event fires. When the bot connects, it first has to download guild information from Discord in order for you to get access to any server information; the client is not ready at this point. Technically, the `GuildAvailable` event fires once the data for a particular guild has downloaded; however, it's best to wait for all guilds to be downloaded. Once all downloads are complete, the `Ready` 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? - - If you need to do anything with messages (e.g. checking Reactions, checking the content of edited/deleted messages), you must set the `MessageCacheSize` in your `DiscordSocketConfig` settings in order to use the cached message entity. Read more about it [here](https://discord.foxbot.me/docs/guides/concepts/events.html#cacheable). - 1. Message Cache must be enabled. - 2. Hook the `MessageUpdated` event. This event provides a *before* and *after* object. - 3. Only messages received *AFTER* the bot comes online will be available in the cache. \ No newline at end of file diff --git a/docs/faq/2-BasicOperations.md b/docs/faq/2-BasicOperations.md deleted file mode 100644 index e8424448d..000000000 --- a/docs/faq/2-BasicOperations.md +++ /dev/null @@ -1,75 +0,0 @@ -# Basic Operations Questions - -## How should I safely check a type? -In Discord.NET, the idea of polymorphism is used throughout. You may need to cast the object as a certain type before you can perform any action. There are several ways to cast, with direct casting `(Type)type` being the the least recommended, as it *can* throw an `InvalidCastException` when the object isn't the desired type. Please refer to [this post](https://docs.microsoft.com/en-us/dotnet/csharp/programming-guide/types/how-to-safely-cast-by-using-as-and-is-operators) for more details. - -A good and safe casting example: -```cs -public async Task MessageReceivedHandler(SocketMessage msg) -{ - // Option 1: - // Using the `as` keyword, which will return `null` if the object isn't the desired type. - var usermsg = msg as SocketUserMessage; - // We bail when the message isn't the desired type. - if (msg == null) return; - - // Option 2: - // Using the `is` keyword to cast (C#7 or above only) - if (msg is SocketUserMessage usermsg) - { - // Do things - } -} -``` - -## How do I send a message? - - Any implementation of **IMessageChannel** has a **SendMessageAsync** method. Using the client, you can get an appropriate channel (**GetChannel(id)**) to send a message to. Remember, when using Discord.NET, polymorphism is a common recurring theme. This means an object may take in many shapes or form, which means casting is your friend. You should attempt to cast the channel as an `IMessageChannel` or any other entity that implements it to be able to message. - -## How can I tell if a message is from X, Y, Z? - - You may check message channel type. - - * A **Text channel** (`ITextChannel`) is a message channel from a Guild. - * A **DM channel** (`IDMChannel`) is a message channel from a DM. - * A **Group channel** (`IGroupChannel`) is a message channel from a Group (this is rarely used, due to the bot's inability to join a group). - * A **Private channel** (`IPrivateChannel`) is a DM or a Group. - * A **Message channel** (`IMessageChannel`) is all of the above. - -## How do I add hyperlink text to an embed? - - Embeds can use standard [markdown](https://support.discordapp.com/hc/en-us/articles/210298617-Markdown-Text-101-Chat-Formatting-Bold-Italic-Underline-) in the Description as well as in field values. With that in mind, links can be added using the following format \[text](link). - - -## How do I add reactions to a message? - - Any entities that implement `IUserMessage` has an **AddReactionAsync** method. This method expects an `IEmote` as a parameter. In Discord.Net, an Emote represents a server custom emote, while an Emoji is a Unicode emoji (standard emoji). Both `Emoji` and `Emote` implement `IEmote` and are valid options. - ```cs - // bail if the message is not a user one (system messages cannot have reactions) - var usermsg = msg as IUserMessage; - if (usermsg == null) return; - - // standard Unicode emojis - Emoji emoji = new Emoji("👍"); - // or - // Emoji emoji = new Emoji("\u23F8"); - - // custom guild emotes - Emote emote = Emote.Parse("<:dotnet:232902710280716288>"); - // using Emote.TryParse may be safer in regards to errors being thrown; - // please note that the method does not verify if the emote exists, - // it simply creates the Emote object for you. - - // add the reaction to the message - await usermsg.AddReactionAsync(emoji); - await usermsg.AddReactionAsync(emote); - ``` - -## Why am I getting so many preemptive rate limits when I try to add more than one reactions? - - This is due to how .NET parses the HTML header, mistreating 0.25sec/action to 1sec. This casues the lib to throw preemptive rate limit more frequently than it should for methods such as adding reactions. - - -## Can I opt-out of preemptive rate limits? - - Unfortunately, not at the moment. See [#401](https://github.com/RogueException/Discord.Net/issues/401). \ No newline at end of file diff --git a/docs/faq/4-Commands.md b/docs/faq/4-Commands.md deleted file mode 100644 index 96d6cb053..000000000 --- a/docs/faq/4-Commands.md +++ /dev/null @@ -1,81 +0,0 @@ -# Command-related Questions - -## How can I restrict some of my commands so only certain users can execute them? - - Based on how you want to implement the restrictions, 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` etc.*). - If, however, you wish to restrict the commands based on the user's role, you can eithe create your own custom precondition or use Joe4evr's [Preconditions Addons](https://github.com/Joe4evr/Discord.Addons/tree/master/src/Discord.Addons.Preconditions) that provides a few custom preconditions that aren't provided in the stock library. Its source can also be used as an example for creating your own custom preconditions. - - -## I'm getting an error about `Assembly#GetEntryAssembly`. What now? - - 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. - - -## What does [Remainder] do in the command signature? - - The `RemainderAttribute` leaves the string unparsed, meaning you don't 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. - ```cs - // !echo repeat this message in chat - [Command("echo")] - [Summary("Replies whatever the user adds")] - [Remarks("The entire message is considered one String")] - public Task EchoAsync([Remainder]String text) => ReplyAsync(text); - - // !echo repeat this message in chat - [Command("echo")] - [Summary("Replies whatever the user adds")] - [Remarks("This command will error for having too many arguments. - The message would be seen as having 5 parameters while the method only accepts one. - Wrapping the message in quotes solves this - '!echo repeat this message in chat' - - this way, the system knows the entire message is to be parsed as a single String")] - public Task EchoAsync(String text) => ReplyAsync(text); - ``` - -## 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 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 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 implementation of Dependency Injection before proceeding. You can learn more about it [here](https://docs.microsoft.com/en-us/aspnet/core/fundamentals/dependency-injection), and how it works in Discord.NET [here](https://discord.foxbot.me/latest/guides/commands/commands.html#usage-in-modules). A brief example of service and dependency injection can be seen below, - -```cs -public class MyService -{ - public string MyCoolString {get; set;} -} -public class SetupOrWhatever -{ - public IServiceProvider BuildProvider() => new ServiceCollection().AddSingleton().BuildServiceProvider(); -} -public class MyModule : ModuleBase -{ - // Inject via public settable prop - public MyService MyService {get; set;} - // or via ctor - private readonly MyService _myService; - public MyModule (MyService myService) => _myService = myService; - [Command("setorprintstring")] - public Task GetOrSetStringAsync() - { - if (_myService.MyCoolString == null) _myService.MyCoolString = "ya boi"; - return ReplyAsync(_myService.MyCoolString); - } -} -``` - -## 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 long-running task, 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. - - To resolve this, the library has designed a flag called `RunMode`. There are 2 main `RunMode`s. One being `RunMode.Sync`, which is the default; another being `RunMode.Async`. `RunMode.Async` essentially calls an unawaited Task and continues with the execution without waiting for the command task to finish. You should use `RunMode.Async` in either the `CommandAttribute` or the `DefaultRunMode` flag in `CommandServiceConfig`. Further details regarding `RunMode.Async` can be found below. - -## Okay, that's great and all, but how does `RunMode.Async` work, and if it's so great, why is the lib *not* using it by default? - - As with any async operation, `RunMode.Async` also comes at a cost. The following are the caveats with RunMode.Async, - 1) You introduce race condition. - 2) Unnecessary overhead caused by async state machine (learn more about it [here](https://www.red-gate.com/simple-talk/dotnet/net-tools/c-async-what-is-it-and-how-does-it-work/)). - 3) `CommandService#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. - - However, there are ways to remedy #3 and #4. - - For #3, in Discord.NET 2.0, the library introduces a new event called `CommandExecuted`, which is raised whenever the command is finished. This event will be called regardless of the `RunMode` type and will return the appropriate execution result - - For #4, exceptions are caught in `CommandService#Log` under `(CommandException)LogMessage.Exception`. \ No newline at end of file diff --git a/docs/faq/5-Legacy.md b/docs/faq/5-Legacy.md deleted file mode 100644 index 9f10fd400..000000000 --- a/docs/faq/5-Legacy.md +++ /dev/null @@ -1,11 +0,0 @@ -# Legacy Questions - -## X, Y, Z does not work! It doesn't return a valid value anymore. - If you're currently using 1.0.0, please upgrade to the latest 2.0 beta to ensure maximum compatibility. Several methods or props may be broken in 1.0.x and will not be fixed in the 1.0 branch due to their breaking nature. - Notable breaking changes are as follows, - * `IChannel#IsNsfw` has been replaced with `ITextChannel#IsNsfw` and now returns valid value in 2.0. - * Bulk message removal (`DeletedMessagesAsync`) has been moved from `IMessageChannel` to `ITextChannel`. - * `IAsyncEnumerable#Flatten` has been renamed to `FlattenAsync`. - -## I came from an earlier version of Discord.NET 1.0, and DependencyMap doesn't seem to exist anymore in the later revision? What happened to it? - The `DependencyMap` has been replaced with Microsoft's [DependencyInjection](https://docs.microsoft.com/en-us/aspnet/core/fundamentals/dependency-injection) Abstractions. An example usage can be seen [here](https://github.com/foxbot/DiscordBotBase/blob/csharp/src/DiscordBot/Program.cs#L36). \ No newline at end of file diff --git a/docs/faq/3-AdvancedOperations.md b/docs/faq/AdvancedOperations.md similarity index 100% rename from docs/faq/3-AdvancedOperations.md rename to docs/faq/AdvancedOperations.md diff --git a/docs/faq/BasicOperations.md b/docs/faq/BasicOperations.md new file mode 100644 index 000000000..c9e1d7d6b --- /dev/null +++ b/docs/faq/BasicOperations.md @@ -0,0 +1,74 @@ +# Basic Operations Questions + +## How should I safely check a type? +In Discord.NET, the idea of polymorphism is used throughout. You may +need to cast the object as a certain type before you can perform any +action. There are several ways to cast, with direct casting +`(Type)type` being the the least recommended, as it *can* throw an +[InvalidCastException] when the object isn't the desired type. +Please refer to [this post] for more details. + +A good and safe casting example: + +[!code-csharp[Casting](samples/basics/cast.cs)] + +[InvalidCastException]: https://docs.microsoft.com/en-us/dotnet/api/system.invalidcastexception +[this post]: https://docs.microsoft.com/en-us/dotnet/csharp/programming-guide/types/how-to-safely-cast-by-using-as-and-is-operators + +## How do I send a message? + +Any implementation of [IMessageChannel] has a [SendMessageAsync] +method. You can get the channel via [GetChannel] under the client. +Remember, when using Discord.NET, polymorphism is a common recurring +theme. This means an object may take in many shapes or form, which +means casting is your friend. You should attempt to cast the channel +as an [IMessageChannel] or any other entity that implements it to be +able to message. + +[SendMessageAsync]: xref:Discord.IMessageChannel#Discord_IMessageChannel_SendMessageAsync_System_String_System_Boolean_Discord_Embed_Discord_RequestOptions_ +[GetChannel]: xref:Discord.WebSocket.DiscordSocketClient#Discord_WebSocket_DiscordSocketClient_GetChannel_System_UInt64_ + +## How can I tell if a message is from X, Y, Z? + +You may check the message channel type. Visit [Glossary] to see the +various types of channels. + +[Glossary]: Glossary.md + +## How do I add hyperlink text to an embed? + +Embeds can use standard [markdown] in the description field as well as + in field values. With that in mind, links can be added using the + following format \[text](link). + +[markdown]: https://support.discordapp.com/hc/en-us/articles/210298617-Markdown-Text-101-Chat-Formatting-Bold-Italic-Underline- + +## How do I add reactions to a message? + +Any entities that implement [IUserMessage] has an [AddReactionAsync] +method. This method expects an [IEmote] as a parameter. +In Discord.Net, an Emote represents a server custom emote, while an +Emoji is a Unicode emoji (standard emoji). Both [Emoji] and [Emote] +implement [IEmote] and are valid options. + +[!code-csharp[Emoji](samples/basics/emoji.cs)] + +[AddReactionAsync]: xref:Discord.IUserMessage#Discord_IUserMessage_AddReactionAsync_Discord_IEmote_Discord_RequestOptions_ + +## Why am I getting so many preemptive rate limits when I try to add more than one reactions? + +This is due to how .NET parses the HTML header, mistreating +0.25sec/action to 1sec. This casues the lib to throw preemptive rate +limit more frequently than it should for methods such as adding +reactions. + +## Can I opt-out of preemptive rate limits? + +Unfortunately, not at the moment. See [#401](https://github.com/RogueException/Discord.Net/issues/401). + + +[IMessageChannel]: xref:Discord.IMessageChannel +[IUserMessage]: xref:Discord.IUserMessage +[IEmote]: xref:Discord.IEmote +[Emote]: xref:Discord.Emote +[Emoji]: xref:Discord.Emoji \ No newline at end of file diff --git a/docs/faq/ClientBasics.md b/docs/faq/ClientBasics.md new file mode 100644 index 000000000..8ea5394b4 --- /dev/null +++ b/docs/faq/ClientBasics.md @@ -0,0 +1,47 @@ +# Client Basics Questions + +## My client keeps returning 401 upon logging in! + +There are few possible reasons why this may occur. + 1. You are not using the appropriate [TokenType]. + If you are using a bot account created from the Discord Developer + portal, you should be using `TokenType.Bot`. + 2. You are not using the correct login credentials. + Please keep in mind that tokens start with `Mj*`. + If it starts with any other characters, chances are, you might be + using the *client secret*, which has nothing to do with the login + token. + +[TokenType]: xref:Discord.TokenType + +## How do I do X, Y, Z when my bot connects/logs on? Why do I get a `NullReferenceException` upon calling any client methods after connect? + +Your bot should not attempt to interact in any way with guilds/servers +until the [Ready] event fires. When the bot connects, it first has to +download guild information from Discord in order for you to get +access to any server information; the client is not ready at this +point. + +Technically, the [GuildAvailable] event fires once the data for a +particular guild has downloaded; however, it's best to wait for all +guilds to be downloaded. Once all downloads are complete, the [Ready] +event is triggered, then you can proceed to do whatever you like. + +[Ready]: xref:Discord.WebSocket.DiscordSocketClient#Discord_WebSocket_DiscordSocketClient_Ready +[GuildAvailable]: xref:Discord.WebSocket.BaseSocketClient#Discord_WebSocket_BaseSocketClient_GuildAvailable + +## 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, +checking the content of edited/deleted messages), you must set the +[MessageCacheSize] in your [DiscordSocketConfig] settings in order to +use the cached message entity. Read more about it [here](../guides/concepts/events.md#cacheable). +1. Message Cache must be enabled. +2. Hook the MessageUpdated event. This event provides a *before* and +*after* object. +3. Only messages received *after* the bot comes online will be +available in the cache. + +[MessageCacheSize]: xref:Discord.WebSocket.DiscordSocketConfig#Discord_WebSocket_DiscordSocketConfig_MessageCacheSize +[DiscordSocketConfig]: xref:Discord.WebSocket.DiscordSocketConfig +[MessageUpdated]: xref:Discord.WebSocket.BaseSocketClient#Discord_WebSocket_BaseSocketClient_MessageUpdated \ No newline at end of file diff --git a/docs/faq/Commands.md b/docs/faq/Commands.md new file mode 100644 index 000000000..948b7639d --- /dev/null +++ b/docs/faq/Commands.md @@ -0,0 +1,114 @@ +# Command-related Questions + +## How can I restrict some of my commands so only certain users can execute them? + +Based on how you want to implement the restrictions, 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` etc.*). + +If, however, you wish to restrict the commands based on the user's +role, you can either create your own custom precondition or use +Joe4evr's [Preconditions Addons] that provides a few custom +preconditions that aren't provided in the stock library. +Its source can also be used as an example for creating your own +custom preconditions. + +[RequireUserPermission]: xref:Discord.Commands.RequireUserPermissionAttribute +[Preconditions Addons]: https://github.com/Joe4evr/Discord.Addons/tree/master/src/Discord.Addons.Preconditions + +## I'm getting an error about `Assembly#GetEntryAssembly`. What now? + +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#Discord_Commands_CommandService_AddModulesAsync_Assembly_System_IServiceProvider_ +[CommandService#AddModuleAsync]: xref:Discord.Commands.CommandService#Discord_Commands_CommandService_AddModuleAsync__1_System_IServiceProvider_ + +## What does [Remainder] do in the command signature? + +The [RemainderAttribute] leaves the string unparsed, meaning you +don't 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/commands/Remainder.cs)] + +[RemainderAttribute]: xref:Discord.Commands.RemainderAttribute + +## 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 +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 +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 +implementation of [Dependency Injection] before proceeding, as well +as how it works in [Discord.NET](../guides/commands/commands.md#usage-in-modules). + +A brief example of service and dependency injection can be seen below. + +[!code-csharp[DI](samples/commands/DI.cs)] + +[Dependency Injection]: https://docs.microsoft.com/en-us/aspnet/core/fundamentals/dependency-injection + +## 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 long-running task, +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. + +To resolve this, the library has designed a flag called [RunMode]. +There are 2 main `RunMode`s. One being `RunMode.Sync`, which is the +default; another being `RunMode.Async`. `RunMode.Async` essentially +calls an unawaited Task and continues with the execution without +waiting for the command task to finish. You should use +`RunMode.Async` in either the [CommandAttribute] or the +[DefaultRunMode] flag in `CommandServiceConfig`. +Further details regarding `RunMode.Async` can be found below. + +[RunMode]: xref:Discord.Commands.RunMode +[CommandAttribute]: xref:Discord.Commands.CommandAttribute +[DefaultRunMode]: xref:Discord.Commands.CommandServiceConfig#Discord_Commands_CommandServiceConfig_DefaultRunMode + +## Okay, that's great and all, but how does `RunMode.Async` work, and if it's so great, why is the lib *not* using it by default? + +As with any async operation, `RunMode.Async` also comes at a cost. +The following are the caveats with RunMode.Async, +1) You introduce race condition. +2) Unnecessary overhead caused by [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. + +However, there are ways to remedy #3 and #4. + +For #3, in Discord.NET 2.0, the library introduces a new event called +[CommandExecuted], which is raised whenever the command is +**successfully executed**. This event will be raised regardless of +the `RunMode` type and will return the appropriate execution result. + +For #4, exceptions are caught in [CommandService#Log] event under +[LogMessage.Exception] as [CommandException]. + +[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#Discord_Commands_CommandService_ExecuteAsync_Discord_Commands_ICommandContext_System_Int32_System_IServiceProvider_Discord_Commands_MultiMatchHandling_ +[ExecuteResult]: xref:Discord.Commands.ExecuteResult +[RuntimeResult]: xref:Discord.Commands.RuntimeResult +[CommandExecuted]: xref:Discord.Commands.CommandService#Discord_Commands_CommandService_CommandExecuted +[CommandService#Log]: xref:Discord.Commands.CommandService#Discord_Commands_CommandService_Log +[LogMessage.Exception]: xref:Discord.LogMessage#Discord_LogMessage_Exception +[CommandException]: xref:Discord.Commands.CommandException \ No newline at end of file diff --git a/docs/faq/GettingStarted.md b/docs/faq/GettingStarted.md new file mode 100644 index 000000000..1e4276b80 --- /dev/null +++ b/docs/faq/GettingStarted.md @@ -0,0 +1,71 @@ +# Basic Concepts / Getting Started + +## How do I get started? +First of all, welcome! Before you delve into using the library; +however, you should have some decent understanding of the language +you are about to use. This library touches on +[Task-based Asynchronous Pattern], [polymorphism], [interface] and +many more advanced topics extensively. Please make sure that you +understand these topics to some extent before proceeding. + + Here are some examples: + 1. [Official quick start guide](https://github.com/RogueException/Discord.Net/blob/dev/docs/guides/getting_started/samples/intro/structure.cs) + 2. [Official template](https://github.com/foxbot/DiscordBotBase/tree/csharp/src/DiscordBot) + +Please note that you should *not* try to blindly copy paste the code. It is meant to be a template or a guide. It is not meant to be something that will work out of the box. + +[Task-based Asynchronous Pattern]: https://docs.microsoft.com/en-us/dotnet/standard/asynchronous-programming-patterns/task-based-asynchronous-pattern-tap +[polymorphism]: https://docs.microsoft.com/en-us/dotnet/csharp/programming-guide/classes-and-structs/polymorphism +[interface]: https://docs.microsoft.com/en-us/dotnet/csharp/programming-guide/interfaces/ + +## How do I add my bot to my server/guild? + +The [OAuth2 URL](https://discordapp.com/developers/tools/oauth2-url-generator) +can be generated via the Discord developer page. This allows you to +set the permissions that the bot will be added with. With this method, + bots will also be assigned their own special roles that normal users + cannot use, which is what we call a `Managed` role. + +## What is a Client/User/Object ID? Is it the token? + +Each user and object on Discord has its own snowflake ID generated +based on various conditions. +![Snowflake Generation](images/snowflake.png) +The ID can be seen by anyone; it is public. It is merely used to +identify an object in the Discord ecosystem. Many things in the +library require an ID to retrieve the said object. + +There are 2 ways to obtain the said ID. + 1. Enable Discord's developer mode. With developer mode enabled, + you can - as an example - right click on a guild and copy the guild + id (please note that this does not apply to Role IDs, see below). + ![Developer Mode](images/dev-mode.png) + 2. Escape the object using `\` in front the object. For example, + when you do `\@Example#1234` in chat, it will return the user ID of + the aforementioned user. + +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 +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. + +## How do I get the role ID? + +Several common ways to do this: + 1. Make the role mentionable and mention the role, and escape it + using the `\` character in front. + 2. Inspect the roles collection within the guild via your debugger. + +Please note that right-clicking on the role and copying the ID will +**not** work. It will only copy the message ID. + +## I have more questions! + +Please visit us at #dotnet_discord-net at [Discord API]. +Describe the problem in details to us, and preferably with the +problematic code uploaded onto [Hastebin](https://hastebin.com). + +[Discord API]: https://discord.gg/jkrBmQR \ No newline at end of file diff --git a/docs/faq/Glossary.md b/docs/faq/Glossary.md new file mode 100644 index 000000000..84e95d251 --- /dev/null +++ b/docs/faq/Glossary.md @@ -0,0 +1,18 @@ +# Glossary + +## Channel types + +* A **Text channel** ([ITextChannel]) is a message channel from a +Guild. +* A **DM channel** ([IDMChannel]) is a message channel from a DM. +* A **Group channel** ([IGroupChannel]) is a message channel from a +Group (this is rarely used due to the bot's inability to join groups). +* A **Private channel** ([IPrivateChannel]) is a DM or a Group. +* A **Message channel** ([IMessageChannel]) is all of the above. + + +[IMessageChannel]: xref:Discord.IMessageChannel +[ITextChannel]: xref:Discord.ITextChannel +[IGroupChannel]: xref:Discord.IGroupChannel +[IDMChannel]: xref:Discord.IDMChannel +[IPrivateChannel]: xref:Discord.IPrivateChannel \ No newline at end of file diff --git a/docs/faq/Legacy.md b/docs/faq/Legacy.md new file mode 100644 index 000000000..83495ef79 --- /dev/null +++ b/docs/faq/Legacy.md @@ -0,0 +1,19 @@ +# Legacy Questions + +## 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 +compatibility. Several methods or props may be broken in older +versions and will likely not be fixed in the version branch due to +their breaking nature. + +Visit the repo's [release tag] to see the latest public pre-release. + +[release tag]: https://github.com/RogueException/Discord.Net/releases + +## I came from an earlier version of Discord.NET 1.0, and DependencyMap doesn't seem to exist anymore in the later revision? What happened to it? +The `DependencyMap` has been replaced with Microsoft's +[DependencyInjection] Abstractions. An example usage can be seen +[here](https://github.com/foxbot/DiscordBotBase/blob/csharp/src/DiscordBot/Program.cs#L36). + +[DependencyInjection]: https://docs.microsoft.com/en-us/aspnet/core/fundamentals/dependency-injection \ No newline at end of file diff --git a/docs/faq/images/snowflake.png b/docs/faq/images/snowflake.png new file mode 100644 index 0000000000000000000000000000000000000000..816a10eee07e156ec4e27ee90a000512b1f12463 GIT binary patch literal 73062 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 XrU2O)WYlV=ATMnV1NF+Mj{p7##ChBc literal 0 HcmV?d00001 diff --git a/docs/faq/samples/basics/cast.cs b/docs/faq/samples/basics/cast.cs new file mode 100644 index 000000000..73ef5237f --- /dev/null +++ b/docs/faq/samples/basics/cast.cs @@ -0,0 +1,15 @@ +public async Task MessageReceivedHandler(SocketMessage msg) +{ + // Option 1: + // Using the `as` keyword, which will return `null` if the object isn't the desired type. + var usermsg = msg as SocketUserMessage; + // We bail when the message isn't the desired type. + if (msg == null) return; + + // Option 2: + // Using the `is` keyword to cast (C#7 or above only) + if (msg is SocketUserMessage usermsg) + { + // Do things + } +} \ No newline at end of file diff --git a/docs/faq/samples/basics/emoji.cs b/docs/faq/samples/basics/emoji.cs new file mode 100644 index 000000000..dd3e6317f --- /dev/null +++ b/docs/faq/samples/basics/emoji.cs @@ -0,0 +1,18 @@ +// bail if the message is not a user one (system messages cannot have reactions) +var usermsg = msg as IUserMessage; +if (usermsg == null) return; + +// standard Unicode emojis +Emoji emoji = new Emoji("👍"); +// or +// Emoji emoji = new Emoji("\uD83D\uDC4D"); + +// custom guild emotes +Emote emote = Emote.Parse("<:dotnet:232902710280716288>"); +// using Emote.TryParse may be safer in regards to errors being thrown; +// please note that the method does not verify if the emote exists, +// it simply creates the Emote object for you. + +// add the reaction to the message +await usermsg.AddReactionAsync(emoji); +await usermsg.AddReactionAsync(emote); \ No newline at end of file diff --git a/docs/faq/samples/commands/DI.cs b/docs/faq/samples/commands/DI.cs new file mode 100644 index 000000000..59f098ff9 --- /dev/null +++ b/docs/faq/samples/commands/DI.cs @@ -0,0 +1,27 @@ +public class MyService +{ + public string MyCoolString {get; set;} +} +public class Setup +{ + public IServiceProvider BuildProvider() => + new ServiceCollection() + .AddSingleton() + .BuildServiceProvider(); +} +public class MyModule : ModuleBase +{ + // Inject via public settable prop + public MyService MyService {get; set;} + + // or via ctor + private readonly MyService _myService; + public MyModule (MyService myService) => _myService = myService; + + [Command("string")] + public Task GetOrSetStringAsync(string input) + { + if (_myService.MyCoolString == null) _myService.MyCoolString = input; + return ReplyAsync(_myService.MyCoolString); + } +} \ No newline at end of file diff --git a/docs/faq/samples/commands/Remainder.cs b/docs/faq/samples/commands/Remainder.cs new file mode 100644 index 000000000..9a4ac4d78 --- /dev/null +++ b/docs/faq/samples/commands/Remainder.cs @@ -0,0 +1,19 @@ +// Input: +// !echo Coffee Cake + +// Output: +// Coffee Cake +[Command("echo")] +public Task EchoRemainderAsync([Remainder]string text) => ReplyAsync(text); + +// Output: +// CommandError.BadArgCount +[Command("echo-hassle")] +public Task EchoAsync(string text) => ReplyAsync(text); + +// The message would be seen as having 5 parameters, while the method +// only accepts one. Wrapping the message in quotes solves this. +// This way, the system knows the entire message is to be parsed as a +// single String. +// e.g. +// !echo "Coffee Cake" \ No newline at end of file diff --git a/docs/faq/toc.yml b/docs/faq/toc.yml index 446ddbf54..08ba404c1 100644 --- a/docs/faq/toc.yml +++ b/docs/faq/toc.yml @@ -1,10 +1,12 @@ - name: Getting Started - href: 0-GettingStarted.md -- name: Basics - href: 1-Basics.md + href: GettingStarted.md +- name: Client Basics + href: ClientBasics.md - name: Basic Operations - href: 2-BasicOperations.md + href: BasicOperations.md - name: Commands - href: 4-Commands.md + href: Commands.md +- name: Glossary + href: Glossary.md - name: Legacy or Upgrade - href: 5-Legacy.md + href: Legacy.md \ No newline at end of file