В прошлый раз мы сделали наши команды более гибкими и улучшили структуру нашего кода для лучшей читаемости и масштабируемости. На этот раз мы превратим наш простой бот на завод бота, что позволило нам использовать его для создания нескольких ботов с различными конфигами, используя хорошо установленные заводские и выясные шаблоны дизайна модулей.
Вещи, которые вы должны знать для этой части, включают в себя масштабы и закрытие функций JavaScript, а также основные основы ES6 (Const, Let и Fater Arrow Arrow)
Преобразование
Как я уже сказал, мы преобразуем наш предыдущий код в заводскую функцию. Это означает, что мы будем больше полагаться на параметры и настройку, приведенные при использовании завода, а не при настройке его. Итак, прежде всего, давайте немного очистимся. Мы собираемся выбрасывать много нашего старого кода.
Тогда мы будем обернуть весь наш оставшийся код в нашей фабричной функции и позвоните в это Createbot.
Но если бы мы просто вернули объект BOT, который мы использовали до сих пор, это будет означать, что все в этой функции будет в комплекте вместе и публично доступно. Мы не хотим этого, мы?
Чтобы убедиться, что мы контролируем то, что видно и доступно снаружи, мы не будем вернуть сам объект бота, а только функции, которые необходимо использовать для использования. В нашем случае сейчас это только bot.load ()
функция. Благодаря закрытию объект BOT все равно будет там и помнит все, что нам нужно для нашего бота, но доступ ограничен тем, что мы передаем к функции возврата. Это часто называют Выявить модуль шаблон Отказ
Добавьте возврат {} в функцию createbot и определите только один атрибут как Start ()
Это позвонит функцию нагрузки.
Последнее, что добавить сейчас, это Module.export с нашей функцией CreateBot.
Возможно, вы заметили, что я не использовал правильные отступы здесь. Чтобы показать вам лучший скриншот, я просто сохранил отступ (даже если я завернул код в функции), чтобы разфта была показана именно то, что я изменился в каждой строке.
Я исправлю это, прежде чем мы будем двигаться дальше.
Github Commit (изменения)
Корректировка
Поскольку мы получим наш конфигурацию, с данной, нам нужно сделать несколько незначительных корректировок. Прежде всего, нам нужно переписать наши bot.load ()
Функция следующим образом.
Новый нагрузка ()
Ожидается, что объект конфигурации с обязательным (токеном) и необязательным (имя, префикс и позже другие) атрибуты и попытка объединить их с нашей ConfigSchema в loadconfig ()
Отказ Наш старый код будет передан в loadconfig ()
в качестве обратного вызова здесь.
// Load the bot bot.load = function load(config) { // Set up some properties this.config = {} // Load config, load modules, and login this.loadConfig(config, () => { this.log('Loading commands...') Object.keys(botCommands).forEach(key => { this.commands.set(botCommands[key].name, botCommands[key]) }) this.log('Connecting...') this.client.login(this.config.token) }) }
В loadconfig ()
Мы проверим, есть ли наш начальный конфиг и содержит токен. Если либо проверьте неудачу, мы будем бросать ошибку. В противном случае мы объединим начальную конфигурацию с нашей Configschema и прикрепите его к нашему боту, прежде чем выполнить код обратного вызова.
// little helper to keep the code clean const has = (obj, prop) => Object.prototype.hasOwnProperty.call(obj, prop) bot.loadConfig = function loadConfig(config, callback) { this.log('Loading config...') try { if (!config || !has(config, 'token')) { throw Error('Config or token are missing.') } this.config = { ...configSchema, ...config, } callback() } catch (err) { this.log(`Error loading config: ${err.message}`) this.log('Please fix the config error and retry.') } }
Нам нужно сделать небольшую корректировку, чтобы схватить наш префикс на новый конфиг, а затем мы здесь сделаем.
С нашей фабрикой на месте пришло время добавлять боты. Для этой части правильно работать, вам нужно будет отправиться на Мой первый взнос этой серии И создайте второй бот через портал разработчиков, но вы также можете просто сделать массив из 1 бота и пойти с ним.
Создайте новый index.js в корне проекта. Именно здесь мы импортируем нашу фабрику, загрузите наши переменные .env, содержащие наши токены и добавьте конфиги для наших ботов. Без массива ботов, чтобы начать, это было бы способом начать один бот с заводом.
// File: index.js require('dotenv').config() const BotFactory = require('./src/index') const { TOKEN } = process.env const abe = BotFactory.createBot({ token: TOKEN, name: 'AllBotsEqual', prefix: '!', }) abe.start()
Если у вас есть только один бот, это супер легко начать. Создайте бот, используя завод с помощью конфигурации и запустите Start ()
это общедоступно.
Вы сделали!
Если вы хотите определить группу ботов, чтобы запустить из вашего проекта, вы можете просто сделать это в файле конфигурации.
// File: index.js require('dotenv').config() const config = require('./config.json') const BotFactory = require('./src/index') const { bots } = config bots.forEach(botConfig => { const { name, token, prefix} = botConfig const bot = BotFactory.createBot({ token: process.env[token], name, prefix, }) bot.start() })
Соответственно, если вы назваете свои жетоны в своем файле .env, вы можете сопоставить их в вашем файле конфигурации.
{ "bots": [ { "name": "AllBotsEqual", "token": "TOKEN_ABE", "prefix": "!" }, { "name": "Scout", "token": "TOKEN_SCOUT", "prefix": "$" } ] }
Запуск нашего нового файла index.js теперь начнет столько ботов, поскольку вы ввели в файл конфигурации.
Если вы дали им разные префиксы, теперь вы можете взаимодействовать с ними, как если бы они были полностью независимыми ботами. Если вы используете тот же префикс для обоих ботов, оба будут реагировать на одну и ту же команду.
С одной окончательной корректировкой для нашего Package.json для переключения на новый файл index.js, который мы теперь сделаны, и можем пожелать как можно больше ботов, сколько нам нравится (и зарегистрировано в раздоре) –
Одно слово совет, хотя.
Если вы используете боты на своем собственном сервере, этот способ создания нескольких ботов в порядке. Если вы планируете хостинг этого бота на многих серверах, которые будут использоваться многими людьми, группировать более одного бота вместе, не рекомендуется, потому что оно может привести к вопросам производительности.
В этом случае было бы лучше повторно использовать код для завода (например, путем отправки его и загрузки/импорта его из NPM).
Бонус
Возможно, вы заметили, что наш новый журнал консоли для нескольких ботов не говорит нам, какое загрузочное сообщение принадлежит к какому боту. Чтобы поправить это, я сделал еще одну незначительную корректировку, чтобы добавить короткий бирк на эти сообщения.
GIT Commit (помеченная регистрация)
Ссылка на готовый код/тег v0.0.3 на github
Упаковка
Мы превратили наш код бота на завод бота и использовали хорошо проверенные и проверенные временем дизайна рисунков по пути.
В следующий раз, когда я проверю вас через процесс написания масштабируемой и самооценки команды справки, а также добавление наших первых команд управления/администрирования пользователя, чтобы сделать бот немного более полезным.
Оригинал: “https://dev.to/allbitsequal/build-a-bot-discordjs-a-bot-factory-and-revealing-module-design-pattern-1kc”