В прошлый раз мы сделали наши команды более гибкими и улучшили структуру нашего кода для лучшей читаемости и масштабируемости. На этот раз мы превратим наш простой бот на завод бота, что позволило нам использовать его для создания нескольких ботов с различными конфигами, используя хорошо установленные заводские и выясные шаблоны дизайна модулей.
Вещи, которые вы должны знать для этой части, включают в себя масштабы и закрытие функций 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”