thuwsi Опубликовано: 23 ноября 2019 Опубликовано: 23 ноября 2019 Часть -1: ПредисловиеПривет. В этом "курсе", вы научитесь создавать своих ботов для мессенджера Discord. Буду вам давать простые домашние задания.Вы уже должны знать основы JavaScript, node.js и npmПолезные ссылки:Документация библиотеки - https://discord.js.orgМой Discord, где вы можете задавать мне вопросы - thuwsi#7989Примерный план обучения:0. Регистрация бота, создание "Hello, world!" местного розлива1. Написание обработчика команд(одна команда - один файл)2. Разберем Message Embed3. Напишем команды модерации4. Разберем события клиента5. Создадим команду для получения информации о пользователе и сервере6. Напишем систему уровней7. Научимся отслеживать реакции и сообщения8. Разбор объекта Message9. Практика! Пишем своего бота модератора10. Написание музыкального бота(перевод статьи)Часть 0: Регистрация бота, создание "Hello, world!" местного розлива1. Заходим на https://discordapp.com/developers2. Нажимаем на New Application3. Придумываем название4. Копируем Client ID5. Заходим во вкладку Bot6. Нажимаем Add bot7. Ставим аватарку для бота8. Копируем токен, сохраняем его где-нибудь9. Идем на https://discordapi.com/permissions.html10. В поле Client ID вставляем ID бота, если поле ввода все еще красное, то стираем последнюю цифру и пишем её заново11. Отмечаем все галочки12. Переходим по ссылке и добавляем ботаПишем Ping-pong1. Создаем папку2. Открываем в ней консоль3. Пишем:Код:npm init4. Затем:Код:npm install discord.js5. Создаем index.js6. Создаем config.json7. В config.json пишем:Код:{"token": "ваш_токен","prefix": "префикс"}7.1. Префикс - символ с которого начинается команда8. Пишем код в index.jsКод:let discord = require("discord.js"); //Подключаем Discord.jslet config = require("./config.json"); //Подключаем конфигlet client = new discord.Client(); //Главный объект Discord.js - с него начинается обработка событийclient.on("message", message => { //Создаем обработчик событий на message//Используем message.contentif(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 UserMember - участник гильдии, со всеми методами для его бана, кика, выдачи ролей и т.д.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 из каждой папки из папки modules2. Файл 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(); //Класс для работы с RichEmbedembed.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"}; Bequietlife и Plinto 1 1
Рекомендованные сообщения
Создайте аккаунт или войдите в него для комментирования
Вы должны быть пользователем, чтобы оставить комментарий
Создать аккаунт
Зарегистрируйтесь для получения аккаунта. Это просто!
Зарегистрировать аккаунтВойти
Уже зарегистрированы? Войдите здесь.
Войти сейчас