Бот-клиент Discord не запускается

Обновлено: 21.11.2024

В этой главе предполагается, что вы ознакомились с главой "Начало работы" и код вашего бота скомпилирован. Кроме того, я должен повторить: если вы не понимаете код, который собираетесь увидеть, кодирование бота может быть не для вас. Перейдите в CodeAcademy и изучите Javascript.

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

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

Это событие:

В частности, это событие в discord.js, но оно похоже на то, как другие API обрабатывают события. Это событие срабатывает каждый раз, когда бот видит сообщение. Сюда входят все каналы, к которым у бота есть доступ, а также любые прямые или личные сообщения, которые он получает. Если кто-то отправляет 5 сообщений на канал, это событие срабатывает 5 раз.

Почему это важно? Ну, если вы собираетесь использовать своего бота на большом сервере или если вы хотите, чтобы он был на нескольких серверах, это становится большим количеством событий, запускаемых в каждый момент. Я не хочу слишком много говорить об оптимизации, но хочу сказать одно: используйте одну функцию обработки событий для каждого события.

Discord.js содержит большое количество событий, которые могут запускаться в определенных ситуациях. Например, событие готовности срабатывает, когда бот подключается к сети. Событие guildMemberAdd запускается, когда новый пользователь присоединяется к серверу, совместно используемому ботом. Полный список событий см. в разделе События в документации. Мы вернемся к некоторым из них позже в этой главе.

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

С этого момента я буду опускать код, который требует и инициирует discord.js, и сосредоточусь на конкретных частях кода.

Сохраните код и перезапустите бота. Для этого используйте CTRL+C в командной строке и повторно запустите node index.js. Да, есть лучшие способы перезагрузить код, как вы увидите далее в этой книге.

Вы можете протестировать свою новую команду, сказав foo в канале, которым вы делитесь с ботом. Вы также можете подтвердить, что ping по-прежнему возвращает pong !

Вы могли заметить, что многие боты реагируют на команды с префиксом. Это может быть восклицательный знак (!), точка (.), вопросительный знак (?) или другой символ, но с введением косой черты настоятельно не рекомендуется использовать / . Но это полезно по двум причинам.

Во-первых, если вы не используете уникальный префикс и имеете более одного бота на сервере, оба будут отвечать на одни и те же команды. На серверах разработчиков ввод !help приводит к потоку ответов и личных сообщений, чего следует избегать.

Во-вторых, в приведенном выше примере мы отвечаем, когда сообщение начинается с трех символов foo . В его текущем состоянии это означает, что следующее предложение вызовет ответ бота: дурак, ты еще не слышал обо мне в последний раз!. Да, это странный пример, но он все еще актуален — скажите это на канале вашего бота, и он ответит.

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

