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

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

СЕРИЯ: Создание бота (DiscordJS)
1) Чат-боты на JavaScript — это просто
2) Масштабируемая установка с командными модулями
3) Бот Factory and Revealing Module Design Pattern
4) =› вы здесь ‹=

Как всегда, ссылка на готовый код в GitHub — в конце статьи.

Кредиты: сегодняшняя сессия будет включать в себя код, частично взятый из Liora Bot Project. Не стесняйтесь смотреть на их код для большего вдохновения.

Лучшее ведение журнала

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

Вы знаете, что делать, возьмите то, что нам нужно, из npm, а затем давайте займемся делом.

npm i -S winston chalk

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

Затем мы создаем новый экземпляр регистратора с базовой настройкой и форматированием. В функции printf мы можем отформатировать желаемый формат выхода из системы. Нам нужна временная метка, а также уровень журнала и, конечно же, зарегистрированное сообщение.

Теперь осталось связать его с нашим бот-объектом, избавившись, наконец, от этого eslint-disable...

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

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

Одна вещь, от которой мы теперь можем избавиться, — это ставить тег везде вручную. Мы можем позволить Уинстону справиться с этим за нас. Измените строку, в которой мы присвоили результат winston.createLogger(), и превратите ее в функцию с толстой стрелкой, которая передает тег и возвращает логгер. Таким образом, мы можем включить тег в наш вывод printf через ${tag}.

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

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

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

Чтение и запись конфигураций

Некоторые из инструментов, которые мы собираемся использовать для нашей конфигурации, предварительно подготовлены в Node, но в дополнение к ним нам понадобится способ работы с файлами json, способ создания каталогов и открытия файлов.

npm i -S jsonfile mkdirp opn

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

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

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

Один совет: не добавляйте свой токен в configSchema вручную. Включите его в initialConfig при запуске бота, как мы его настроили в прошлый раз. Вам не нужно жестко кодировать токен вашего бота (или загружать его в общедоступный репозиторий в любом случае!), так как он лучше находится в файле .env без версии или в конфигурации среды вашего размещенного проекта.

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

1) Установка каталога конфигурации

Нам понадобится способ отслеживать пути файлов конфигурации к определенному каталогу. Мы просто сохраняем их в объекте нашего бота.

2) Запустите его один раз изначально

Здесь мы используем функцию очистки, которую мы определили ранее, чтобы взять имя бота и использовать его для создания каталога для каждого бота. Если вы запустите скрипт на своем ПК во время тестирования и разработки, файлы конфигурации будут записаны в ваш домашний/пользовательский каталог, а не в соответствующий каталог сервера. Просто проверьте файлы, начинающиеся с .discord-, за которыми следует имя вашего бота.

3) Откройте сгенерированные файлы конфигурации для проверки

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

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

4) Проверьте configSchema

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

5) Большой, loadConfig

Это место, где все это объединяется. Я разбил его на 5 подразделов, которые мы пройдем по частям.

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

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

АЛЬФА

Если старая конфигурация не найдена, мы просто создаем новый config.json в выбранном нами месте, используя mkdirp, небольшой пакет, напоминающий команду рабочего стола mkdir -p, и подготавливаем его с самыми основными и важными полями из того, что мы передаем при запуске проекта. ; discordToken, префикс и

БЕТА

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

ГАММА

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

ДЕЛЬТА

Запишите проверенный и чистый конфиг обратно на сервер.

ЭПСИЛОН

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

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

Ссылка на готовый код/тег v0.0.4 на GitHub

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

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

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

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

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

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

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

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