Browse Source

Cleanup FAQ section

+ Add introductory paragraphs to each FAQ section.
+ Add 'missing dependency' entry to commands FAQ.
* Split commands FAQ to 'General' and 'DI' sections.
pull/1161/head
Still Hsu 7 years ago
parent
commit
7bed4a0b31
No known key found for this signature in database GPG Key ID: 8601A145FDA95209
11 changed files with 118 additions and 30 deletions
  1. +4
    -0
      docs/faq/basics/basic-operations.md
  2. +4
    -0
      docs/faq/basics/client-basics.md
  3. +4
    -0
      docs/faq/basics/getting-started.md
  4. +54
    -0
      docs/faq/commands/dependency-injection.md
  5. +5
    -25
      docs/faq/commands/general.md
  6. +29
    -0
      docs/faq/commands/samples/missing-dep.cs
  7. +6
    -0
      docs/faq/misc/glossary.md
  8. +4
    -1
      docs/faq/misc/legacy.md
  9. +6
    -2
      docs/faq/toc.yml
  10. +1
    -1
      docs/guides/commands/post-execution.md
  11. +1
    -1
      src/Discord.Net.Commands/CommandService.cs

+ 4
- 0
docs/faq/basics/basic-operations.md View File

@@ -5,6 +5,10 @@ title: Questions about Basic Operations


# Basic Operations Questions # Basic Operations Questions


In the following section, you will find commonly asked questions and
answers regarding basic usage of the library, as well as
language-specific tips when using this library.

## How should I safely check a type? ## How should I safely check a type?


> [!WARNING] > [!WARNING]


+ 4
- 0
docs/faq/basics/client-basics.md View File

@@ -5,6 +5,10 @@ title: Basic Questions about Client


# Client Basics Questions # Client Basics Questions


In the following section, you will find commonly asked questions and
answers about common issues that you may face when utilizing the
various clients offered by the library.

## My client keeps returning 401 upon logging in! ## My client keeps returning 401 upon logging in!


> [!WARNING] > [!WARNING]


+ 4
- 0
docs/faq/basics/getting-started.md View File

@@ -5,6 +5,10 @@ title: Beginner Questions / How to Get Started


# Basic Concepts / Getting Started # Basic Concepts / Getting Started


In this following section, you will find commonly asked questions and
answers about how to get started with Discord.Net, as well as basic
introduction to the Discord API ecosystem.

## 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


+ 54
- 0
docs/faq/commands/dependency-injection.md View File

@@ -0,0 +1,54 @@
---
uid: FAQ.Commands.DI
title: Questions about Dependency Injection with Commands
---

# Dependency-injection-related Questions

In the following section, you will find common questions and answers
to utilizing dependency injection with @Discord.Commands, as well as
common troubleshooting steps regarding DI.

## 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; 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
you want it to. Note that you should also learn Microsoft's
implementation of [Dependency Injection] \([video]) before proceeding,
as well as how it works in [Discord.Net](xref:Guides.Commands.DI#usage-in-modules).

A brief example of service and dependency injection can be seen below.

[!code-csharp[DI](samples/DI.cs)]

[Dependency Injection]: https://docs.microsoft.com/en-us/aspnet/core/fundamentals/dependency-injection
[video]: https://www.youtube.com/watch?v=QtDTfn8YxXg

## Why is my `CommandService` complaining about a missing dependency?

If you encounter an error similar to `Failed to create MyModule,
dependency MyExternalDependency was not found.`, you may have
forgotten to add the external dependency to the dependency container.

Starting from Discord.Net 2.0, all dependencies required by each
module must be present when the module is loaded into the
[CommandService]. This means when loading the module, you must pass a
valid [IServiceProvider] with the dependency loaded before the module
can be successfully registered.

For example, if your module, `MyModule`, requests a `DatabaseService`
in its constructor, the `DatabaseService` must be present in the
[IServiceProvider] when registering `MyModule`.

[!code-csharp[Missing Dependencies](samples/missing-dep.cs)]

[IServiceProvider]: xref:System.IServiceProvider
[CommandService]: xref:Discord.Commands.CommandService

docs/faq/commands/commands.md → docs/faq/commands/general.md View File

@@ -1,10 +1,13 @@
--- ---
uid: FAQ.Commands
title: Questions about Commands
uid: FAQ.Commands.General
title: General Questions about Commands
--- ---


# Command-related Questions # Command-related Questions


In the following section, you will find commonly asked questions and
answered regarding general command usage when using @Discord.Commands.

## How can I restrict some of my commands so only specific users can execute them? ## 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
@@ -42,29 +45,6 @@ the last parameter.


[RemainderAttribute]: xref:Discord.Commands.RemainderAttribute [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; 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
you want it to. Note that you should also learn Microsoft's
implementation of [Dependency Injection] \([video]) before proceeding,
as well as how it works in [Discord.Net](xref:Guides.Commands.DI#usage-in-modules).

A brief example of service and dependency injection can be seen below.

[!code-csharp[DI](samples/DI.cs)]

[Dependency Injection]: https://docs.microsoft.com/en-us/aspnet/core/fundamentals/dependency-injection
[video]: https://www.youtube.com/watch?v=QtDTfn8YxXg

## Discord.Net keeps saying that a `MessageReceived` handler is blocking the gateway, what should I do? ## Discord.Net keeps saying that a `MessageReceived` handler is blocking the gateway, what should I do?


By default, the library warns the user about any long-running event By default, the library warns the user about any long-running event

+ 29
- 0
docs/faq/commands/samples/missing-dep.cs View File

@@ -0,0 +1,29 @@
public class MyModule : ModuleBase<SocketCommandContext>
{
private readonly DatabaseService _dbService;
public MyModule(DatabaseService dbService)
=> _dbService = dbService;
}
public class CommandHandler
{
private readonly CommandService _commands;
private readonly IServiceProvider _services;
public CommandHandler(DiscordSocketClient client)
{
_services = new ServiceCollection()
.AddService<CommandService>()
.AddService(client)
// We are missing DatabaseService!
.BuildServiceProvider();
}
public async Task RegisterCommandsAsync()
{
// ...
// The method fails here because DatabaseService is a required
// dependency and cannot be resolved by the dependency
// injection service at runtime since the service is not
// registered in this instance of _services.
await _commands.AddModulesAsync(Assembly.GetEntryAssembly(), _services);
// ...
}
}

+ 6
- 0
docs/faq/misc/glossary.md View File

@@ -5,6 +5,12 @@ title: Common Terminologies / Glossary


# Glossary # Glossary


This is an additional chapter for quick references to various common
types that you may see within Discord.Net. To see more information
regarding each type of object, click on the object to navigate
to our API documentation page where you might find more explanation
about it.

## Common Types ## Common Types


* A **Guild** ([IGuild]) is an isolated collection of users and * A **Guild** ([IGuild]) is an isolated collection of users and


+ 4
- 1
docs/faq/misc/legacy.md View File

@@ -5,7 +5,10 @@ title: Questions about Legacy Versions


# Legacy Questions # Legacy Questions


## X, Y, Z does not work! It doesn't return a valid value anymore
This section refers to legacy library-related questions that do not
apply to the latest or recent version of the Discord.Net library.

## X, Y, Z does not work! It doesn't return a valid value anymore.


If you are currently using an older version of the stable branch, If you are currently using an older version of the stable branch,
please upgrade to the latest pre-release version to ensure maximum please upgrade to the latest pre-release version to ensure maximum


+ 6
- 2
docs/faq/toc.yml View File

@@ -6,8 +6,12 @@
topicUid: FAQ.Basics.BasicOp topicUid: FAQ.Basics.BasicOp
- name: Client Basics - name: Client Basics
topicUid: FAQ.Basics.ClientBasics topicUid: FAQ.Basics.ClientBasics
- name: Command
topicUid: FAQ.Commands
- name: Commands
items:
- name: General
topicUid: FAQ.Commands.General
- name: Dependency Injection
topicUid: FAQ.Commands.DI
- name: Glossary - name: Glossary
topicUid: FAQ.Glossary topicUid: FAQ.Glossary
- name: Legacy or Upgrade - name: Legacy or Upgrade


+ 1
- 1
docs/guides/commands/post-execution.md View File

@@ -31,7 +31,7 @@ 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
[ExecuteResult] instead of the actual result. You can learn more [ExecuteResult] instead of the actual result. You can learn more
about the impact in the [FAQ](xref:FAQ.Commands).
about the impact in the [FAQ](xref:FAQ.Commands.General).


## CommandExecuted Event ## CommandExecuted Event




+ 1
- 1
src/Discord.Net.Commands/CommandService.cs View File

@@ -157,7 +157,7 @@ namespace Discord.Commands
} }


/// <summary> /// <summary>
/// Add a command module from a <see cref="Type" /> .
/// Add a command module from a <see cref="Type" />.
/// </summary> /// </summary>
/// <example> /// <example>
/// <para>The following example registers the module <c>MyModule</c> to <c>commandService</c>.</para> /// <para>The following example registers the module <c>MyModule</c> to <c>commandService</c>.</para>


Loading…
Cancel
Save