Введение


В этой статье я подробно расскажу о том, как работать с библиотекой discord.js, создать своего Discord-бота, а также покажу несколько интересных и полезных команд.

Сразу хочу отметить, что я планирую сделать ряд подобных статей, начиная с простых команд, заканчивая музыкой, системой экономики и распознаванием голоса ботом.

Начало работы


Если вы уже знакомы с приведёнными ниже материалами, — смело можете пролистать этот раздел.

Установка среды разработки
Для начала работы с кодом нам нужно установить среду разработки, это может быть:


… и так далее.

Среда разработки выбирается по удобству использования и практичности, она у вас может быть любая, но мы рассмотрим её на примере Visual Studio Code, так как она является одной из самых приемлемых для новичков, а также для опытных программистов.

Для установки переходим по этой ссылке.


Выбираем свою операционную систему и запускаем скачивание.

Установка среды выполнения
Для создания бота мы используем среду выполнения node.js. Для её установки нам необходимо перейти на этот сайт.



На данный момент нас интересует версия долгосрочной поддержки (LTS), скачиваем её.

Установка полезных расширений
В Visual Studio Code присутствует возможность устанавливать расширения.
Для этого, кликните по отмеченной ниже иконке.



В открывшемся окне вписываем название название/идентификатор нужного нам расширения, после чего устанавливаем его.



Из полезных расширений могу отметить:

  1. Discord Presence — расширение, позволяющее отображать рабочую область и файл, в котором вы работаете в вашей игровой активности (функция работает только при использовании приложения Discord).

    Идентификатор расширения: icrawl.discord-vscode


  2. Code runner — расширение, с помощью которого предоставляется возможность запускать определённые фрагменты кода.
    Идентификатор расширения: formulahendry.code-runner


Создание бота


Теперь, когда вы установили все нужные компоненты, мы можем приступить к созданию самого бота.

Здесь всё просто. Переходим на портал разработчиков и нажимаем на кнопку с надписью «New Application» — она находится в правом верхнем углу.

В открывшемся окне вписываем имя бота, после чего, нажимаем на кнопку с надписью «Create».



На этой странице мы можем изменить имя бота, загрузить для него иконку, заполнить описание.

Теперь наша задача — воплотить бота в жизнь. Для этого переходим во вкладку «Bot».



Нажимаем на кнопку с надписью «Add Bot» и воплощаем бота в жизнь.

Поздравляю! Вы создали аккаунт для вашего бота. Теперь у него есть тег, токен, ник и иконка.

Подготовка к написанию кода


После создания аккаунта для бота, мы должны установить нужные пакеты и модули, чтобы в дальнейшем он корректно работал.

Первым делом создаём папку, после чего открываем её в VS Code (Файл > Открыть папку) / (Ctrl + K Ctrl + O)

Далее нам нужно открыть терминал (Терминал > Создать терминал) / (Ctrl + Shift + `)



Теперь мы должны создать файл с неким «описанием» нашего бота, сделаем это через терминал.

Вписываем данную строку в терминал и нажимаем Enter:

npm init

После каждой появившейся строки нажимаем Enter или вписываем свои значения.
Значения в этом файле можно будет изменить в любой момент.

Далее, мы должны поочерёдно вводить в терминал эти строки:

npm install

npm install discord.js

«Install» также можно сокращать в «I», но необязательно.

Итого, если вы следовали инструкциям и всё сделали правильно, в вашей папке должны были появиться 3 объекта:



Написание кода


Об удобстве написания кода
Для того, чтобы наш бот появился в сети и мог реагировать на команды, нам нужно написать для него код.

Существует множество вариантов для его написания: используя один файл, два, несколько, и т.д

Мы рассмотрим вариант с двумя файлами, так как его использовать очень легко и удобно, но у каждого варианта есть свои недостатки — например, у этого недостатком является сложность в написании начального кода.

Но не волнуйтесь, весь код вам писать не придётся.

О хранении данных
Для начала, нам нужно где-то хранить основные параметры и информацию о боте.

Мы можем сделать это двумя способами:

  1. Создать отдельный файл
  2. Записать всё в константы

Я не советую вам использовать второй вариант, так как в будущем вам придётся работать с большим объёмом информации, и такая запись будет доставлять неудобства.

Разберём хранение параметров в отдельном файле.

Итак, создаем файл config.json

Вставляем в него следующий код:

{
    "token" : "Ваш_токен",
    "prefix" : "Ваш_префикс"
}

* Для получения токена зайдите на портал разработчиков, перейдите во вкладку «Bot» и скопируйте его.



* Самым распространённым среди разработчиков префиксом является !

Далее нам нужно создать файл bot.js и вставить в него данный код:


const Discord = require('discord.js'); // Подключаем библиотеку discord.js
const robot = new Discord.Client(); // Объявляем, что robot - бот
const comms = require("./comms.js"); // Подключаем файл с командами для бота
const fs = require('fs'); // Подключаем родной модуль файловой системы node.js  
let config = require('./config.json'); // Подключаем файл с параметрами и информацией
let token = config.token; // «Вытаскиваем» из него токен
let prefix = config.prefix; // «Вытаскиваем» из него префикс

robot.on("ready", function(){ /* Бот при запуске должен отправить в терминал сообщение «[Имя бота] запустился!» */
	console.log(robot.user.username + " запустился!");
});


robot.on('message', (msg) => { // Реагирование на сообщения
	if(msg.author.username != robot.user.username && msg.author.discriminator != robot.user.discriminator){
    	var comm = msg.content.trim()+" ";
	    var ok = false;
	    var comm_name = comm.slice(0, comm.indexOf(" "));
	    var messArr = comm.split(" ");
	    for(comm_count in comms.comms){
	    	var comm2 = prefix + comms.comms[comm_count].name;
	    	if(comm2 == comm_name){
	    		comms.comms[comm_count].out(robot, msg, messArr);
	    	}
	    }
    } 
});


robot.login(token); // Авторизация бота

Теперь создаём файл comms.js, в нём будут сами команды.

В нём должен быть следующий код:


const config = require('./config.json'); // Подключаем файл с параметрами и информацией
const Discord = require('discord.js'); // Подключаем библиотеку discord.js
const prefix = config.prefix; // «Вытаскиваем» префикс

// Команды //

    function test(robot, mess , args) {
        mess.channel.send('Test!')
    }


 // Список комманд //

var comms_list = [
	{name: "test", out: test, about: "Тестовая команда"}
];

// Name - название команды, на которую будет реагировать бот
// Out - название функции с командой
// About - описание команды 



module.exports.comms = comms_list;

Чтобы добавить больше команд — просто объявляйте больше функций и добавляйте их в список, например:


const config = require('./config.json');
const Discord = require('discord.js');
const prefix = config.prefix;
const versions = config.versions;


// Команды //

    function test(robot, mess, args) {
        mess.channel.send("Тест!")
    }

    function hello(robot, mess, args) {
        mess.reply("Привет!")
    }


 // Список комманд //

var comms_list = [
	{name: "test", out: test, about: "Тестовая команда"},
        {name: "hello", out: hello, about: "Команда для приветствия!"}
}




module.exports.comms = comms_list;

И вот, мы вышли на финишную прямую!

Осталось всего ничего — запустить бота.

Для этого открываем терминал и вставляем в него следующую строку:

node bot.js



Готово! Бот запущен и вы можете им пользоваться, ура!

Чтобы пригласить бота на свой сервер, воспользуемся нам уже известным порталом разработчиков.

Перейдём во вкладку OAuth2, пролистаем чуть ниже, выберем «Bot» и отметим нужные боту привилегии.

Теперь осталось скопировать ссылку-приглашение и добавить бота на свой сервер.



Как вывести ссылку-приглашение в терминал, при запуске бота?
Существует два способа:

  1. Заранее отметить нужные привилегии.

    Для этого, сначала мы должны скопировать ссылку-приглашение.
    После чего перейти в файл bot.js и вставить данную строчку кода сюда:

    
    robot.on("ready", function(){
        console.log(robot.user.username + " запустился!");
        console.log("Ссылка-приглашение")  // << //
    })
    

    Итоговый код должен быть таким:

    
    const Discord = require('discord.js'); 
    const robot = new Discord.Client();
    var comms = require("./comms.js");
    const fs = require('fs');
    let config = require('./config.json');
    let token = config.token;
    let prefix = config.prefix; 
    
    robot.on("ready", function(){
        console.log(robot.user.username + " запустился!");
        console.log("Ссылка-приглашение")
    })
    
    
    robot.on('message', (msg) => {
    	if(msg.author.username != robot.user.username && msg.author.discriminator != robot.user.discriminator){
        	var comm = msg.content.trim()+" ";
    	    var ok = false;
    	    var comm_name = comm.slice(0, comm.indexOf(" "));
    	    var messArr = comm.split(" ");
    	    for(comm_count in comms.comms){
    	    	var comm2 = prefix + comms.comms[comm_count].name;
    	    	if(comm2 == comm_name){
    	    		comms.comms[comm_count].out(robot, msg, messArr);
    	    	}
    	    }
        } 
    });
    
    robot.login(token)
    
    
    
      
    
    robot.login(token);
    

  2. Отметить нужные привилегии в самом коде.

    Повторяем процедуры из первого способа, но уже с другими строками кода:

    
    robot.on("ready", function(){
        console.log(robot.user.username + " запустился!");
        robot.generateInvite(["ADMINISTRATOR"]).then((link) => { // < //
            console.log(link); // < //
    })})
    

    Итоговый код:

    
    const Discord = require('discord.js'); 
    const robot = new Discord.Client();
    var comms = require("./comms.js");
    const fs = require('fs');
    let config = require('./config.json');
    let token = config.token;
    let prefix = config.prefix;
    
    robot.on("ready", function(){
        console.log(robot.user.username + " запустился!");
        robot.generateInvite(["ADMINISTRATOR"]).then((link) => { 
            console.log(link);
    })})
    
    
    robot.on('message', (msg) => {
    	if(msg.author.username != robot.user.username && msg.author.discriminator != robot.user.discriminator){
        	var comm = msg.content.trim()+" ";
    	    var ok = false;
    	    var comm_name = comm.slice(0, comm.indexOf(" "));
    	    var messArr = comm.split(" ");
    	    for(comm_count in comms.comms){
    	    	var comm2 = prefix + comms.comms[comm_count].name;
    	    	if(comm2 == comm_name){
    	    		comms.comms[comm_count].out(robot, msg, messArr);
    	    	}
    	    }
        } 
    }); 
    
    
    
      
    
    robot.login(token);
    

    Чтобы указать несколько привилегий, мы должны перечислить их в квадратных скобках, через запятую:

    
        robot.generateInvite(['KICK_MEMBERS', 'BAN_MEMBERS', 'SEND_MESSAGES']).then((link) => { 
            console.log(link);
    

    * Все привилегии указываются заглавными буквами

    Список доступных привилегий:

    ADMINISTRATOR
    CREATE_INSTANT_INVITE
    KICK_MEMBERS
    BAN_MEMBERS
    MANAGE_CHANNELS
    MANAGE_GUILD
    ADD_REACTIONS
    VIEW_AUDIT_LOG
    PRIORITY_SPEAKER
    STREAM
    VIEW_CHANNEL
    SEND_MESSAGES
    SEND_TTS_MESSAGES
    MANAGE_MESSAGES
    EMBED_LINKS
    ATTACH_FILES
    READ_MESSAGE_HISTORY
    MENTION_EVERYONE
    USE_EXTERNAL_EMOJIS
    VIEW_GUILD_INSIGHTS
    CONNECT
    SPEAK
    MUTE_MEMBERS
    DEAFEN_MEMBERS
    MOVE_MEMBERS
    USE_VAD
    CHANGE_NICKNAME
    MANAGE_NICKNAMES
    MANAGE_ROLES
    MANAGE_WEBHOOKS
    MANAGE_EMOJIS


    Я не советую вам из привилегий выбирать только ADMINISTRATOR, поэтому лучше указать только те привилегии, которые бот действительно использует для корректной работы


Полезные и интересные команды


В предыдущем разделе я показал вам, как запустить бота и как писать для него команды.
Теперь я хочу поделиться с вами несколькими своими командами.

  1. !say — с помощью этой команды бот может повторить ваше сообщение.



    Код:

        if(!mess.member.hasPermission("MANAGE_MESSAGES")) return mess.channel.send("У  вас нет прав"); /* Если у исполнителя команды нету привилегии MANGAGE_MESSAGES, он не сможет её использовать */
        
        let robotmessage = args = mess.content.split(' '); // Пробелы между словами 
        args.shift();
        args = args.join(' ');
    
        mess.delete().catch(); // Удаление сообщения пользователя после отправки 
    
        mess.channel.send(robotmessage).then(mess.channel.send(mess.author)) /*             Отправление в чат сообщения бота */
    

  2. !heads_or_tails — игра «Орёл или Решка».



    Код:

    
            mess.channel.send('Монета подбрасывается...')
    
            var random = Math.floor(Math.random() * 4); // Объявление переменной random - она вычисляет случайное число от 1 до 3
    
            if (random == 1) { // Если вычислено число 1, то выпадает орёл.
                mess.channel.send(':full_moon: Орёл!')
            } else if (random == 2) { // Если вычислено число 2, то выпадает решка.
                mess.channel.send(':new_moon: Решка!')
            } else if (random == 3) { // Если вычислено число 3, то монета падает         ребром.
                mess.channel.send(':last_quarter_moon: Монета упала ребром!')
            }
    

  3. !clear — удаление определённого количества сообщений.



    Код:

    
            const arggs = mess.content.split(' ').slice(1); // Все аргументы за именем команды с префиксом
            const amount = arggs.join(' '); // Количество сообщений, которые должны быть удалены
            if (!amount) return mess.channel.send('Вы не указали, сколько сообщений нужно удалить!'); // Проверка, задан ли параметр количества
            if (isNaN(amount)) return mess.channel.send('Это не число!'); // Проверка, является ли числом ввод пользователя 
            
            if (amount > 100) return mess.channel.send('Вы не можете удалить 100 сообщений за раз'); // Проверка, является ли ввод пользователя числом больше 100
            if (amount < 1) return mess.channel.send('Вы должны ввести число больше чем 1'); // Проверка, является ли ввод пользователя числом меньше 1
            
            async function delete_messages() { // Объявление асинхронной функции
    
            await mess.channel.messages.fetch({ limit: amount }).then(messages => {
                mess.channel.bulkDelete(messages)
                mess.channel.send(`Удалено ${amount} сообщений!`)
            })};
            delete_messages(); // Вызов асинхронной функции
    
  4. !random_name — генерация случайного имени.



    Не стоит пугаться большого кода, здесь всё предельно просто.

    Код:

    
            var name = new Array( // Объявление массива name и занесение в него большого количества имён
                'Абрам',' Аваз',' Аввакум',' Август',' Августин',
                ' Авдей',' Авраам',' Автандил',' Агап',' Агафон',
                ' Аггей',' Адам',' Адис',' Адольф',' Адриан',
                ' Азамат',' Айдар',' Айнур',' Айрат',' Аким',
                ' Алан',' Алей',' Александр',' Алексей',' Али',
                ' Альберт',' Альфред',' Амадей',' Амадеус',
                ' Амаяк',' Амвросий',' Ананий',' Анастасий',
                ' Анатолий',' Анвар',' Ангел',' Андоим',' Андрей',
                ' Аникита',' Антон',' Арам',' Арий',' Аристарх',
                ' Аркадий',' Арман',' Арно',' Арнольд',' Арон',' Арсен',
                ' Арсений',' Арслан',' Артем',' Артемий',' Артур',' Архип'
                ,' Аскар',' Аскольд',' Аслан',' Афанасий',' Ахмет',' Ашот'
                ,' Бальтазар',' Бежен',' Бенедикт',' Берек',' Бернард',
                ' Бертран',' Богдан',' Болеслав',' Борис',' Бронислав',
                ' Булат',' Вадим',' Валентин',' Валерий',' Вальтер',
                ' Варфоломей',' Василий',' Вацлав',' Велизар',' Венедикт',' Вениамин',' Викентий',' Виктор',' Вилли',' Вильгельм',' Виссарион',' Виталий',' Витольд',' Владимир',' Владислав',' Владлен',' Володар',' Вольдемар',' Всеволод',' Вячеслав',' Гавриил',' Галактион',' Гарри',' Гастон',' Гаяс',' Гевор',' Геннадий',' Генрих',' Георгий',' Геракл',' Геральд',' Герасим',' Герман',' Глеб',' Гордей',' Гордон',' Горислав',' Градимир',' Григорий',' Гурий',' Густав',' Давид',' Дамир',' Даниил',' Даниэль',' Данияр',' Дарий',' Дементий',' Демид',' Демосфен',' Демьян',' Денис',' Джамал',' Джордан',' Дмитрий',' Добрыня',' Дональд',' Донат',' Дорофей',' Евгений',' Евграф',' Евдоким',' Евсевий',' Евсей',' Евстафий',' Егор',' Елеазар',' Елисей',' Емельян',' Еремей',' Ермолай',' Ерофей',' Ефим',' Ефрем',' Жан',' Ждан',' Жорж',' Захар',' Зиновий',' Ибрагим',' Иван',' Игнатий',' Игорь',' Илларион',' Ильдар',' Ильнар',' Ильнур',' Илья',' Ильяс',' Иннокентий',' Иоанн',' Иосиф',' Ипполит',' Искандер',' Ислам',' Камиль',' Карим',' Карл',' Кирилл',' Клим',' Кондрат',' Константин',' Корней',' Кузьма',' Лавр',' Лаврентий',' Лев',' Леон',' Леонид',' Леонтий',' Леопольд',' Лука',' Лукьян',' Любим',' Макар',' Максим',' Максимилиан',' Марат',' Марк',' Марсель',' Мартин',' Матвей',' Мирон',' Мирослав',' Митрофан',' Михаил',' Михей',' Мишель',' Мстислав',' Мурат',' Муслим',' Назар','Абрам',' Аваз',' Аввакум',' Август',' Августин',' Авдей',' Авраам',' Автандил',' Агап',' Агафон',' Аггей',' Адам',' Адис',' Адольф',' Адриан',' Азамат',' Айдар',' Айнур',' Айрат',' Аким',' Алан',' Алей',' Александр',
                ' Алексей',' Али',' Альберт',' Альфред',' Амадей',' Амадеус',' Амаяк',' Амвросий',' Ананий',' Анастасий',' Анатолий',' Анвар',' Ангел',' Андоим',' Андрей',' Аникита',' Антон',' Арам',' Арий',' Аристарх',' Аркадий',' Арман',' Арно',' Арнольд',' Арон',' Арсен',' Арсений',' Арслан',' Артем',' Артемий',' Артур',' Архип',' Аскар',' Аскольд',' Аслан',' Афанасий',' Ахмет',' Ашот',' Бальтазар',' Бежен',' Бенедикт',' Берек',' Бернард',' Бертран',' Богдан',' Болеслав',' Борис',' Бронислав',' Булат',' Вадим',' Валентин',' Валерий',' Вальтер',' Варфоломей',' Василий',' Вацлав',' Велизар',' Венедикт',' Вениамин',' Викентий',' Виктор',' Вилли',' Вильгельм',' Виссарион',' Виталий',' Витольд',' Владимир',' Владислав',' Владлен',' Володар',' Вольдемар',' Всеволод',' Вячеслав',' Гавриил',' Галактион',' Гарри',' Гастон',
                ' Гаяс',' Гевор',' Геннадий',' Генрих',' Георгий',' Геракл',
                ' Геральд',' Герасим',' Герман',' Глеб',' Гордей',' Гордон',
                ' Горислав',' Градимир',' Григорий',' Гурий',' Густав',
                ' Давид',' Дамир',' Даниил',' Даниэль',' Данияр',
                ' Дарий',' Дементий',' Демид',' Демосфен',
                ' Демьян',' Денис',' Джамал',' Джордан',' Дмитрий',' Добрыня',
                ' Дональд',' Донат',' Дорофей',' Евгений',' Евграф',' Евдоким',' Евсевий',' Евсей',' Евстафий',' Егор',' Елеазар',' Елисей',' Емельян',' Еремей',' Ермолай',' Ерофей',' Ефим',' Ефрем',' Жан',' Ждан',' Жорж',' Захар',' Зиновий',' Ибрагим',' Иван',' Игнатий',' Игорь',' Илларион',' Ильдар',' Ильнар',' Ильнур',' Илья',' Ильяс',' Иннокентий',' Иоанн',' Иосиф',' Ипполит',' Искандер',' Ислам',' Камиль',' Карим',' Карл',' Кирилл',' Клим',' Кондрат',' Константин',' Корней',' Кузьма',' Лавр',' Лаврентий',' Лев',' Леон',' Леонид',' Леонтий',' Леопольд',' Лука',' Лукьян',' Любим',' Макар',' Максим',' Максимилиан',' Марат',' Марк',' Марсель',' Мартин',' Матвей',' Мирон',' Мирослав',' Митрофан',' Михаил',' Михей',' Мишель',' Мстислав',' Мурат',
                ' Муслим',' Назар'
            );
            var RandElement = name[Math.floor(Math.random()*(name.length))]; // Выбор случайного элемента из массива
            mess.channel.send(RandElement) // Отправка сообщения со случайным элементом из массива в чат
    

Заключение


Вот и подошла к концу первая часть обучения, как вы могли заметить, создать бота, используя библиотеку discord.js очень просто.

Итого, из этой статьи мы выяснили:

  • Как установить нужные модули и пакеты
  • Как установить среду разработки
  • Как установить среду выполнения
  • Как установить полезные расширения
  • Как создать аккаунт для бота
  • Как воплотить бота в жизнь
  • Как запустить бота
  • Как научить бота реагировать на команды
  • Как пригласить бота на свой сервер
  • Как писать код для работы команд

А также научились некоторым интересным и полезным командам.

Надеюсь, что вам понравилась моя статья и вы узнали из неё что-то новое.

Я постарался объяснить всё максимально доходчиво и подробно.

Следующую часть обучения я планирую сделать об использовании аргументов, а также покажу вам команды для модерации (!kick, !ban, !warn, !mute и т.д).

Сайты для самостоятельного изучения