Изменения в коде по-прежнему просты. Давайте пройдемся по ним:

  • константный префикс = "!"; определяет префикс как восклицательный знак. Конечно, вы можете изменить его на что-то другое.
  • Строка if (!message.content.startsWith(prefix)) return; это небольшая оптимизация, которая гласит: «Если сообщение не начинается с моего префикса, прекратите то, что вы делаете». Это предотвратит работу остальных функций, благодаря чему ваш бот станет быстрее и быстрее откликнется.
  • Команды изменились, поэтому используйте этот префикс, при котором startWith(\ $ping`) будет запускаться только тогда, когда сообщение начинается с !ping`.

Второй момент так же важен, как наличие одного обработчика событий messageCreate. Допустим, бот получает сотню сообщений каждую минуту (не большое преувеличение для популярных ботов). Если функция не обрывается в начале, вы обрабатываете эти сотни сообщений в каждом из ваших условий команды. Если, с другой стороны, вы обрываете, когда префикса нет, вы экономите все эти циклы процессора для лучших вещей. Если команды составляют 1 % ваших сообщений, вы экономите 99 % вычислительной мощности.

Хорошо, извините, я немного вру. Это не 99%, это преувеличение. Однако правда, что вы значительно экономите на мощности процессора и оперативной памяти.

Мы почти закончили с базовым ботом. И последнее, о чем я хочу поговорить: боты отвечают друг другу.Давайте представим на мгновение, что у вас есть два бота на вашем сервере, и каждый из них может ответить на одну и ту же команду с префиксом !help . Но когда эта команда вызывается, она отвечает: !help команды: введите !help, а затем один из следующих, чтобы увидеть подробности: ping , foo .

Теперь один человек набирает !help в канале, и оба бота отвечают. Но они также увидят, как другой бот произносит команды !help: [. ] , увидят это как просьбу о помощи, ответят друг другу. в бесконечном цикле. Чтобы этого не произошло, мы можем добавить второе условие в наш обработчик события сообщения, прямо под тем, которое проверяет префикс:

Это условие содержит оператор ИЛИ ( || ), который выглядит следующим образом:

Если префикс отсутствует или автор этого сообщения — бот, остановить обработку. Это включает и самого бота.

И теперь у нас есть бот, который реагирует только на 2 команды и не тратит силы на то, чтобы понять что-то еще. Это полноценный базовый бот? Конечно! Итак, давайте закончим эту страницу здесь, а затем мы рассмотрим некоторые новые концепции.

Полный код бота теперь будет таким:

Каждый раз, когда я вижу этот SuperSecretBotTokenHere , я немного съеживаюсь. Видите ли, не рекомендуется иметь токены и элементы аутентификации в вашем коде, это действительно должно быть в отдельном файле! Перейдите к разделу Добавление файла конфигурации, и давайте сделаем это.

Текст был успешно обновлен, но возникли следующие ошибки:

Daniellop1 прокомментировал 10 сентября 2020 г.

запустить исполняемый файл с терминала.

Все еще не работает

Что-то не работает

xMvdl-ui прокомментировал 12 сентября 2020 г.

makemake5050 прокомментировал 13 сентября 2020 г.

Комментарий TheNebulaCreeper от 15 сентября 2020 г.

Кто-нибудь уже нашел способ это исправить?

klemmons72 прокомментировал 15 сентября 2020 г.

xNaCly прокомментировал 15 сентября 2020 г.

Daniellop1 прокомментировал 15 сентября 2020 г.

Приложение по-прежнему не работает, пожалуйста, не закрывайте проблему, если она не решена

Комментарий TheNebulaCreeper от 15 сентября 2020 г.

Я нашел решение этой проблемы. Если вы использовали версию .dmg, откройте Терминал и выполните следующую команду:
/Applications/Discord\ Bot\ Client.app/Contents/MacOS/Discord\ Bot\ Client
Если он находится в другой папке а не «Приложения», затем замените «Приложения» на папку, в которой они находятся. IE /Desktop/Discord\ Bot\ Client.app/Contents/MacOS/Discord\ Bot\ Client
Простое решение, но мне помогло.

Комментарий TheNebulaCreeper от 15 сентября 2020 г.

Это может также сработать для версии .zip, но я не уверен, так как использовал только версию .dmg.

kezvon прокомментировал 16 сентября 2020 г. •

Я нашел решение этой проблемы. Если вы использовали версию .dmg, откройте Терминал и выполните следующую команду:
/Applications/Discord\ Bot\ Client.app/Contents/MacOS/Discord\ Bot\ Client
Если он находится в другой папке а не «Приложения», затем замените «Приложения» на папку, в которой они находятся. IE /Desktop/Discord\ Bot\ Client.app/Contents/MacOS/Discord\ Bot\ Client
Простое решение, но мне помогло.

Все работало отлично, пока не случилось это. Когда я открываю приложение, это просто белое окно (для Mac).
Редактировать: я перезагрузил свой Mac и сделал это, и все еще белый экран.

Flam3rboy прокомментировал 16 сентября 2020 г.

попробуйте нажать Ctrl + R или нажмите View -> Reload

kezvon прокомментировал 16 сентября 2020 г.

попробуйте нажать Ctrl + R или нажмите View -> Reload

Flam3rboy прокомментировал 16 сентября 2020 г.

@kezvon вы скопировали не ту вещь, секрет вашего клиента не является токеном вашего бота. Обязательно скопируйте это:

kezvon прокомментировал 16 сентября 2020 г.

@kezvon вы скопировали не то, секрет вашего клиента не является токеном вашего бота. Обязательно скопируйте это:

Ой, забыл об этом!! Нужно больше спать LMAOO! Спасибо, чувак, ты очень помог сообществу Discord!

Сообщения без ответов

[Решено] создание версии peertube на github, отличной от ее версии в собственном репозитории. Производимых файлов меньше

  • Мохамад Реза
  • 9 минут назад
  • Ответов: 0

Мохамад Реза Спрашивает: выпуск релиза peertube на github отличается от версии релиза в собственном репозитории. Создано меньше файлов
Я установил экземпляр peertube. я больше всего манипулирую некоторыми функциями, такими как css и html-коды. поэтому я создаю проект github из peertube и делаю все, что хочу, но в процессе создания новая версия не имеет 4 файлов, и при установке сервер не распознает ее. есть ли какое-либо производственное руководство и кто-нибудь знает, почему

я пытаюсь установить настроенный экземпляр peertube

[Решено] Решение системы нелинейных уравнений с заданными данными в R?

  • Сара
  • 9 минут назад
  • Ответов: 0

Сара спрашивает: Решение системы нелинейных уравнений с заданными данными в R?
Интересно, как решить систему нелинейных уравнений с заданными данными в R? Пример кода выглядит следующим образом, и я хотел бы, чтобы функция была гибкой, чтобы иметь возможность получать различные типы наборов данных (X, Y, Z).

Это всего лишь пример кода, где уравнения F[1], F[2] и F[3] должны быть равны нулю, но приведенный выше код работает неэффективно. Будем признательны за любую помощь!

[Решено] Перезагрузите React-Table с помощью кнопки

  • Что делать?
  • 9 минут назад
  • Ответов: 0

What'sUP просит: Обновить таблицу React с помощью кнопки
Цель:
Нажмите кнопку перезагрузки, чтобы перезагрузить содержимое таблицы реагирования.

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

Какую часть я упустил?

Информация:
*Новое в реагирующей таблице
*Использование машинописного текста

[Решено] Конвейер ADO YAML: использование одного и того же агента не работает

  • пользователь18610347
  • 9 минут назад
  • Ответов: 0

user18610347 Спрашивает: Конвейер ADO YAML: использование того же агента не работает
Я новичок в ADO и YAML. Я пытаюсь преобразовать классический конвейер в YAML.

-стадия C: Pushtonuget

Проблема, с которой я сталкиваюсь, заключается в том, что последнее задание (которое ищет nupkg в ArtifactStagingDirectory и BinariesDirectory) не может найти файлы nupkg и, следовательно, не отправляется в репозиторий nuget. Если я выполню этот шаг внутри того же задания на этапе A, которое создает код, он сможет найти файлы nupkg и успешно отправить их в nuget. Я хочу иметь возможность разделить свои шаги на несколько этапов и иметь одного и того же агента для всего конвейера. Я использую требования, и он выполняется одним и тем же агентом, но мне интересно, очищается ли каталог после завершения этапа A? Есть ли хорошее решение для сборки и отправки пакетов на разных этапах без пересборки проектов?

Я хочу иметь возможность разделить шаги на несколько этапов и использовать одного и того же агента для всего конвейера. Я использую требования, и он выполняется одним и тем же агентом, но мне интересно, очищается ли каталог после завершения этапа A? Есть ли хорошее решение для сборки и отправки пакетов на разных этапах без пересборки проектов?

Типы и тестируемый код — два наиболее эффективных способа избежать ошибок. В этом руководстве вы узнаете о передовых методах работы с TypeScript при создании бота Discord с нуля.

Ветеран PHP/Laravel Михал (бакалавр наук) изучал Agile-командную работу в гиганте облачной аналитики Piwik PRO (теперь Matomo). В последнее время он сосредоточен на Vue.js.

Типы и тестируемый код — два наиболее эффективных способа избежать ошибок, особенно когда код со временем меняется. Мы можем применить эти два метода к разработке JavaScript, используя TypeScript и шаблон проектирования внедрения зависимостей (DI) соответственно.

В этом руководстве по TypeScript мы не будем рассматривать основы TypeScript напрямую, за исключением компиляции. Вместо этого мы просто продемонстрируем лучшие практики TypeScript, когда рассмотрим, как создать бота Discord с нуля, подключить тесты и DI, а также создать образец службы. Мы будем использовать:

Настройка проекта Node.js

Сначала создадим новый каталог с именем typescript-bot. Затем введите его и создайте новый проект Node.js, выполнив:

Примечание. Для этого также можно использовать пряжу, но для краткости остановимся на npm.

Откроется интерактивный мастер, который настроит файл package.json. Вы можете смело просто нажимать Enter для всех вопросов (или предоставить некоторую информацию, если хотите).Затем давайте установим наши зависимости и зависимости для разработчиков (те, которые нужны только для тестов).

Затем замените созданный раздел "скрипты" в package.json на:

Двойные кавычки вокруг тестов/**/*.spec.ts необходимы для рекурсивного поиска файлов. (Примечание: синтаксис может отличаться для разработчиков, использующих Windows.)

Скрипт start будет использоваться для запуска бота, скрипт watch для компиляции кода TypeScript и test для выполнения тестов.

Теперь наш файл package.json должен выглядеть так:

Создание нового приложения на панели инструментов Discord Apps

Выберите имя и нажмите «Создать». Затем нажмите Бот → Добавить бота, и все готово. Добавим бота на сервер. Но пока не закрывайте эту страницу, скоро нам потребуется скопировать токен.

Добавьте бота Discord на свой сервер

Чтобы протестировать нашего бота, нам нужен сервер Discord. Вы можете использовать существующий сервер или создать новый. Для этого скопируйте CLIENT_ID бота, который находится на вкладке «Общая информация», и используйте его как часть этого специального URL-адреса авторизации:

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

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

Создание файла .env

Нам нужен способ сохранить токен в нашем приложении. Для этого мы будем использовать пакет dotenv. Во-первых, получите токен на панели управления приложения Discord (Бот → Нажмите, чтобы показать токен):

Если вы используете Git, то этот файл нужно поместить в .gitignore, чтобы токен не был скомпрометирован. Кроме того, создайте файл .env.example, чтобы было известно, что TOKEN нуждается в определении:

Компиляция TypeScript

Чтобы скомпилировать TypeScript, вы можете использовать команду npm run watch. В качестве альтернативы, если вы используете PHPStorm (или другую IDE), просто используйте его средство просмотра файлов из плагина TypeScript и позвольте вашей IDE выполнять компиляцию. Давайте проверим нашу настройку, создав файл src/index.ts с содержимым:

Кроме того, давайте создадим файл tsconfig.json, как показано ниже. InversifyJS требует ExperimentDecorators , emitDecoratorMetadata , es6 и Reflect-Metadata :

Если наблюдатель за файлами работает правильно, он должен сгенерировать файл src/index.js, а запуск npm start должен привести к следующему:

Создание класса бота

Ни то, ни другое. Вместо этого давайте напишем более удобный в сопровождении, расширяемый и тестируемый код, внедрив токен с помощью нашей любимой среды внедрения зависимостей, InversifyJS.

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

Настройка контейнера внедрения зависимостей

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

Кроме того, в документации InversifyJS рекомендуется создать файл types.ts и перечислить каждый тип, который мы собираемся использовать, вместе с соответствующим символом Symbol . Это довольно неудобно, но гарантирует отсутствие конфликтов имен по мере роста нашего приложения. Каждый символ является уникальным идентификатором, даже если его параметр описания один и тот же (параметр предназначен только для целей отладки).

Без использования Symbol вот как это выглядит, когда происходит конфликт имен:

Сейчас даже более неудобно выбирать, какой MessageResponder следует использовать, особенно если наш контейнер внедрения зависимостей становится большим. Об этом позаботится использование Symbol s, и мы не придумаем странных строковых литералов в случае наличия двух классов с одинаковыми именами.

Использование контейнера в приложении Discord Bot

Теперь давайте изменим наш класс Bot, чтобы использовать контейнер. Для этого нам нужно добавить аннотации @injectable и @inject(). Вот новый класс бота:

Наконец, давайте создадим экземпляр нашего бота в файле index.ts:

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

Наконец у нас есть основа: типы TypeScript и контейнер внедрения зависимостей внутри нашего бота.

Реализация бизнес-логики

Давайте перейдем непосредственно к сути этой статьи: созданию тестируемой кодовой базы. Короче говоря, наш код должен реализовывать лучшие практики (например, SOLID), а не скрывать зависимости, не использовать статические методы.

Для простоты наш бот будет делать только одну вещь: он будет искать входящие сообщения, и если одно из них содержит слово «ping», мы будем использовать одну из доступных команд бота Discord, чтобы бот ответил "понг!" этому пользователю.

Чтобы показать, как внедрять пользовательские объекты в объект Bot и выполнять их модульное тестирование, мы создадим два класса: PingFinder и MessageResponder . Мы добавим MessageResponder в класс Bot, а PingFinder — в MessageResponder.

Вот файл src/services/ping-finder.ts:

Затем мы добавляем этот класс в файл src/services/message-responder.ts:

Наконец, вот модифицированный класс Bot, в котором используется класс MessageResponder:

В этом состоянии приложение не запустится, так как нет определений для классов MessageResponder и PingFinder. Добавим в файл inversify.config.ts следующее:

Кроме того, мы собираемся добавить символы типов в types.ts :

Теперь, после перезапуска нашего приложения, бот должен реагировать на каждое сообщение, содержащее «ping»:

А вот как это выглядит в логах:

Создание модульных тестов

Теперь, когда у нас правильно введены зависимости, писать модульные тесты несложно. Для этого мы будем использовать Chai и ts-mockito; тем не менее, есть много других средств запуска тестов и имитационных библиотек, которые вы могли бы использовать.

Синтаксис насмешек в ts-mockito довольно многословен, но также прост для понимания. Вот как настроить службу MessageResponder и внедрить в нее макет PingFinder:

Теперь, когда мы настроили макеты, мы можем определить, каким должен быть результат вызовов isPing(), и проверить вызовы reply(). Дело в том, что в юнит-тестах мы определяем результат вызова isPing(): true или false. Содержание сообщения не имеет значения, поэтому в тестах мы просто используем «Непустая строка».

Вот как может выглядеть весь набор тестов:

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

Создание интеграционных тестов

Помимо модульных тестов, мы также можем написать интеграционные тесты. Основное отличие состоит в том, что зависимости в этих тестах не имитируются. Однако есть некоторые зависимости, которые не следует тестировать, например внешние API-соединения. В этом случае мы можем создать макеты и повторно привязать их к контейнеру, чтобы вместо этого был внедрен макет. Вот пример того, как это сделать:

На этом мы подошли к концу нашего руководства по работе с ботами Discord. Поздравляем, вы построили его чисто, используя TypeScript и DI с самого начала! Этот пример внедрения зависимостей TypeScript — это шаблон, который вы можете добавить в свой репертуар для использования в любом проекте.

TypeScript и внедрение зависимостей: не только для разработки ботов Discord

Внедрение объектно-ориентированного мира TypeScript в JavaScript — это большое улучшение, независимо от того, работаем ли мы над внешним или внутренним кодом. Использование одних только типов позволяет нам избежать многих ошибок. Внедрение зависимостей в TypeScript еще больше расширяет возможности объектно-ориентированного подхода при разработке на основе JavaScript.

Понимание основ

Зачем использовать внедрение зависимостей?

Вы должны использовать шаблон проектирования внедрения зависимостей, если хотите писать более чистый код в том смысле, что он поддается модульному тестированию, более удобен в сопровождении и слабо связан. Используя внедрение зависимостей, вы получаете рецепт более чистого кода без необходимости заново изобретать велосипед.

Каковы преимущества внедрения зависимостей?

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

Какова цель TypeScript?

Основная цель TypeScript — сделать код JavaScript более чистым и удобочитаемым за счет добавления типов. Это помощь разработчикам, в основном полезная в IDE. Под капотом TypeScript по-прежнему преобразуется в обычный JavaScript.

Что такое бот Discord?

Бот Discord – это веб-приложение, использующее Discord API для связи.

Что может бот Discord?

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

Каковы преимущества TypeScript?

Основное преимущество TypeScript заключается в том, что разработчик может определять и использовать типы. Используя подсказки типов, транспилятор (или «компилятор исходного кода») знает, какой тип объекта должен быть передан данному методу. Любые ошибки или недопустимые вызовы обнаруживаются во время компиляции, что приводит к меньшему количеству ошибок на работающем сервере.

Discord API предоставляет вам простой инструмент для создания и использования собственных ботов и инструментов. Сегодня мы рассмотрим, как мы можем создать простого музыкального бота и добавить его на наш сервер. Бот сможет воспроизводить, пропускать и останавливать музыку, а также поддерживать функции очередей.

Предпосылки

Прежде чем мы начнем создавать бота, убедитесь, что у вас установлены все необходимые инструменты.

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

Настройка бота для разногласий

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

Мы можем сделать это, посетив портал и нажав новое приложение.

Создание нового приложения

После этого нам нужно дать нашему приложению имя и нажать кнопку "Создать".

Создание бота для разногласий

После этого нам нужно выбрать вкладку бота и нажать добавить бота.

Информационная страница Discord-бота

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

Добавление бота на ваш сервер

После создания нашего бота мы можем пригласить его с помощью генератора URL-адресов OAuth2.

Для этого нам нужно перейти на страницу OAuth2 и выбрать бота в области касания.

Вкладка OAuth2

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

Предоставление боту Discord необходимых разрешений

Затем мы можем скопировать сгенерированный URL-адрес и вставить его в наш браузер.

Ссылка для приглашения бота Discord

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

Пригласить бота на сервер

Создание нашего проекта

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

Сначала мы создаем каталог и переходим в него. Мы можем сделать это с помощью этих двух команд.

После этого мы можем создавать модули нашего проекта с помощью команды npm init. После ввода команды вам будет задано несколько вопросов, просто ответьте на них и продолжайте.

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

Теперь нам просто нужно открыть наш проект в текстовом редакторе. Я лично использую VS Code и могу открыть его с помощью следующей команды.

Основы Discord js

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

После завершения установки мы можем продолжить запись файла config.json. Здесь мы сохраняем токен нашего бота и префикс, который он должен прослушивать.

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

Копировать токен

Это единственное, что нам нужно сделать в нашем файле config.json. Итак, давайте начнем писать наш код JavaScript.

Во-первых, нам нужно импортировать все наши зависимости.

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

Теперь давайте добавим несколько простых слушателей, которые будут регистрироваться в console.log при их выполнении.

После этого мы можем запустить нашего бота с помощью команды узла, и он должен быть в сети в дискорде и вывести «Готово!» в консоли.

Чтение сообщений

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

Для чтения сообщений нам нужно написать только одну простую функцию.

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

Теперь нам нужно проверить, исходит ли сообщение от нашего собственного бота, и проигнорировать его, если это так.

В этой строке мы проверяем, является ли автор сообщения нашим ботом, и возвращаем результат, если это так.

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

После этого мы можем проверить, какую команду нам нужно выполнить. Мы можем сделать это, используя несколько простых операторов if.

В этом блоке кода мы проверяем, какую команду выполнять, и вызываем команду. Если команда ввода недействительна, мы пишем сообщение об ошибке в чат, используя функцию send() .

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

Добавление песен

Начнем с добавления команды воспроизведения.Для этого нам нужна песня и гильдия (гильдия представляет собой изолированный набор пользователей и каналов и часто называется сервером). Нам также понадобится библиотека ytdl, которую мы установили ранее.

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

После этого мы создаем асинхронную функцию с именем execute и проверяем, находится ли пользователь в голосовом чате и есть ли у бота соответствующие права. Если нет пишем сообщение об ошибке и возвращаемся.

Теперь мы можем продолжить получение информации о песне и сохранить ее в объект песни. Для этого мы используем нашу библиотеку ytdl, которая получает информацию о песне по ссылке на YouTube.

Это позволит получить информацию о песне с помощью библиотеки ytdl , которую мы установили ранее. Затем мы сохраняем необходимую информацию в объект песни.

После сохранения информации о песне нам просто нужно создать контракт, который мы можем добавить в нашу очередь. Для этого нам сначала нужно проверить, определена ли уже наша serverQueue, что означает, что музыка уже играет. Если это так, нам просто нужно добавить песню в нашу существующую очередь serverQueue и отправить сообщение об успешном завершении. Если нет, нам нужно создать его и попытаться присоединиться к голосовому каналу и начать воспроизводить музыку.

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

В этом блоке кода мы создаем контракт и добавляем нашу песню в массив песен. После этого мы пытаемся присоединиться к голосовому чату пользователя и вызываем нашу функцию play(), которую мы реализовать после этого.

Воспроизведение песен

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

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

После этого мы начнем воспроизводить нашу песню, используя функцию соединения play() и передав URL-адрес нашей песни.

Здесь мы создаем поток и передаем ему URL-адрес нашей песни. Мы также добавляем два слушателя, которые обрабатывают события конца и ошибки.

Примечание: это рекурсивная функция, что означает, что она вызывает сама себя снова и снова. Мы используем рекурсию, поэтому она воспроизводит следующую песню, когда песня закончена.

Теперь мы готовы воспроизвести песню, просто набрав !play URL в чате.

Пропуск песен

Теперь мы можем приступить к реализации функции пропуска. Для этого нам просто нужно завершить диспетчер, который мы создали в нашей функции play(), чтобы он запускал следующая песня.

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

Остановка песен

Функция stop() почти аналогична функции skip() за исключением того, что мы очищаем массив песен, что заставит нашего бота удалить очередь и выйти из голосового чата.

Полный исходный код index.js:

Здесь вы можете получить полный исходный код нашего музыкального бота:

Заключение

Вы дошли до конца! Надеюсь, что эта статья помогла вам понять API Discord и то, как вы можете использовать его для создания простого бота. Если вы хотите увидеть пример более продвинутого бота для разногласий, вы можете посетить мой репозиторий Github.

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

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

Читайте также: