Перейти к публикации

[Гайд] Создание Discord бота.


thuwsi

Рекомендованные сообщения

Часть -1: Предисловие
Привет. В этом "курсе", вы научитесь создавать своих ботов для мессенджера Discord. Буду вам давать простые домашние задания.
Вы уже должны знать основы JavaScript, node.js и npm
Полезные ссылки:

Документация библиотеки - https://discord.js.org
Мой Discord, где вы можете задавать мне вопросы - thuwsi#7989
Примерный план обучения:
0. Регистрация бота, создание "Hello, world!" местного розлива
1. Написание обработчика команд(одна команда - один файл)
2. Разберем Message Embed
3. Напишем команды модерации
4. Разберем события клиента
5. Создадим команду для получения информации о пользователе и сервере
6. Напишем систему уровней
7. Научимся отслеживать реакции и сообщения
8. Разбор объекта Message
9. Практика! Пишем своего бота модератора
10. Написание музыкального бота(перевод статьи)
Часть 0: Регистрация бота, создание "Hello, world!" местного розлива
1. Заходим на https://discordapp.com/developers
2. Нажимаем на New Application
3. Придумываем название
4. Копируем Client ID
5. Заходим во вкладку Bot
6. Нажимаем Add bot
7. Ставим аватарку для бота
8. Копируем токен, сохраняем его где-нибудь
9. Идем на https://discordapi.com/permissions.html
10. В поле Client ID вставляем ID бота, если поле ввода все еще красное, то стираем последнюю цифру и пишем её заново
11. Отмечаем все галочки
12. Переходим по ссылке и добавляем бота
Пишем Ping-pong
1. Создаем папку
2. Открываем в ней консоль
3. Пишем:

Код:
npm init

4. Затем:

Код:
npm install discord.js

5. Создаем index.js
6. Создаем config.json
7. В config.json пишем:

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

7.1. Префикс - символ с которого начинается команда
8. Пишем код в index.js

Код:
let discord = require("discord.js"); //Подключаем Discord.js
let config = require("./config.json"); //Подключаем конфиг

let client = new discord.Client(); //Главный объект Discord.js - с него начинается обработка событий
client.on("message", message => { //Создаем обработчик событий на message
//Используем message.content
if(message.content == `${config.prefix}ping`){ //ВАЖНО: объект Message содержит всю информацию о сообщении, но не его содержание!
message.reply("pong!"); //Отвечаем на сообщение
}
});

client.login(config.token); //Подключаемся к Discord

Результат: http://prntscr.com/pyxmeh
Извиняюсь, что было натянуто. В следующем уроке пишем обработчик. Будет уже больше в формате статьи, а не списка пунктов
Часть 1: Обработчик команд
Привет! В этом уроке мы напишем обработчик команд. С ним будет работать намного легче.
В первую очередь, хочу разъяснить некоторые тонкости, которые в дальнейшем будут делать нам бобо:
1. Message - точка входа в Discord.js, вы должны знать этот объект, как свои пять пальцев. Пример: нам нужно сменить название сервера, пишем так:

Код:
//Внутри обработчтка сообщений
let guild = message.guild; //Важно: Guild - сервер
guild.setName("Лимоны захватят мир!"); //Устанавливаем название

Как я наверху писал, в нулевой части, Message - не само сообщение, а информация о нем
2. Member VS User
Member - участник гильдии, со всеми методами для его бана, кика, выдачи ролей и т.д.
User - пользователь, не имеет методов для бана, кика
Например:

Код:
//Внутри обработчика сообщений
let user = message.author; //Получаем User автора
let member = message.member; //Получаем Member автора
member.ban(); //Работает
user.ban(); //Ошибка

Проще говоря - User - человек. Member - человек в конкретном сервере
Пишем обработчик команд:
Давайте напишем обработчик, команд.
Сначала, разберем его алгоритм:
Алгоритм подключения:
1. Сканируем папку "cmds"
2. Подключаем все команды
Алгоритм выполнения:
1. Сравниваем название команды и сообщение
2. Вызываем метод Command.run(message)
Сканирование папки:

Код:
let fs = require("fs"); //Подключим FS для работы с файлами
let cmds = new Map(); //Используем Map для хранения списка команд
let files = fs.readdirSync("./cmds"); //Читаем содержимое папки cmds

Подгружаем команды:

Код:
for(let i = 0; i < files.length; i++){
let currentCommand = require(`./cmds/${files}`); //Подключим нашу команду
cmds.set(currentCommand.info.name, currentCommand); //Добавляем нашу команду в список, т.е. название команды - команда
console.log(`Подключена команда ${currentCommand.info.name} в файле ${files}`); //Отладка
}

Обработчик сообщений:

