Files
Discord.Net/docs/guides/getting_started/first-bot.md
Still Hsu 4309550ca0 docs: Main docs update (#1304)
* Remove template in favor of official samples

* Fixed a variable name copy pasta mistake

line 35 was _database.GetData() instead of DBService.GetData()

* Experimental theme change

* Change paragraph, code, heading fonts
* Widen viewport

* Update DocFX.Plugins.LastModified v1.2.3

* Exclude Discord.API in docs

* Add remarks for SocketReaction properties

* Add examples for BaseSocketClient.Events

* Add additional clarification for some methods

* Move IUser and IGuildChannel examples

* Clarify several guides samples with notes

- Reword TypeReader comment to avoid giving the idea that the sample itself is "obsolete"
- Remove CommandException logging comment regarding C#7.0 as the version is now the standard across VS2017 and up
- Remove suggestion about handling result in command handler since it is now advised to use CommandExecuted instead
+ Add additional comment to clarify ctor for DI setup

* Add/migrate code examples

* Incorporate material design theme

License @ https://github.com/ovasquez

* Update installation and nightly guide

* Fix improper indentations made obvious by the widen viewport
* Fix minor grammar issues
+ Add installation for nightly build using dotnet CLI

* Fix nav level indentation

* Revise "Your First Bot" article

* Merge some paragraphs to avoid clutter while keeping readability
* Reword the use of command framework
+ Add additional warning/note about environment variable

* Add additional indent level

* Fix indentation text warping

* Remove connections sample

* Update logging sample

Remove redundant part of the sample

* Remove mention of RPC

* Remove misleading section about commands

- Remove command sample from complete snippet
* Revise "Your First Bot" command paragraphs
* Change wording to hint devs that additional command parser packages may be available, as more and more begin to crop up

* Update themes

* Add XML docs contribution guidelines


Update guidelines

* Update CommandExecuted remarks

* Fix precondition remarks typo
no one saw that ok

* Fix permission sample in docfx

* Fix IMessageChannel samples

* Update docs/_template/light-dark-theme/styles/docfx.vendor.minify.css

Co-Authored-By: Still34 <341464@gmail.com>

* Update docs/_template/light-dark-theme/styles/material.css

Co-Authored-By: Still34 <341464@gmail.com>

* Update docs/_template/light-dark-theme/styles/material.css

Co-Authored-By: Still34 <341464@gmail.com>
2019-05-13 18:29:47 -04:00

8.4 KiB

uid, title
uid title
Guides.GettingStarted.FirstBot Start making a bot

Making Your First Bot with Discord.Net

One of the ways to get started with the Discord API is to write a basic ping-pong bot. This bot will respond to a simple command "ping." We will expand on this to create more diverse commands later, but for now, it is a good starting point.

Creating a Discord Bot

Before writing your bot, it is necessary to create a bot account via the Discord Applications Portal first.

  1. Visit the Discord Applications Portal.

  2. Create a new application.

  3. Give the application a name (this will be the bot's initial username).

  4. On the left-hand side, under Settings, click Bot.

    Step 4

  5. Click on Add Bot.

    Step 5

  6. Confirm the popup.

  7. (Optional) If this bot will be public, tick Public Bot.

    Step 7

Adding your bot to a server

Bots cannot use invite links; they must be explicitly invited through the OAuth2 flow.

  1. Open your bot's application on the Discord Applications Portal.

  2. On the left-hand side, under Settings, click OAuth2.

    Step 2

  3. Scroll down to OAuth2 URL Generator and under Scopes tick bot.

    Step 3

  4. Scroll down further to Bot Permissions and select the permissions that you wish to assign your bot with.

    Note

    This will assign the bot with a special "managed" role that no one else can use. The permissions can be changed later in the roles settings if you ever change your mind!

  5. Open the generated authorization URL in your browser.

  6. Select a server.

  7. Click on Authorize.

    Note

    Only servers where you have the MANAGE_SERVER permission will be present in this list.

    Step 6

Connecting to Discord

If you have not already created a project and installed Discord.Net, do that now.

For more information, see @Guides.GettingStarted.Installation.

Async

Discord.Net uses .NET's Task-based Asynchronous Pattern (TAP) extensively - nearly every operation is asynchronous. It is highly recommended for these operations to be awaited in a properly established async context whenever possible.

To establish an async context, we will be creating an async main method in your console application, and rewriting the static main method to invoke the new async main.

[!code-csharpAsync Context]

As a result of this, your program will now start and immediately jump into an async context. This allows us to create a connection to Discord later on without having to worry about setting up the correct async implementation.

Warning

If your application throws any exceptions within an async context, they will be thrown all the way back up to the first non-async method; since our first non-async method is the program's Main method, this means that all unhandled exceptions will be thrown up there, which will crash your application.

Discord.Net will prevent exceptions in event handlers from crashing your program, but any exceptions in your async main will cause the application to crash.

Creating a logging method

Before we create and configure a Discord client, we will add a method to handle Discord.Net's log events.

To allow agnostic support of as many log providers as possible, we log information through a Log event with a proprietary LogMessage parameter. See the API Documentation for this event.

If you are using your own logging framework, this is where you would invoke it. For the sake of simplicity, we will only be logging to the console.

You may learn more about this concept in @Guides.Concepts.Logging.

[!code-csharpAsync Context]

Creating a Discord Client

Finally, we can create a new connection to Discord.

Since we are writing a bot, we will be using a DiscordSocketClient along with socket entities. See @Guides.GettingStarted.Terminology if you are unsure of the differences. To establish a new connection, we will create an instance of DiscordSocketClient in the new async main. You may pass in an optional @Discord.WebSocket.DiscordSocketConfig if necessary. For most users, the default will work fine.

Before connecting, we should hook the client's Log event to the log handler that we had just created. Events in Discord.Net work similarly to any other events in C#.

Next, you will need to "log in to Discord" with the LoginAsync method with the application's "token."

Token

Note

Pay attention to what you are copying from the developer portal! A token is not the same as the application's "client secret."

Important

Your bot's token can be used to gain total access to your bot, so do not share this token with anyone else! You should store this token in an external source if you plan on distributing the source code for your bot.

In the following example, we retrieve the token from the environment variable DiscordToken. Please note that this is not designed to be used in a production environment, as the secrets are stored in plain-text.

For information on how to set an environment variable, please see instructions below,

We may now invoke the client's StartAsync method, which will start connection/reconnection logic. It is important to note that this method will return as soon as connection logic has been started! Any methods that rely on the client's state should go in an event handler. This means that you should not directly be interacting with the client before it is fully ready.

Finally, we will want to block the async main method from returning when running the application. To do this, we can await an infinite delay or any other blocking method, such as reading from the console.

The following lines can now be added:

[!code-csharpCreate client]

At this point, feel free to start your program and see your bot come online in Discord.

Warning

Getting a warning about A supplied token was invalid. and/or having trouble logging in? Double-check whether you have put in the correct credentials and make sure that it is not a client secret, which is different from a token.

Warning

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.

Note

For your reference, you may view the completed program.

Building a bot with commands

To create commands for your bot, you may choose from a variety of command processors available. Throughout the guides, we will be using the one that Discord.Net ships with. @Guides.Commands.Intro will guide you through how to setup a program that is ready for CommandService.

For reference, view an annotated example of this structure.

It is important to know that the recommended design pattern of bots should be to separate...

  1. the program (initialization and command handler)
  2. the modules (handle commands)
  3. the services (persistent storage, pure functions, data manipulation)