Введение
В этой статье я подробно расскажу о том, как работать с библиотекой discord.js, создать своего Discord-бота, а также покажу несколько интересных и полезных команд.
Сразу хочу отметить, что я планирую сделать ряд подобных статей, начиная с простых команд, заканчивая музыкой, системой экономики и распознаванием голоса ботом.
Начало работы
Если вы уже знакомы с приведёнными ниже материалами, — смело можете пролистать этот раздел.
… и так далее.
Среда разработки выбирается по удобству использования и практичности, она у вас может быть любая, но мы рассмотрим её на примере Visual Studio Code, так как она является одной из самых приемлемых для новичков, а также для опытных программистов.
Для установки переходим по этой ссылке.
Выбираем свою операционную систему и запускаем скачивание.
На данный момент нас интересует версия долгосрочной поддержки (LTS), скачиваем её.
Для этого, кликните по отмеченной ниже иконке.
В открывшемся окне вписываем название название/идентификатор нужного нам расширения, после чего устанавливаем его.
Из полезных расширений могу отметить:
- Discord Presence — расширение, позволяющее отображать рабочую область и файл, в котором вы работаете в вашей игровой активности (функция работает только при использовании приложения Discord).
Идентификатор расширения: icrawl.discord-vscode
- 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 объекта:
Написание кода
Существует множество вариантов для его написания: используя один файл, два, несколько, и т.д
Мы рассмотрим вариант с двумя файлами, так как его использовать очень легко и удобно, но у каждого варианта есть свои недостатки — например, у этого недостатком является сложность в написании начального кода.
Но не волнуйтесь, весь код вам писать не придётся.
Мы можем сделать это двумя способами:
- Создать отдельный файл
- Записать всё в константы
Я не советую вам использовать второй вариант, так как в будущем вам придётся работать с большим объёмом информации, и такая запись будет доставлять неудобства.
Разберём хранение параметров в отдельном файле.
Итак, создаем файл 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» и отметим нужные боту привилегии.
Теперь осталось скопировать ссылку-приглашение и добавить бота на свой сервер.
- Заранее отметить нужные привилегии.
Для этого, сначала мы должны скопировать ссылку-приглашение.
После чего перейти в файл 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);
- Отметить нужные привилегии в самом коде.
Повторяем процедуры из первого способа, но уже с другими строками кода:
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, поэтому лучше указать только те привилегии, которые бот действительно использует для корректной работы
Полезные и интересные команды
В предыдущем разделе я показал вам, как запустить бота и как писать для него команды.
Теперь я хочу поделиться с вами несколькими своими командами.
- !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)) /* Отправление в чат сообщения бота */
- !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: Монета упала ребром!') }
- !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(); // Вызов асинхронной функции
- !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 и т.д).
anonymous
Несколько текстовых каналов. Одни люди имеют доступ в один канал, другие — в другой. Пользователь в канале с помощью бота отправляет в другой канал сообщение, содержащее текст, видео и картинку. Сам пользователь в канал, куда отправляется такое сообщение, доступа не имеет. Возможно реализовать такой функционал?
anonymous Автор
Добрый вечер, Techniker753
Да, разумеется, такой функционал реализовать возможно, ведь контактирует с каналом не сам пользователь, а бот.
Используйте данный код: