В прошлый раз мы сделали наши команды более гибкими и улучшили структуру нашего кода для лучшей читабельности и масштабируемости. На этот раз мы превратим нашего простого бота в фабрику ботов, что позволит нам использовать его для создания нескольких ботов с разными конфигурациями, используя хорошо зарекомендовавшие себя шаблоны проектирования Factory и Revealing Module.

СЕРИЯ: Создание бота (DiscordJS)
1) Чат-боты на JavaScript — это просто
2) Масштабируемая установка с командными модулями
3) =› Вы здесь ‹=
4) Улучшенное ведение журнала и постоянная конфигурация бота

Вещи, которые вы должны знать для этой части, включают область действия и закрытие функций Javascript, а также основы es6 (функции const, let и жирные стрелки).

Трансформация

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

Затем мы обернем весь наш оставшийся код в нашу фабричную функцию и назовем ее createBot, но если бы мы просто вернули объект бота, который мы использовали до сих пор, это означало бы, что все внутри этой функции будет объединено и общедоступно. Мы не хотим этого, не так ли?

Чтобы убедиться, что мы контролируем то, что видно и доступно извне, мы не будем возвращать сам объект бота, а только те функции, которые необходимо использовать. В нашем случае сейчас это только функция bot.load(). Благодаря закрытию объект бота все еще будет там и запомнит все, что нам нужно для запуска нашего бота, но доступ ограничен тем, что мы передаем функции возврата. Его часто называют шаблоном отображения модуля.

Добавьте return {} в функцию createBot и определите только один атрибут как start(), который будет вызывать функцию загрузки.

Последнее, что нужно добавить сейчас, это module.export с нашей функцией createBot.

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

Я исправлю это, прежде чем мы двинемся дальше.

GitHub Commit (изменения)

Корректировки

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

Новый load() будет ожидать объект конфигурации с обязательными (токен) и необязательными (имя, префикс и другие) атрибутами и попытается объединить их с нашей конфигурационной схемой в loadConfig(). Наш старый код будет передан в loadConfig() в качестве обратного вызова здесь.

В loadConfig() мы проверим, есть ли наш первоначальный конфиг и содержит ли он токен. Если какая-либо проверка не пройдена, мы выдадим ошибку. В противном случае мы объединим первоначальный конфиг с нашей configSchema и прикрепим его к нашему боту до того, как выполним код обратного вызова.

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

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

Создайте новый index.js в корне проекта. Здесь мы импортируем нашу фабрику, загружаем наши переменные .env, содержащие наши токены, и добавляем конфигурации для наших ботов. Без множества ботов для запуска это был бы способ запустить одного бота с фабрикой.

Если у вас есть только один бот, его очень легко запустить. Создайте бота с помощью фабрики с вашим конфигом и запустите общедоступную start().

Вы сделали!

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

Если вы назовете свои токены в своем файле .env соответствующим образом, вы можете сопоставить их в своем файле конфигурации следующим образом.

Запуск нашего нового файла index.js теперь запустит столько ботов, сколько вы указали в файле конфигурации.

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

С последней корректировкой нашего package.json для переключения на новый файл index.js мы закончили и можем создавать столько ботов, сколько захотим (и зарегистрировались в Discord).

Один совет.

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

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

Бонус

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

Git Commit (логирование по тегам) Ссылка на готовый код/тег v0.0.3 на GitHub

Подведение итогов

Мы превратили наш бот-код в фабрику ботов и по пути использовали хорошо зарекомендовавшие себя и проверенные временем шаблоны проектирования.

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

Немного обо мне:

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

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

Вот некоторые из моих последних тем:
- Быстрый старт React с Typescript, Redux и Router
Linting/Prettier with Typescript
Redux + Инструментарий с Typescript
-Синтаксис Spread & Rest в Javascript
Чистый и простой Redux, объяснение
Теория игр, стоящая за инкрементными играми
- Пользовательские и гибкие UI-фреймы в React Native

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