Building a Discord bot with Node.js and Replit
In this tutorial, we'll use Replit and Node.js to build a Discord chatbot. The bot will be able to join a Discord server and respond to messages.
You'll find it easier to follow along if you have some JavaScript knowledge and you should have used Discord or a similar app such as Skype or Telegram before. We won't be covering the very basics of Node.js, but we will explain each line of code in detail, so if you have any experience with programming, you should be able to follow along.
Overview and requirements
We'll be doing all of our coding through the Replit web IDE, and we'll host our bot with Replit too, so you won't need to install any additional software on your machine. For this tutorial you will need to create a Discord account (if you already have one, you can skip this).
- Creating an application and a bot user in your Discord account.
- Creating a server on Discord.
- Adding our bot to our Discord server.
Let's get through these admin steps first and then we can get to the fun part of coding our bot.
Creating a bot in Discord and getting a token
You can sign up for a free account over at Discord, and you can download one of their desktop or mobile applications from the Discord homepage. You can also use Discord in the browser.
Once you have an account, you'll want to create a Discord application. Visit the Discord developer's page and press the "New application" button, as in the image below.
Fill out a name for your bot and select "Create".
The first thing to do on the next page is to note your Application ID, which you'll need to add the bot to the server. You can come back later and get it from this page, or copy it somewhere so you can find it when you need it.
You can also rename the application and provide a description for your bot, then press "Save Changes".
You have now created a Discord application. The next step is to add a bot to this application, so head over to the "Bot" tab using the menu on the left and press the "Add Bot" button, as shown below. Click "Yes, do it" when Discord asks if you're sure about bringing a new bot to life.
The last thing we'll need from our bot is a token. Anyone who has the bot's token can prove that they own the bot, so you'll need to be careful not to share this with anyone. You can get the token by pressing "Reset Token", and then copy it to your clipboard by pressing "Copy".
Take note of your token or copy it to your clipboard, as we'll need to add it to our code soon.
Creating a Discord server
If you don't have a Discord server to add your bot to, you can create one by either opening the desktop Discord application that you downloaded earlier or returning to the Discord home page in your browser. Press the "+" icon, as shown below, to create a server.
Press "Create a server" in the screen that follows, and then give your server a name. Once the server is up and running, you can chat with yourself, or invite some friends to chat with you. Soon we'll invite our bot to chat with us as well.
Adding your Discord bot to your Discord server
Our Discord bot is still just a shell at this stage as we haven't written any code to allow it to do anything, but let's go ahead and add the bot to our Discord server anyway. To add a bot to your server, you'll need the Application ID from the "General Information" page that we looked at before when we created our ReplBotApplication (ie. the application ID, not the secret bot token).
Create a URL that looks as follows, but using your application ID instead of mine at the end (the link calls the application ID "client_id"):
Visit the URL that you created in your web browser and you'll see a page similar to the following where you can choose which server to add your bot to.
Select the server we created in the step before this and hit the "Authorize" button. After completing the captcha, you should get an in-app Discord notification telling you that your bot has joined your server.
Now we can get to the fun part of building a brain for our bot!
Creating a repl and installing our Discord dependencies
The first thing we need to do is create a Node.js repl to write the code for our Discord bot. Over at Replit, create a new repl, choosing "Node.js" as your language.
We don't need to reinvent the wheel as there is already a great Node wrapper for the Discord bot API called discord.js. Normally we would install this third-party library through npm, but because we're using Replit, we can skip the installation. Our repl will automatically pull in all dependencies.
In the default index.js file that is included with your new repl, add the following line of code:
Press the "Run" button and you should see Replit installing the Discord library in the output pane on the right, as in the image below.
Our bot is nearly ready to go — but we still need to plug in our secret token. This will authorize our code to control our bot.
Setting up authorization for our bot
By default, Replit code is public. This is great as it encourages collaboration and learning, but we need to be careful not to share our secret bot token (which gives anyone who has access to it full control of our bot).
To get around the problem of needing to give our code access to the token while allowing others to access our code but not our token, we'll be using environment variables. Replit allows us to set secret environment variables through the "Secrets (Environment variables)" menu option.
Open the "Secrets" menu option. There you will be able to set environment variables for your repl. Set the key as the name of your environment variable to DISCORD_BOT_SECRET . Set the value as your bot's secret token (note that this is the second token that we got while setting up the bot — different from the Application ID that we used to add our bot to our server). It should look something like:
Let's make a Discord bot that repeats everything we say but in reverse. We can do this in just a few lines of code. In your index.js file, add the following:
Let's tear this apart line by line to see what it does.
- Line 1 is the line we added earlier. This line tells Replit to install the third party library and brings it into this file so that we can use it.
- In line 2, we create a Discord Client . We'll use this client to send commands to the Discord server to control our bot and send it commands.
- In line 3-8, we provide the intents of our Client , these are provided to designate which events our bot will be able to receive.
- In line 9, we retrieve our secret token from the environment variables (which Replit sets from the "Secrets" menu).
- In line 11, we define an event for our client, which defines how our bot should react to the ready event. The Discord bot is going to run asynchronously, which might be a bit confusing if you're used to running standard synchronous code. We won't go into asynchronous coding in-depth here, but if you're interested in what this is and why it's used, there's a good guide over at RisingStack. In short, instead of running the code in our file from top to bottom, we'll be running pieces of code in response to specific events.
- In lines 12-14, we define how our bot should respond to the ready event, which is fired when our bot successfully joins a server. We instruct our bot to output some information server-side (i.e. it will be displayed in our repl's output, but not sent as a message through to Discord). We'll print a simple "I'm in" message to see that the bot is there and print our bot's username (if you're running multiple bots, this will make it easier to work out who's doing what).
- Lines 16-20 are similar, but instead of responding to a ready event, we tell our bot how to handle new messages. Line 17 says we only want to respond to messages that aren't from us (otherwise our bot will keep responding to himself — you can remove this line to see why that's a problem), and line 18 says we'll send a new message to the same channel we received a message in ( msg.channel ) and the content we'll send will be the same message that we received, but backwards. To reverse a string, we split it into its individual characters, reverse the resulting array, and then join it all back into a string again.
The last line fires up our bot and uses the token we loaded earlier to log into Discord.
Press the "Run" button again and you should see your bot reporting a successful channel join in the repl output.
Open Discord, and from within the server we created earlier, you will be able to send a message (by typing into the box highlighted below) and see your bot respond!
The bot responds each time, reversing the text we enter.
Keeping our bot alive
Your bot can now respond to messages, but only for as long as your repl is running. If you close your browser tab or shut down your computer, your bot will stop and no longer respond to messages on Discord.
Replit will keep your code running after you close the browser tab only if you are running a web server. Our bot doesn't require an explicit web server to run, but we can create a server and run it in the background just to keep our repl alive.
Create a new file in your project called keep_alive.js and add the following code:
We won't go over this in detail as it's not central to our bot, but here we start a web server that will return "I'm alive" if anyone visits it.
In our index.js file, we need to add a require statement for this server at the top. Add the following line near the top of index.js :
After doing this and hitting the green "Run" button again, you should see some changes to your repl. For one, you'll see a new pane in the top right that shows the web output from your server. We can see that visiting our repl now returns a basic web page showing the "I'm alive" string that we told our web server to return by default.
Now your bot will stay alive even after closing your browser or shutting down your development machine. Replit will still clean up your server and kill your bot after about one hour of inactivity, so if you don't use your bot for a while, you'll have to log into your repl and start the bot up again. Alternatively, you can set up a third-party (free!) service like Uptime Robot. Uptime Robot pings your site every five minutes to make sure it's still working — usually to notify you of unexpected downtime, but in this case the constant pings have the side effect of keeping our repl alive as it will never go more than an hour without receiving any activity. Note that you need to select the "HTTP" option instead of the "Ping" option when setting up Uptime Robot, as Replit requires regular HTTP requests to keep your chatbot alive, or you can use an Always-on repl to keep it running 24/7.
Forking and extending our basic bot
This is not a very useful bot as-is, but the possibilities are only limited by your creativity now! You can have your bot receive input from a user, process the input, and respond in any way you choose. In fact, with the basic input and output that we've demonstrated, we have most of the components of any modern computer, all of which are based on the Von Neumann architecture (we could easily add the missing memory by having our bot write to a file, or with a bit more effort link in a SQLite database for persistent storage).
If you followed along with this tutorial, you'll have your own basic repl bot to play around with and extend. If you were only reading, you can easily fork my bot at https://replit.com/@ritza/discord-bot-node-1 and extend it however you like (you'll need to add your own token and reset the secrets still). Happy hacking!
If you're stuck for ideas, you could try link up your Discord bot to the Twitch API to get notified when your favorite streamers are online, or build a text adventure.
Name already in use
DiscordBotsTutorial / README.md
- Go to file T
- Go to line L
- Copy path
- Copy permalink
- Open with Desktop
- View raw
- Copy raw contents Copy raw contents
Copy raw contents
Copy raw contents
Начнём. Ссылка на мой youtube канал.
Discord bot туториал. Туториал по созданию ботов для дискорда на node.js используя discord.js.
Creation date : 06.12.2019
Также отдельное спасибо Top Bots List и его создателю Angrymoyse#0444 за помощь в написании.
Давайте начнём создание бота. Если у вас установлена node.js, то пропустите сделающие 2 строчки. Заходим на сайт node.js, скачиваем, устанавливаем. Скриншотов процесса установки нету, тк переустанавливать node.js нету желания. Но там всё интуитивно понятно.
Создание файлов, инициализация проекта, установка библиотек.
Создаём папку bot. Желательно не использовать кирилицу, юникод и т. п. в названии. Сразу же создаём файл index.js или bot.js. Это не несёт особого смысла. Можно назвать как угодно, но принятно index.js / bot.js. Это будет главный файл бота, т.е. первым запускается, в нём основной код бота. Далее открываем консоль / терминал если у вас linux. Для быстрого открытия консоли на windows можно нажать WIN + R, ввести cmd. Далее переходим в папку бота, думаю как это сделать через консоль всем понятно. Пишим : npm init — инициализация проекта. Жмём enter до конца. Если ошибка в package name, то напишите bot. npm i discord.js — установка библиотеки discord.js.
Далее рекомендую установить один из следующих редакторов кода :
WebStorm (спасибо за подсказку Mice V 4.4.4#0444 )
Если очень слабый компьюер можете поставить notepad++, но это для постоянной основы не самый хороший вариант. Лично я использую Atom.
Вы можете зарегистрировать его на сайте discord developers. Жмём кнопку «New Application». Вводим название бота. Жмём «Create». Переходим во вкладку «Bot», нажимаем «Add Bot», затем «Yes, do it!» Находим строку «token», немного ниже есть кнопка «Copy», нажимаем. Теперь в вашем буфере обмена есть токен бота.
Создадим первый код. Пишем :
Открываем консоль, переходим в папку проекта и пишем :
в зависимости от названия файла. Если у вас windows, то вы можете создать файл start.bat с текстом
Если линукс, то вы можете создать файл start.sh
Это будет запускать бота. Далее я не буду говорить про запуск. Делайте это сами.
Создаем файл config.json с конфигурацией нашего бота.
В начале кода бота напишем :
Еще вы можете создать конфиг прямо в коде бота.
Но второй вариант крайне не рекомендуется использовать, ведь для того что-бы изменить конфиг бота нам придется изменять его код.
Реагирование на сообщение.
Теперь давайте делать что-то когда приходит новое сообщение. Например логировать его текст.
Получение информации о авторе сообщения (отправителе).
Давайте залогируем тег автора.
Давайте в ответ на сообщение !ping отправлять такое сообщение : «@user, мой пинг равен » далее пинг.
Также можно писать не
.startsWith проверят начинается ли строка с символов в аргументах.
Об отправке сообщений.
Теперь рассмотрим message.channel.send(); Когда я только начинал программировать я не понимал смысл этой фразы, но сейчас понимаю и могу рассказать вам. message — объект сообщения, в нём есть channel — канал в который было отправлено, то есть с помощью message.channel мы получаем канал, а .send() отправляет туда сообщение.
Также можно отправлять сообщение по ID канала. Делается это так :
client.channels — все каналы которые есть на серверах с ботом.
.get(‘ID’) получает канал из них по ID.
.send(«Text»); Отправляет сообщение.
ID канала можно получить используя devepoer mode
Также даже начинающим программистам будет очень полезна в боте команда !eval для выполнения кода не пиша его в коде бота, т.е. вы пишите !eval какой-то код и бот выполняет этот код.
Я нашёл хороший туториал по этой команде на github. Рекомендую ознакомиться и взять себе команду в код бота. Принцип её работы мы разберём позже. Тык.
Думаю вы все видели как боты отправляют сообщения такого типа.
Это называется RichEmbed (Embed). Давайте отправим простой эмбед похожий на данный. (Картинка ниже)
Для этого создадим новую команду !ping .
В Embed есть много различных параметров, вы можете прочесть их далее, либо посмотреть на оффициальном сайте discord.js
Давайте сделаем команду для получения информации о пользователе. Команда взята из моего бота. Будем использовать библиотеку moment.js , устанавливаем npm i moment.js
Мой дискорд сервер!
Прошу зайти на мой дискорд сервер, ведь я долго делал туториал, а вам не сложно зайти на мой сервер в виде благодарности.
Создаем Discord-бота с помощью Node.js
Discord — это чат-приложение, которое позволяет миллионам пользователей по всему миру обмениваться сообщениями и общаться голосом вживую в сообществах, называемых гильдиями (guilds) или серверами. Discord также предоставляет обширный API, который разработчики могут использовать для создания весьма функциональных Discord-ботов. Боты могут выполнять различные действия, такие как отправка сообщений на серверы и личных сообщений пользователям, модерация серверов и воспроизведение звука в голосовых чатах. Это позволяет разработчикам создавать продвинутых ботов, которые реализуют сложные функции, такие как инструменты модерации или даже игры. Например, служебный бот Dyno обслуживает миллионы гильдий и содержит такие полезные функции, как защита от спама, музыкальный проигрыватель и много других вспомогательных служб. Знание того, как создавать Discord-ботов, позволит вам реализовать возможности, с которыми смогут взаимодействовать каждый день тысячи людей.
В этом туториале мы с вами создадим Discord-бота с нуля, используя Node.js и библиотеку Discord.js, которая позволяет пользователям напрямую взаимодействовать с Discord API. Мы настроим профиль для Discord-бота, получим для него токены аутентификации и реализуем в боте возможность обработки команд с аргументами от пользователей.
Что вам для этого понадобится
Прежде чем вы начнете, вам понадобится следующее:
Node.js, установленный на вашем компьютере. Чтобы установить его на macOS или Ubuntu 20.04, выполните действия, перечисленные в ”Как установить Node.js и создать локальную среду разработки в macOS” или в разделе “Установка Node.js посрдством Apt с помощью NodeSource PPA” руководства ”Как установить Node.js в Ubuntu 20.04”.
Бесплатный Discord-аккаунт, подтвержденный по электронной почте, и бесплатный Discord-сервер, который мы будем использовать для тестирования нашего Discord-бота.
Шаг 1 — Настройка Discord-бота
На этом этапе мы будем использовать GUI Discord для разработчиков, чтобы настроить Discord-бота и получить для него токен, который вы будете использовать в своей программе.
Чтобы зарегистрировать бота на платформе Discord, используйте Discord application dashboard (панель управления приложением). В ней разработчики могут создавать Discord-приложения, в частности — Discord-ботов.
Чтобы начать, кликните New Application. Discord попросит вас ввести имя для вашего нового приложения. Далее кликните Create, чтобы создать приложение.
Примечание: Имя вашего бота не зависит от имени приложения, т.е. имя бота не обязательно должно совпадать с именем приложения.
Теперь откройте панель управления вашего приложения. Чтобы добавить бота в приложение, перейдите на вкладку Bot на навигационной панели слева.
Чтобы добавить бота в приложение, нажмите кнопку Add Bot. Кликните Yes, do it!, когда появится диалог подтверждения. После этого вы попадете в панель управления, содержащую сведения об имени вашего бота, токен аутентификации и изображение профиля.
Вы можете изменить имя или изображение профиля своего бота здесь, в этой панели управления. Вам также необходимо получить токен аутентификации бота, кликнув Click to Reveal Token и скопировав появившийся токен.
Предупреждение: никогда ни с кем не делитесь и никуда не публикуйте токен вашего бота, так как он позволяет любому, кто им обладает, получить доступ к вашему боту.
Теперь вам нужно создать инвайт для добавления бота в Discord-гильдию, где вы сможете его тестировать. Сначала перейдите на страницу URL Generator во вкладке OAuth2 панели управления приложением. Чтобы создать инвайт, проскрольте вниз и выберите bot в scopes. Вам также следует установить разрешения (permissions), чтобы контролировать, какие действия ваш бот может выполнять в гильдиях. В рамках этого руководства мы выберем Administrator, что даст вашему боту права на выполнение почти всех возможных действий в гильдиях. Скопируйте ссылку с помощью, нажав на кнопку Copy.
Затем добавьте бота на сервер. Перейдите по только что созданной ссылке-инвайту. В раскрывающемся меню вы можете добавить бота на любой сервер, которым вы владеете или на котором имеете права администратора.
Теперь нажмите Continue. Убедитесь, что у вас установлен флажок рядом с Administrator — это предоставит боту права администратора. Затем нажмите Authorize. До того, как бот присоединится к серверу, Discord попросит вас заполнить капчу. После этого бот должен появиться в offline в списке участников на сервере, на который вы его добавили.
Вы успешно создали Discord-бота и добавили его на сервер. Далее мы напишем программу для логина в бот.
Шаг 2 — Создание вашего проекта
На этом шаге мы настроим базовую среду разработки, в которой вы напишете код своего бота и залогинитесь в него программным способом.
Во-первых, вам нужно создать папку проекта и необходимые файлы для бота.
Создайте папку своего проекта:
Перейдите в папку проекта, которую вы только что создали:
Затем с помощью текстового редактора создайте файл с именем config.json , где будет храниться токен аутентификации вашего бота:
Добавьте следующий код в полученный файл конфигурации, заменив выделенный текст на токен аутентификации вашего бота:
Сохраните и закройте файл.
Затем вам нужно создать файл package.json , в котором будут храниться сведения о вашем проекте и зависимостях, которые вы будете для него использовать. Создайте файл package.json , выполнив следующую npm-команду:
npm запросит у вас различные сведения о вашем проекте. Если вам нужна помощь в заполнении этих сведений, вы можете почитать об этом в разделе “Как использовать модули Node.js с npm и package.json”.
Теперь вам нужно установить пакет discord.js , который вы будете использовать для взаимодействия с Discord API. Вы можете установить discord.js через npm с помощью следующей команды:
Когда вы настроили файл конфигурации и установили необходимую зависимость, вы готовы приступить к созданию своего бота. В реальном приложении, если бот большой, то он будет разделен на множество файлов, но в этом руководстве весь код вашего бота будет написан в одном файле.
Сначала создайте файл с именем index.js в папке discord-bot:
Начнем код бота с требования зависимости discord.js и файл конфигурации с токеном:
После этого добавьте следующие две строки кода:
Сохраните и закройте файл.
Первая строка кода создает новый Discord.Client и присваивает его константе client. Этот клиент — это то, как вы будете взаимодействовать с Discord API и как Discord будет уведомлять вас о таких событиях, как новые сообщения. Клиент, по сути, представляет Discord-бота. Объект, переданный в конструктор Client , определяет намерения (gateway intents) вашего бота. Таким образом определяется, какие WebSocket-события будет слушать ваш бот. Здесь мы указали GUILDS и GUILD_MESSAGES , чтобы бот получал события сообщений в гильдиях.
Вторая строка кода использует метод login для входа в созданный вами Discord-бот, используя токен из файла config.json в качестве пароля. Токен позволяет Discord API узнать, для какого бота предназначена программа, и что вы прошли аутентификацию для использования этого бота.
Теперь запустите файл index.js с помощью Node:
Статус вашего бота на Discord-сервере, на который вы его добавили, изменится на online.
Вы успешно настроили среду разработки и написали базовый код для логина в Discord-бот. На следующем шаге мы будем обрабатывать пользовательские команды и научим ваш бот выполнять действия, такие как отправка сообщений.
Шаг 3 — Обработка вашей первой пользовательской команды
На этом шаге вы создадите бота, который может обрабатывать пользовательские команды. Вы реализуете свою первую команду ping , которая будет отвечать «pong» и временем, которое потребовалось для ответа на команду.
Во-первых, чтобы вы могли обрабатывать команды, вам нужно обнаруживать и получать сообщения, которые отправляют пользователи. Используя метод Discord-клиента on , вы будете получать от Discord уведомление о новых событиях. Метод on принимает два аргумента: имя ожидаемого события и функцию, запускаемую каждый раз, когда это событие происходит. С помощью этого метода вы можете прослушивать событие message , которое генерируется каждый раз, когда сообщение отправляется в гильдию, в которой бот имеет разрешение на просмотр сообщений. Таким образом мы создадим функцию, которая запускается каждый раз, когда отправляется сообщение.
Сначала откройте свой файл:
Добавьте в файл следующий код:
Эта функция, которая запускается в ответ на событие messageCreate, принимает message в качестве параметра. message имеет значение инстанса сообщения Discord.js, которое содержит информацию об отправленном сообщении и методах, которые помогут боту ответить.
Добавьте следующую строку кода в свою функцию обработки команд:
Эта строка проверяет, является ли автор сообщения ботом, и, если да, то прекращает обработку команды. Это важно, поскольку обычно вы не хотите обрабатывать сообщения ботов или отвечать на них. Ботам обычно не нужно использовать информацию от других ботов, поэтому игнорирование их сообщений помогает предотвратить нежелательные ответы и экономит вычислительную мощность.
Теперь мы напишем обработчик команд. Для этого нужно понимать формат команды Discord. Обычно команда Discord состоит из трех частей в следующем порядке: префикс, имя команды и (иногда) аргументы команды.
Префикс: префиксом может быть что угодно, но зачастую это пунктуационный символ или абстрактная фраза, которая обычно не встречается в начале сообщения. Это означает, что когда вы начинаете сообщение с префикса, бот поймет, что предназначение этой команды заключается в том, чтобы бот обработал ее.
Имя команды: имя команды, которую хочет использовать пользователь. Это означает, что бот может поддерживать несколько команд с разной функциональностью и позволяет пользователям выбирать между ними, указывая соответствующее имя команды.
Аргументы: иногда, если команда использует или даже требует дополнительную информацию от пользователя, пользователь может указать аргументы после имени команды, где этом каждый аргумент отделяется пробелом.
Примечание: Нет унифицированной жесткой структуры команд, и боты могут обрабатывать команды так, как вам хочется, но представленная здесь структура является эффективной, и ее использует подавляющее большинство ботов.
Начнем создание парсера команд, обрабатывающего этот формат, добавив следующие строки кода в функцию обработки сообщений:
В первой строке кода мы присваиваем константе prefix значение «!» , которое будет использоваться в качестве префикса команды.
Во второй строке кода, которую вы добавляете, мы проверяем, начинается ли содержимое сообщения, полученного ботом, с установленного вами префикса, и, если нет, то останавливаем обработку сообщения.
Теперь нам нужно преобразовать остальную часть сообщения в имя команды и аргументы, которые могут присутствовать в сообщении. Добавьте следующие выделенные строки:
В первой строке мы удаляем префикс из сообщения и присваиваем результат константе commandBody . Это необходимо, поскольку нам не нужно включать префикс в имя команды, которую мы парсим.
Вторая строка принимает сообщение уже без префикса и применяет к нему метод split с пробелом в качестве разделителя. Это разобьет его на массив подстрок, делая разделение везде, где стоит пробел. В результате получается массив, содержащий имя команды, а затем, если они включены в сообщение, все аргументы. Мы присваиваем этот массив константе args .
Третья строка удаляет первый элемент из массива args (он станет именем полученной команды), преобразует его в нижний регистр и затем назначает его константе command . Это позволяет вам изолировать имя команды и оставить в массиве только аргументы. Вы также следует использовать метод toLowerCase , поскольку команды в Discord-ботах обычно нечувствительны к регистру.
Вы завершили создание парсера команд, реализовали требуемый префикс и получили имя команды и все аргументы из сообщения. Теперь вам нужно написать код для конкретных команд.
Добавьте следующий код для команды ping :
Этот if-оператор проверяет, совпадает ли имя команды, которое вы распарсили (присвоенное константе command ), с «ping» . Если совпадает, то это означает, что пользователь хочет использовать команду «ping» . В подобной примитивной реализации код для конкретной команд вы можете просто обернуть в блок if-оператора. Делайте тоже самое и для других команд, которые хотите реализовать.
Теперь вы можете написать код для команды «ping» :
Сохраните и закройте файл.
Мы добавили блок команды «ping» , который вычисляет разницу между текущим временем, полученным с помощью метода now объекта Date, и таймстемпом, когда сообщение было создано, в миллисекундах. Таким образом мы узнаем, сколько времени потребовалось для обработки сообщения, т.е. «ping» бота.
Вторая строка отвечает на команду пользователя, используя метод reply константы message . Метод reply пингует (уведомляет и выделяет сообщение для указанного пользователя) пользователя, который отправил команду, с содержимым, предоставляемым в качестве первого аргумента метода. Вы предоставляете литерал шаблона, содержащий сообщение и вычисленный пинг, в качестве ответа, который использует метод reply .
На этом реализация команды «ping» закончена.
Запустите своего бота с помощью следующей команды (в той же папке, что и index.js ):
Теперь вы можете использовать команду «!ping» в любом канале, который бот может просматривать и отправлять туда сообщения, и получите ответ.
Вы успешно создали бота, который может обрабатывать пользовательские команды, и реализовали свою первую команду. На следующем шаге мы научим бота выполнив команду sum.
Шаг 4 — Реализация команды Sum
Теперь мы расширим программу командой «!sum» . Команда примет любое количество аргументов, сложит их, а потом вернет пользователю сумму всех аргументов.
Если Discord бот все еще работает, вы можете остановить его процесс с CTRL + C .
Снова откройте файл index.js :
Для реализации команды «!sum» мы будем использовать блок else-if . После проверки имени команды на равенство ping он проверит, совпадает ли оно с «sum». Мы используем блок else-if , поскольку одновременно будет обрабатываться только одна команда, т.е., если программа получит команду «ping» , ей не нужно проверять, что это была команда «sum» . Добавьте в файл следующие выделенные строки:
Приступим к написанию кода команды «sum» . Код для команды «sum» будет расположен в только что созданном вами блоке else-if . Добавьте следующий код:
Мы используем метод map на списке аргументов, чтобы создать новый список, используя функцию parseFloat для каждого элемента в массиве args . Это создаст новый массив (присвоенный константе numArgs ), в котором все элементы являются числами, а не строками. Это означает, что позже вы сможете успешно найти сумму этих чисел, сложив их вместе.
Вторая строка использует метод reduce на константе numArgs , которая суммирует все элементы в списке. Мы присваиваем сумму всех элементов в numArgs константе sum .
Затем мы используем метод reply , чтобы ответить по аналогии с предыдущей командой.
На этом реализация команды «sum» завершена. Теперь запустим бота, используя следующую команду (в той же папке, что и index.js ):
Вы можете использовать команду «!sum» в любом канале, который бот может просматривать и отправлять туда сообщения.
Создание бота Discord Bot с помощью Node.js
Discord — это приложение чата, позволяющее миллионам пользователей со всего мира обмениваться сообщениями и общаться в голосовом чате в сообществах, называемых «гильдии» или «серверы». Discord также включает функциональный API, который разработчики смогут использовать для построения мощных ботов Discord. Боты могут выполнять разнообразные действия, в том числе отправлять сообщения на серверы, отправлять пользователям сообщения DM, модерировать серверы и воспроизводить звук в голосовых чатах. Это позволяет разработчикам создавать мощных ботов со сложными и продвинутыми функциями, включая инструменты модерирования и даже игры. Например, служебный бот Dyno обслуживает миллионы гильдий и содержит множество полезных функций, включая защиту от спама, музыкальный проигрыватель и другие служебные функции. Научившись создавать боты Discord, вы получите множество возможностей, с которыми тысячи людей смогут взаимодействовать каждый день.
В этом обучающем модуле мы создадим бот Discord с нуля, используя Node.js и библиотеку Discord.js, позволяющую пользователям взаимодействовать с Discord API напрямую. Мы настроим профиль бота Discord, получим токены аутентификации для бота и запрограммируем бот для обработки отправляемых пользователями команд с аргументами.
Предварительные требования
Для начала вам потребуется следующее:
Node.js, установленный на вашем компьютере для разработки. Чтобы установить его в macOS или Ubuntu 18.04, следуйте указаниям руководства Установка Node.js и создание локальной среды разработки в macOS или раздела Установка с помощью PPA руководства Установка Node.js в Ubuntu 18.04.
Любой текстовый редактор по вашему усмотрению, например, Visual Studio Code, Atom, Sublime или Nano.
Бесплатная учетная запись Discord с подтвержденной учетной записью электронной почты и бесплатный сервер Discord, который вы будете использовать для тестирования вашего бота Discord.
Шаг 1 — Настройка бота Discord
На этом шаге вы будете использовать графический интерфейс разработчиков Discord для настройки бота Discord и получения токена бота, который вы передадите в свою программу.
Чтобы зарегистрировать бота на платформе Discord, используйте панель приложений Discord. Здесь разработчики могут создавать приложения Discord, включая ботов Discord.
Для начала нажмите New Application (Новое приложение). Discord предложит вам ввести имя нового приложения. Затем нажмите Create (Создать) для создания приложения.
Примечание. Имя приложения не связано с именем бота, и эти имена могут не совпадать.
Теперь откройте свою панель приложения. Чтобы добавить бота в приложение, откройте вкладку Bot (Бот) на панели навигации слева.
Нажмите кнопку Add Bot (Добавить бота), чтобы добавить бота в приложение. Нажмите кнопку Yes, do it! (Да, сделать это!) в диалоге запроса подтверждения. Откроется панель с подробными сведениями об имени вашего бота, токене аутентификации и изображении в профиле.
На этой панели вы можете изменить имя бота или изображение профиля. Также необходимо скопировать токен аутентификации бота, нажав Click to Reveal Token (Нажмите для показа токена) и скопировав отображаемый токен.
Предупреждение. Никогда не публикуйте и не выгружайте в сеть свой токен бота, поскольку это позволит любому пользователю выполнить вход в бот.
Теперь нужно создать приглашение, которое позволяет добавить гильдии ботов Discord, где вы можете протестировать бот. Вначале перейдите на вкладку OAuth2 на панели приложения. Чтобы создать приглашения, прокрутите страницу и выберите бота в разделе scopes. Также необходимо установить разрешения, чтобы определить, какие действия бот может выполнять в гильдиях. Для целей этого обучающего модуля выберите пункт Administrator (Администратор), которые дадут вашему боту разрешения для выполнения в гильдиях практически любых действий. Скопируйте ссылку с помощью кнопки Copy.
Затем добавьте бот на сервер. Перейдите по созданной ссылке с приглашением. Вы можете добавить бот на любой сервер, который вам принадлежит или на котором у вас есть права администратора, используя выпадающее меню.
Теперь нажмите кнопку Continue (Продолжить). Обязательно установите отметку рядом с полем Administrator, чтобы предоставить боту разрешения администратора. Затем нажмите Authorize (Авторизация). Discord предложит вам решить головоломку CAPTCHA, прежде чем бот сможет подключиться к серверу. Теперь наш бот Discord отображается в списке пользователей сервера, на который вы добавили бота, со статусом offline (не в сети).
Вы успешно создали бота Discord и добавили его на сервер. Далее мы напишем программу для входа в бот.
Шаг 2 — Создание проекта
На этом шаге мы настроим базовую среду программирования, где выполним сборку бота и войдем в него программным путем.
Вначале необходимо настроить папку проекта и необходимые файлы проекта для бота.
Создайте папку проекта:
Перейдите в только что созданную папку проекта:
Далее используйте текстовый редактор для создания файла с именем config.json для сохранения токена аутентификации вашего бота:
Затем добавьте в файл конфигурации следующий код, заменяя выделенный текст токеном аутентификации вашего бота:
Сохраните и закройте файл.
Затем мы создадим файл package.json , где будут храниться детали нашего проекта и информация о зависимостях, используемых в проекте. Для создания файла package.json запустите следующую команду npm :
Сейчас мы установим пакет discord.js , который будем использовать для взаимодействия с Discord API. Вы можете установить discord.js через npm с помощью следующей команды:
Мы настроили файл конфигурации, установили необходимую зависимость и теперь можем начать сборку бота. В реальном приложении мы бы разделили код большого бота на несколько файлов, но в этом обучающем модуле мы поместим весь код бота в один файл.
Вначале создайте файл с именем index.js в папке discord-bot для кода:
Начните программирование бота, запросив зависимость discord.js и файл конфигурации с токеном бота:
После этого добавьте следующие две строки кода:
Сохраните и закройте файл.
Первая строка кода создает новый клиент Discord.Client и назначает его как значение константы client . Этот клиент частично обеспечивает взаимодействие с Discord API и получает уведомления Discord о событиях, например, о новых сообщениях. Фактически клиент представляет бот Discord.
Во второй строке кода метод login используется на клиенте для входа в созданный бот Discord с использованием токена в файле config.json в качестве пароля. Токен сообщает Discord API, для какого бота предназначена программа, а также подтверждает вашу аутентификацию для использования бота.
Теперь запустите файл index.js с помощью Node:
Теперь статус вашего бота на сервере Discord, куда вы его добавили, изменится на online (в сети).
Мы успешно настроили среду программирования и создали базовый код для входа в бот Discord. На следующем шаге мы займемся пользовательскими командами и заставим бота выполнить определенные действия, например, отправить сообщения.
Шаг 3 — Обработка первой команды пользователя
На этом шаге мы создадим бот, который может обрабатывать команды пользователя. Вы запустите свою первую команду ping , на которую будет отправлен ответ pong с указанием времени ответа на команду.
Сначала необходимо обеспечить обнаружение и получение любых отправляемых пользователями сообщений, чтобы бот мог обрабатывать любые команды. Используя метод on клиента Discord, Discord будет отправлять вам уведомления о новых событиях. Метод on принимает два аргумента: название ожидаемого события и функцию, которая будет запускаться каждый раз, когда будет возникать это событие. С этим методом вы можете ожидать события message , которое будет возникать каждый раз при отправке сообщения в гильдию, где у бота имеется разрешение на просмотр сообщений. Поэтому мы создадим функцию, которая будет запускаться для обработки команд каждый раз при отправке сообщения.
Вначале откройте свой файл:
Добавьте в файл следующий код:
Эта функция, выполняемая для события message , принимает параметр message . Параметр message имеет значение экземпляра Discord.js message, содержащее информацию об отправленном сообщении и методах, которые помогут боту ответить на него.
Добавьте следующую строку кода в функцию обработки команд:
Эта строка проверяет, является ли автор сообщения ботом, и если это так, останавливает обработку команды. Это важно, поскольку обычно нам не нужно обрабатывать сообщения ботов или отвечать на них. Другим ботам обычно не требуется использовать наш бот, и поэтому игнорирование их сообщений позволит нам сэкономить вычислительную мощность и предотвратить случайные ответы.
Теперь мы напишем обработчик команд. Для этого важно понимать обычный формат команды Discord. Обычно структура команды Discord содержит три части в следующем порядке: префикс, имя команды и (иногда) аргументы команды.
Префикс: префикс может быть любым, но обычно это знак пунктуации или абстрактная фраза, которая обычно не может располагаться в начале сообщения. Это означает, что при добавлении префикса в начало сообщения бот будет знать, что это команда, которую ему необходимо обработать.
Имя команды: имя команды, которое пользователь хочет использовать. Это означает, что бот может поддерживать несколько команд с разными функциями и разрешать пользователям выбирать между ними, используя разные имена команд.
Аргументы: иногда команда запрашивает или использует дополнительную информацию от пользователя, и пользователь может указывать аргументы после имени команды, разделяя их пробелами.
Примечание. Принудительно устанавливаемой структуры команд нет, и боты могут обрабатывать команды как угодно, однако здесь мы описываем эффективную структуру, которую использует большинство ботов.
Чтобы начать создание синтаксического анализатора команд, поддерживающего этот формат, добавьте следующие строки кода в функцию обработки сообщений:
Первая строка кода добавляется, чтобы присвоить значение "!" константе prefix , которую мы будем использовать в качестве префикса бота.
Вторая строка кода проверяет, начинается ли содержание обрабатываемого ботом сообщения с заданного префикса, и останавливает дальнейшую обработку сообщения, если префикса нет.
Теперь необходимо конвертировать остальную часть сообщения в название команды и любые аргументы, которые могут присутствовать в сообщении. Добавьте следующие выделенные строки:
Первая строка используется для удаления префикса из содержания сообщения и назначения результата константе commandBody . Это необходимо, поскольку нам не нужно, чтобы префикс входил в обработанное имя команды.
Вторая строка принимает сообщение с удаленным префиксом и использует на нем метод split с пробелом в качестве разделителя. Он разделяет команду на массив субстрок, проводя разделение после каждого пробела. В результате получается массив, содержащий имя команды, за которым идут аргументы (если они содержатся в сообщении). Мы назначаем этот массив константе args .
Третья строка удаляет первый элемент из массива args (это будет имя команды), конвертирует его в нижний регистр и назначает константе command . Это позволяет изолировать имя команды и оставить в массиве только аргументы. Также мы используем метод toLowerCase , поскольку команды в ботах Discord обычно не учитывают регистр.
Мы завершили построение синтаксического анализатора команд с реализацией обязательного префикса и получением имени команды и всех аргументов из сообщений. Теперь мы реализуем и создадим код для определенных команд.
Добавьте следующий код, чтобы начать реализацию команды ping :
Это выражение if проверяет соответствие обработанного имени команды (назначенного константе command ) значению "ping" . Такое соответствие означает, что пользователь хочет использовать команду "ping" . Мы вложим код определенной команды в блок выражения if . Впоследствии вы сможете использовать этот шаблон для других команд.
Теперь вы можете реализовать код для команды "ping" :
Сохраните и закройте файл.
Мы добавляем блок команды "ping" , который рассчитывает разницу между текущим временем, определяемым с помощью метода now объекта Date , и временной меткой создания сообщения, выражаемую в миллисекундах. Таким образом рассчитывается время обработки сообщения и ответа бота на команду "ping" .
Вторая строка отвечает на команду пользователя, используя метод reply с константой message . Метод reply отправляет запрос ping (уведомляющий пользователя и выделяющий сообщение для указанного пользователя) пользователю, который отправил команду, добавляя после запроса содержание, указанное в качестве первого аргумента метода. Мы указали литераль шаблона, содержащую сообщение и рассчитанное значение ping, в качестве ответа, который будет использоваться методом reply .
На этом мы завершаем реализацию команды "ping" .
Запустите свой бот с помощью следующей команды (в той же папке, что и index.js ):
Теперь вы можете использовать команду "! ping" на любом канале, где бот может просматривать и принимать сообщения, а также отправлять ответы.
Вы успешно создали бот, который может обрабатывать команды пользователей, и реализовали свою первую команду. На следующем шаге мы продолжим разработку бота, реализовав команду sum.
Шаг 4 — Реализация команды Sum
Теперь мы расширим нашу программу, реализовав команду "! sum" . Эта команда принимает любое количество аргументов, складывает их и возвращает пользователю сумму всех аргументов.
Если ваш бот Discord еще работает, вы можете остановить его процессы, нажав CTRL + C .
Откройте файл index.js снова:
Чтобы начать реализацию команды "! sum" , мы используем блок else-if . После проверки имени команды ping бот будет проверять, имеет ли имя команды значение "sum" . Мы используем блок else-if , потому что одновременно будет обрабатываться только одна команда, и если программа определит совпадение с именем команды "ping" , ей не нужно будет проводить проверку на совпадение с именем команды "sum" . Добавьте в файл следующие выделенные строки:
Теперь вы можете начать реализацию кода для команды "sum" . Код команды "sum" будет размещен в только что созданном нами блоке else-if . Теперь добавьте следующий код:
Мы используем метод map для списка аргументов, чтобы создать новый список, используя функцию parseFloat для каждого элемента в массиве args . При этом создается новый массив (назначенный константе numArgs ), где все элементы являются числами, а не строками. Это означает, что в дальнейшем вы можете определить сумму чисел, выполнив операцию сложения.
Вторая строка использует метод reduce на константе numArgs , предоставляя функцию, суммирующую все элементы в списке. Мы назначаем сумму всех элементов в numArgs как значение константы sum .
Затем мы используем метод reply на объекте сообщений, чтобы ответить на команду пользователя, отправив литераль шаблона, содержащую сумму всех аргументов, отправленных пользователем боту.
Это завершает реализацию команды "sum" . Теперь запустите бот, используя следующую команду (в той же папке, что и index.js ):
Теперь вы можете использовать команду "! sum" на любом канале, где бот может просматривать и отправлять сообщения.
Далее приведена законченная версия скрипта бота index.js :
На этом шаге мы дополнили наш бот Discord, реализовав в нем команду sum .
Заключение
Мы успешно создали бот Discord, который может обрабатывать разные команды пользователей и аргументы команд. Если вы хотите расширить возможности вашего бота, вы можете реализовать дополнительные команды или использовать другие части Discord API для построения мощного бота Discord. Вы можете ознакомиться с документацией по Discord.js или Discord API, чтобы узнать больше о Discord API.
При создании ботов Discord всегда помните об условиях обслуживания Discord API, определяющих требования к использованию Discord API разработчиками. Также вам может быть полезен этот набор рекомендаций, показывающий наилучшие способы построения бота Discord и содержащий советы по проектированию ботов Discord. Если вы хотите узнать больше о Node.js, ознакомьтесь с нашей серией материалов «Программирование в Node.js».
Thanks for learning with the DigitalOcean Community. Check out our offerings for compute, storage, networking, and managed databases.