Создание Discord-бота, используя библиотеку discord.js | Часть №1

Введение


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

Заключение


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

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

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

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

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

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

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

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


Комментарии 21

    0
    Несколько текстовых каналов. Одни люди имеют доступ в один канал, другие — в другой. Пользователь в канале с помощью бота отправляет в другой канал сообщение, содержащее текст, видео и картинку. Сам пользователь в канал, куда отправляется такое сообщение, доступа не имеет. Возможно реализовать такой функционал?
      0
      Добрый вечер, Techniker753
      Да, разумеется, такой функционал реализовать возможно, ведь контактирует с каналом не сам пользователь, а бот.
      Используйте данный код:

      		robot.channels.cache.get('ID_канала').send("Сообщение");
      

      0
      Большое спасибо! Очень понятное и полное руководство! Жду продолжение!
      0
      Автору — спасибо за проделанный труд!

      ИМХО, напрягает это засилье использования node везде, где только можно. Я вообще не считаю идею использовать js для бекенда хорошей, но это очень холиварная тема, поэтому не стоит начинать холивар тут.
        0
        Спасибо вам, Nokse, за положительный комментарий!

        –1
        как тяжело на js и как легко на Python. я сам пишу на питоне но лучше начать учить Rust
          0
          Добрый вечер, helish_88
          Не сказал бы.
          Такое впечатление появляется лишь из-за того, что я показал вариант с большим кодом для обработки команд. Существуют способы, намного компактнее показанного.
            0
            да не, я когда хотел учить какой-то язык что бы писать ботов для дискорд я начал с discord js, Потом понял что ничего не понял и начал учить питон, мне он понравился.
              0
              У каждого языка свои особенности, минусы и плюсы.
              Мне больше нравится писать ботов на Javascript, язык позволяет мне быстро выразить свои мысли.
            +1
            Как же тяжело с мухоловкой и легко с веером. я сам обычно пользуюсь веером, но лучше купить лопату.

            Все три инструмента находятся в практически противоположных областях, как вообще между ними можно выбирать?
            0
            Простейший парсер команд:
            bot.on('message', async msg => {
              if (msg.author.bot) return;
              if (!msg.content.startsWith(BOT_PREFIX)) return;
              let args = msg.content.split(/\s+/g);
              let cmd = args.shift();
              ...
            });
            

            Насчет определения функции не уверен, вроде работало. ИМХО, это гораздо проще и возможно быстрее.
            Также HashMap или что там в JS, имеет сложность O(1) для get запроса, когда тупой перебор — O(n).

            Также:
            «Math.floor(Math.random() * 4);» — может и 0 вернуть, т.к.
            1. Math.floor(0.9999) == 0
            2. 0.9 / 4 = 0.225
            3. Math.random() насколько я помню, возвращает от 0 до 1.
            Поэтому есть ~22%-25% шанс, что будет 0.
              –1
              Добрый вечер, 1keda
              Я осведомлен об этой особенности и даже хотел написать об этом в статье, но так как изначально она была рассчитана на новичков, я посчитал нужным не загружать никого лишней информацией.
              Math.random() и Math.floor() невероятно гибки, и их можно полностью настроить под себя.
              Возможно, я разберу это подробно в последующих статьях, но всё же, не будем забывать, что это основы Javascript, описанные в любом учебнике.
                0
                Здравствуйте, да, вполне возможно. Может я через строчку читал, или не написано было, но знать теперь буду. А еще было бы приятно увидеть в следующих статьях увидеть про оптимизацию, настройку БД и использованию ORM / самописного движка. Ну и еще какие-нибудь прикольные фишки как экономика/предметы/магазин и красивый профиль картинкой (пример из бота MEE6 ниже).

                Помню, как написание простейшего PHP скрипта на коленке для UPDATE/SELECT запросов в БД (скрипт висел на сайте и был параметр в GET запросе а-ля токен), ускорило ну… Раз в 50, может и на все два порядка. Был даже момент когда бот ответил через 9 часов ±, а после максимум минут через 5. Ибо 2,000 серверов и около 100,000 юзеров, ну и 0 оптимизации видать (я был WEB кодером, что там было — я не имею понятия).

                image
                  0
                  Всё это будет в скором времени, по возможности.
                  Разберу сначала простые вещи, потом перейду к более сложным и интересным.
                  Следующая статья уже почти готова, так что в ближайшие дни опубликую.
              0

              Статья интересная, но примеры кода тяжело читать.


              Вы использовали линтер?


              Где-то const/let, а где-то var.


              В одном месте увидел async/await и одновременно Promise.then.


              В колбэках где-то стрелочные функции, а где-то обычные.


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

                –1
                Добрый день, 777Polar_Fox777
                На данный момент я работаю над этим и в скором времени сделаю код читабельным.
                0
                Я так и не понял куда вписывать коды для этих игр, как Орёл и решка, удаление сообщений и т.д.
                  0
                  Добрый день, FurryFandom
                  Их вписывать необязательно, но если вы желаете, то просто добавляйте функции и заносите в них по одной команде, после чего добавляйте функции в массив.
                  Вот, как это будет выглядеть, на примере удаления сообщений:

                  function clear(robot, mess, args) { // Создание новой функции с командой
                  
                   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 сообщений за раз');
                    if (amount < 1) return mess.channel.send('Вы должны ввести число больше чем 1');
                          
                          async function delete_messages() {
                  
                          await mess.channel.messages.fetch({ limit: amount }).then(messages => {
                              mess.channel.bulkDelete(messages)
                              mess.channel.send(`Удалено ${amount} сообщений!`)
                          })};
                          delete_messages(); 
                  }
                  
                  var comms_list = [ // Добавление функции с командой в массив
                  	{name: "clear", out: clear, about: "Удаление сообщений"},
                  }
                  
                  
                  

                    –1
                    Вы гений, спасибо за эту статью и целую помощь и если не сложно, так же сделать с орлом и решкой.
                      0
                      Спасибо вам.
                      Код
                              function heads_or_tails(robot, mess, args) {
                              mess.channel.send('Монета подбрасывается...')
                      
                              var random = Math.floor(Math.random() * 4);
                      
                              if (random == 1) { 
                                  mess.channel.send(':full_moon: Орёл!')
                              } else if (random == 2) {
                                  mess.channel.send(':new_moon: Решка!')
                              } else if (random == 3) {
                                  mess.channel.send(':last_quarter_moon: Монета упала ребром!')
                              }
                      }
                      var comms_list = [ 
                      	{name: "heads_or_tails", out: heads_or_tails, about: "«Орёл или Решка»"},
                      }
                      

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

                Самое читаемое