Код:
cmds.forEach(element => {
let command = message.content.split(" ")[0]; //Получаем название команды
if(command.toLowerCase() == `${config.prefix}${element.info.name.toLowerCase()}`)
element.run(message);
});

Структура проекта:
http://prntscr.com/pzeora
Структура файла с командой:

Код:
module.exports.run = message => { //Функция для запуска команды
message.reply("pong!");
};
module.exports.info = { //Информация о команде
"name": "ping"
};

Достаем двойные листочки, ой бля, не туда.
Домашнее задание:

Создать команду pong, пользователь пишет "!pong", бот отвечает "ping!"
Тут я сделал улучшенный обработчик команд, основанный на ООП: https://gitlab.com/kislball/guineabot
Алгоритм улучшенного обработчика:
1. Подключаем файл main.js из каждой папки из папки modules
2. Файл main.js создает модуль и команды(см. папку classes)
3. Добавление модуля в карту
4. Добавление команды в модуль
Часть 2: Разбор MessageEmbed
В этом туториале мы разберем MessageEmbed
В первую очередь, хочу сказать, что можно отправить сообщение без упоминания таким образом:

Код:
let channel = message.channel; //Получаем канал, в который было отправлено сообщение
channel.send("Лимоны захватят мир!"); //Отправляем сообщение

message.channel.send("Лимоны захватят мир!"); //Краткий метод

Message.channel.send(msg) VS Message.reply(msg)

Код:
message.channel.send("Лимоны захватят мир!"); //Лимоны захватят мир!
message.reply("Лимоны захватят мир!"); //<упоминание>, Лимоны захватят мир!

MessageEmbed - разбор
Внимание: не путаем MessageEmbed и RichEmbed; RichEmbed нужен для создания Embed'ов, MessageEmbed - для уже отправленных сообщений;

Код:
let discord = require("discord.js");
module.exports.run = message => {
let embed = new discord.RichEmbed(); //Класс для работы с RichEmbed
embed.addBlankField(); //Создает пустое пространство
embed.addField("Я поле номер один", "Я описание поля номер один!"); //Создание поля в одну строку
embed.addField("Я поле номер два", "Я стою наровне с полем номер три", true); //Создаем поле с дин. размером
embed.addField("Я поле номер три", "Я стою наровне с полем номер два", true); //Создаем поле с дин. размером
embed.setAuthor("Я автор этого Embed'a!", "https://im0-tub-ru.yandex.net/i?id=a90ca245e6f3add6e8eb8222ece29ecd&n=13", "https://lolzteam.org/"); //Указываем автора
embed.setColor([255,255,0]); //RGB цвет
embed.setDescription("Я описание этого Embed'a. Если нажать на автора, то я попаду на Lolzteam, ссылка передается третьим аргументом, а изображение - вторым.");
embed.setFooter("Я футер этого Embed'a", "https://im0-tub-ru.yandex.net/i?id=d21a40e721c6cb745a6eafd0541392b4&n=33&w=188&h=188");
embed.setImage("https://im0-tub-ru.yandex.net/i?id=296acfb00f1af45c2e01d9ec9fb6cf0b&n=13");
embed.setThumbnail("https://thumbs.dreamstime.com/b/%D0%BF%D0%BB%D0%BE%D1%81%D0%BA%D0%B8%D0%B9-%D0%BA%D0%BE%D0%BC%D0%BF%D0%BB%D0%B5%D0%BA%D1%82-%D0%BF%D0%BB%D0%BE%D0%B4%D0%BE%D0%BE%D0%B2%D0%BE%D1%89-%D0%B8%D0%B7%D0%B2%D0%B5%D1%81%D1%82%D0%BA%D0%B0-%D0%BB%D0%B8%D0%BC%D0%BE%D0%BD-%D0%B0%D1%80%D0%B1%D1%83%D0%B7-%D0%B7%D0%BD%D0%B0%D1%87%D0%BE%D0%BA-%D0%B2%D0%B5%D0%BA%D1%82%D0%BE%D1%80%D0%B0-%D0%BA%D1%83%D1%81%D0%BA%D0%B0-118209042.jpg");
embed.setTimestamp();
embed.setTitle("Embed Tutorial");
embed.setURL("https://lolzteam.org");
message.channel.send(embed);
};
module.exports.info = {
name: "embed"
};

 

Ссылка на комментарий

Создайте аккаунт или войдите в него для комментирования

Вы должны быть пользователем, чтобы оставить комментарий

Создать аккаунт

Зарегистрируйтесь для получения аккаунта. Это просто!

Зарегистрировать аккаунт

Войти

Уже зарегистрированы? Войдите здесь.

Войти сейчас
  • Сейчас на странице   0 пользователей

    • Нет пользователей, просматривающих эту страницу.
×
×
  • Создать...