node-red-contrib-chatbot
Version:
REDBot a Chat bot for a full featured chat bot for Telegram, Facebook Messenger and Slack. Almost no coding skills required
187 lines (176 loc) • 6.1 kB
JavaScript
/* eslint-disable no-console */
const prompts = require('prompts');
const _ = require('lodash');
const { writeFileSync, existsSync, lstatSync, readFileSync, readdirSync } = require('fs');
const lcd = require('../lib/lcd/index');
const projects = readFileSync(`${__dirname}/../.local-bots`, 'utf8')
.split('\n')
.filter(str => !_.isEmpty(str));
const folderExists = dir => existsSync(dir) && lstatSync(dir).isDirectory();
(async () => {
// eslint-disable-next-line no-console
console.log(lcd.orange('RedBot Dev Environment') + ': ' + lcd.white('v0.2'));
// eslint-disable-next-line no-console
console.log('');
const response = await prompts(
{
type: 'select',
name: 'value',
message: 'Project to run',
choices: [
...projects
.map((item) => {
const [name, dir, projects, beEnvironment, feEnvironment] = item.split(',');
return {
title: name,
description: `${dir} (${projects === 'PROJECTS' ? 'projects' : 'standalone'}) - BE:${beEnvironment}/FE:${feEnvironment}`,
value: item
}
}),
{ title: 'New', value: 'new' },
{ title: 'Quit', value: 'quit' }
],
initial: 0
}
);
if (response.value === 'quit') {
// eslint-disable-next-line no-console
console.log('Quitting.');
// eslint-disable-next-line no-console
console.log('');
process.exit(1);
} else if (response.value === 'new') {
const dirs = readdirSync(__dirname + '/../mc_plugins', { withFileTypes: true })
.filter(dirent => dirent.isDirectory());
const response = await prompts([
{
type: 'text',
name: 'name',
message: 'Project name',
validate: value => {
if (_.isEmpty(value)) {
return 'Project name cannot be empty.';
} else if (value.includes(',')) {
return 'Please don\'t include commas in the project name';
}
return true;
}
},
{
type: 'text',
name: 'dir',
message: 'Project path',
description: 'Please create an empty dir',
validate: value => {
if (!folderExists(value)) {
return 'Path is invalid or is not a folder.';
}
return true;
}
},
{
type: 'select',
name: 'projects',
message: 'Enable Node-RED projects',
choices: [
{ title: 'Yes', value: 'PROJECTS' },
{ title: 'No', value: 'STANDALONE' }
],
initial: 0
},
{
type: 'select',
name: 'enableOTP',
message: 'Enable OTP',
choices: [
{ title: 'Yes', value: 'true' },
{ title: 'No', value: 'false' }
],
initial: 0
},
{
type: 'select',
name: 'frontendEnvironment',
message: 'Select backend environment',
choices: [
{ title: 'Development', value: 'development' },
{ title: 'Production', value: 'production' }
],
initial: 0
},
{
type: 'select',
name: 'backendEnvironment',
message: 'Select backend environment',
choices: [
{ title: 'Development', value: 'development' },
{ title: 'Plugin Mode', value: 'plugin' },
{ title: 'Production', value: 'production' }
],
initial: 0
},
{
type: prev => prev === 'development' ? 'multiselect' : null,
name: 'plugins',
message: 'Select local plugins to include',
choices: dirs.map(({ name }) => ({ title: name, color: '#0336699' })),
hint: '- Space to select. Return to submit',
format: value => value.map(idx => dirs[idx].name)
}
]);
// update local bots
writeFileSync(
`${__dirname}/../.local-bots`,
[...projects, `${response.name},${response.dir},${response.projects},${response.enableOTP},${response.backendEnvironment},${response.frontendEnvironment},${(response.plugins || []).join('|')}`].join('\n'),
'utf8'
);
let developmentMode = 'false';
if (response.frontendEnvironment === 'development') {
developmentMode = 'true';
} else if (response.frontendEnvironment === 'plugin') {
developmentMode = 'plugin';
}
// update .env file
const env = [
'REDBOT_DIR=.',
'REDBOT_ENABLE_MISSION_CONTROL=true',
`REDBOT_ENABLE_OTP=${response.enableOTP}`,
`REDBOT_DEVELOPMENT_MODE=${developmentMode}`,
`DATA_DIR=${response.dir}`,
`NODE_RED_ENABLE_PROJECTS=${projects === 'PROJECTS' ? 'true' : 'false'}`,
`ENVIRONMENT=${response.backendEnvironment}`,
`REDBOT_DEVELOPMENT_PLUGINS=${(response.plugins || []).join(',')}`
];
writeFileSync(`${__dirname}/../.env`, env.join('\n'));
// eslint-disable-next-line no-console
console.log('');
console.log(`Starting "${response.name}" -> (${response.dir})`);
console.log('');
} else {
const [name, dir, projects, enableOTP, backendEnvironment, frontendEnvironment, plugins = ''] = response.value.split(',');
// eslint-disable-next-line no-console
console.log(`Starting ${name} (${dir})`);
if (!folderExists(dir)) {
// eslint-disable-next-line no-console
console.log(`Folder ${dir} doesn't exist or it's not a folder.`);
process.exit(1);
}
let developmentMode = 'false';
if (frontendEnvironment === 'development') {
developmentMode = 'true';
} else if (frontendEnvironment === 'plugin') {
developmentMode = 'plugin';
}
const env = [
'REDBOT_DIR=.',
'REDBOT_ENABLE_MISSION_CONTROL=true',
`REDBOT_ENABLE_OTP=${enableOTP}`,
`REDBOT_DEVELOPMENT_MODE=${developmentMode}`,
`DATA_DIR=${dir}`,
'NODE_RED_ENABLE_PROJECTS=' + (projects === 'PROJECTS' ? 'true' : 'false'),
`ENVIRONMENT=${backendEnvironment}`,
`REDBOT_DEVELOPMENT_PLUGINS=${plugins.replaceAll('|', ',')}`
];
writeFileSync(`${__dirname}/../.env`, env.join('\n'));
}
})();