2
0
mirror of https://github.com/thedevs-network/the-guard-bot synced 2025-08-23 18:38:05 +00:00
the-guard-bot/scripts/generate-config.js
2020-03-12 00:46:05 +01:00

164 lines
4.0 KiB
JavaScript

'use strict';
/* eslint-disable no-console */
const { join } = require('path');
const { promisify } = require('util');
const { promises: { readFile, writeFile } } = require('fs');
const sleep = promisify(setTimeout);
const { path } = require('ramda');
const inquirer = require('inquirer');
/** @type { import('telegraf').TelegrafConstructor } */
const Telegraf = require('telegraf');
const defaults = {
chats: {
presenceLog: false,
report: false
},
deleteCommands: 'own',
deleteCustom: {
longerThan: 450,
after: '20 minutes'
},
deleteJoinsAfter: '2 minutes',
deleteWarnsAfter: false,
deleteBansAfter: false,
blacklistedDomains: [],
excludeLinks: [],
expireWarnsAfter: Infinity,
groupsInlineKeyboard: [],
numberOfWarnsToBan: 3,
plugins: [],
warnInlineKeyboard: []
};
const useTemplate = (str, data) =>
str.replace(
/\$([\w.]+)/g,
(_, name) =>
path(name.split('.'), data)
);
const displayTelegramName = user =>
user.username
? '@' + user.username
: user.first_name;
const prepareConfigForTemplate = conf =>
Object.fromEntries(Object.entries(conf).map(([ k, v ]) =>
/* eslint-disable indent, operator-linebreak */
k === 'master' ? [
k,
displayTelegramName(v)
? `${v.id} /* ${displayTelegramName(v)} */`
: String(v.id)
] :
typeof v === 'boolean' ? [ k, String(v) ] :
typeof v === 'number' ? [ k, String(v) ] :
typeof v === 'string' ? [ k, `'${v}'` ] :
Array.isArray(v) ? [
k,
`[ ${v.map(x => typeof x === 'string' ? `'${x}'` : x).join(', ')} ]`
] :
[ k, prepareConfigForTemplate(v) ]));
/* eslint-enable indent, operator-linebreak */
const loadTemplate = () =>
readFile(join(__dirname, 'config.jstemplate'), 'utf8');
const load = () => {
try {
/* eslint-disable-next-line global-require */
return require(join(process.cwd(), 'config'));
} catch (err) {
return defaults;
}
};
const save = contents =>
writeFile(join(process.cwd(), 'config.js'), contents);
const generateUniqueKey = () =>
'meme' || String(Math.random()).split('.')[1].slice(0, 6);
const getMasterFromTelegram = async (token, existing) => {
const bot = new Telegraf(token);
const key = generateUniqueKey();
const { username } = await bot.telegram.getMe();
if (existing) {
const { keepExistingMaster } = await inquirer.prompt({
type: 'confirm',
name: 'keepExistingMaster',
message: `Keep existing master(s)? (${existing})`
});
if (keepExistingMaster) {
if (Array.isArray(existing)) {
return existing.map(x => ({ id: x }));
}
return { id: existing };
}
}
const masterp = new Promise(resolve =>
bot.start(ctx => {
const [ , entered ] = ctx.message.text.split(' ');
if (!entered || entered !== key) {
return console.error(displayTelegramName(ctx.from) +
': failed with incorrect or missing key!');
}
return resolve(ctx.from);
}));
await bot.launch({ polling: { timeout: 1 } });
console.log('Please open a conversation with the Telegram bot ' +
`using this link: https://t.me/${username}?start=${key}\n` +
`or find it in Telegram @${username} and type: /start ${key}`);
const master = await masterp;
// needed to ensure the bot actually clears this update
await sleep(100);
await bot.stop();
console.log(displayTelegramName(master) +
` registered as master for @${username}`);
return master;
};
const config = load();
inquirer.prompt({
type: 'input',
name: 'token',
default: config.token,
message: 'Please input your Telegram Bot token ' +
'obtained from https://t.me/BotFather'
})
.then(async ({ token }) => ({
token,
master: await getMasterFromTelegram(token, config.master)
}))
.then(async conf => ({
...conf,
...await inquirer.prompt({
type: 'confirm',
name: 'editAdvancedConfig',
default: false,
message: 'Edit advanced config?'
})
}))
.then(conf => {
if (conf.editAdvancedConfig) {
throw new Error('Editing advanced config is not implemented yet!');
}
return conf;
})
.then(async conf =>
save(useTemplate(
await loadTemplate(),
prepareConfigForTemplate({ ...defaults, ...conf })
)));