multi bots online

This commit is contained in:
2023-05-08 10:58:05 -04:00
parent cbf7f78604
commit 0616ce2ea5
11 changed files with 1005 additions and 565 deletions

View File

@ -0,0 +1,16 @@
module.exports = {
'help': {
desc: `Print the allowed commands.`,
async function(from){
console.log('called help', from)
let intro = [
'I am a bot owned and operated by',
'wmantly <wmantly@gmail.com>',
'You have access to the following commands:'
]
await this.whisper(from, ...intro, ...this.__reduceCommands(from).map(command =>
`${command} -- ${this.commands[command].desc || ''}`
));
}
}
};

View File

@ -0,0 +1,161 @@
let ballOptions = [
"It is certain.",
"It is decidedly so.",
"Without a doubt.",
"Yes definitely.",
"You may rely on it.",
"As I see it, yes.",
"Most likely.",
"Outlook good.",
"The Core gods will it to be!",
"Yes.",
"Signs point to yes.",
"Reply hazy, try again.",
"You should ask Ethan",
"Ask again later.",
"Better not tell you now.",
"Cannot predict now.",
"Concentrate and ask again.",
"You will find the answers during you journey to The Core!",
"Don't count on it.",
"My reply is no.",
"My sources say no.",
"Outlook not so good.",
"Very doubtful.",
];
module.exports = {
'8ball':{
desc: `magic 8 Ball pick.`,
async function(from){
await this.say(
`> The 8 Ball says...`,
`> ${ballOptions[Math.floor(Math.random()*ballOptions.length)]}`
);
}
}
// bot.addCommand("joke", {
// desc: "Tells a random joke.",
// async function(from){
// await this.say('> Let me think...');
// let res = await axios.get('https://v2.jokeapi.dev/joke/Any?type=single')
// await this.say(...res.data.joke.split('\n').map(e => `> ${e}`));
// },
// });
// bot.addCommand("quote", {
// desc: 'Say an inspirational quote.',
// async function(from){
// await this.say('> Right away!');
// let res = await axios.get('https://zenquotes.io/api/random')
// await this.say(`> ${res.data[0].q} -- ${res.data[0].a}`);
// }
// });
// bot.addCommand('west-quote', {
// desc: `Say a random Kanye West quote.`,
// async function(from) {
// await this.say('> And here we go!');
// let res = await axios.get('https://api.kanye.rest/');
// await this.say(`> ${res.data.quote} -- Kanye West`);
// }
// });
// bot.addCommand('pink-quote', {
// desc: `Say a random Pink Floyd quote.`,
// async function(from) {
// await this.say(
// `> Rock 'n' Roll`,
// `> ${pink_quotes[Math.floor(Math.random()*pink_quotes.length)]} -- Pink Floyd`
// );
// }
// });
// bot.addCommand("fact", {
// desc: `Say a random fact.`,
// async function(from){
// await this.say('> The internet says this is true?');
// let res = await axios.get('https://uselessfacts.jsph.pl/random.json?language=en')
// await this.say(
// `> ${res.data.text}`,
// `> source: ${res.data.source}`
// );
// }
// });
// bot.addCommand("advice", {
// desc: `Say some random advice.`,
// async function(from){
// await this.say('> Try this:');
// let res = await axios.get('https://api.adviceslip.com/advice');
// await this.say(`> ${res.data.slip.advice}`);
// }
// });
// bot.addCommand('idea', {
// desc: `Say a random start up idea.`,
// async function(from){
// await this.say('> How about?');
// let res = await axios.get('https://itsthisforthis.com/api.php?text')
// await this.say(`> ${res.data}`);
// }
// });
// bot.addCommand('discord', {
// desc: `Say the CJ discord invite link.`,
// async function(from) {
// await this.say('https://discord.gg/hyby9m8');
// }
// });
// bot.addCommand('dice',{
// desc: `Roll a die. You can state the max size on the dice. Default is 6.`,
// async function(from, size){
// size = size || 6;
// if(!Number.isInteger(Number(size))){
// this.whisper(from, `${size} is not a whole number...`)
// return ;
// }
// await this.say(
// `> Rolling a dice for ${from}`,
// `> ${Math.floor(Math.random()*size)+1}`
// );
// }
// });
// bot.addCommand('random-player', {
// desc: `Return a random online player.`,
// async function(from){
// let players = bot.getPlayers()
// delete players[bot.bot.entity.username]
// let keys = Object.keys(players);
// let player = players[keys[ keys.length * Math.random() << 0]];
// await this.say(`> I pick [${player.lvl}]${player.username}`)
// }
// });
// bot.addCommand('flip', {
// desc: `Flip a coin.`,
// async function(from){
// await this.say(
// `> Flipping a coin for ${from}`,
// `> ${!!(Math.floor(Math.random() * (3000 - 1500) + 1500)%2) ? "Heads" : "Tails"}`
// );
// }
// });
};

View File

@ -0,0 +1,7 @@
'use strict';
module.exports = {
default: require('./default'),
fun: require('./fun'),
invite: require('./invite'),
};

View File

@ -0,0 +1,103 @@
'use strict';
const {sleep} = require('../../utils');
let myAccounts = ['wmantly', 'useless666', 'tux4242']
let germans = ['YTMatze', 'mytzor']
let townMemebers = [
'wmantly', 'useless666', 'tux4242',
'VinceNL',
'Ethan63020', 'Ethan63021',
'pi_chef',
'EXLAlphaWolf', 'Sillychubbs',
'BearSkates420', 'hloop',
'ogeiDNight', 'BobinaBlu', 'Roby_G_27',
'kawiimeowz', 'RaindropCake24', 'KimiKava',
'Keebyys',
'YTMatze', 'mytzor',
'jj_disaster', 'Cuttaway',
'sonic_joe',
]
let sites = {
fo: {
bot: 'jimin',
desc: `Get an invite to the Farming outpost.`,
allowed: ['wmantly', 'useless666', 'tux4242', 'pi_chef', 'pi_chef', '1_cut', 'nootbot', 'VinceNL', 'Ethan63020', 'Ethan63021', 'KimiKava', 'kawiimeowz', 'RaindropCake24'],
},
fo2: {
bot: 'henry',
desc: `Get an invite to the Farming outpost 2.`,
allowed: ['wmantly', 'useless666', 'tux4242', 'pi_chef', 'pi_chef', '1_cut', 'Ethan63020', 'Ethan63021', 'VinceNL', 'nootbot'],
},
foend: {
bot: 'ez',
desc: `Get an invite to the Farming outpost in the end.`,
allowed: ['wmantly', 'useless666', 'tux4242', 'pi_chef', 'pi_chef', '1_cut',],
},
sb: {
bot: 'owen',
desc: `Get an invite to the Sky Base.`,
allowed: ['wmantly', 'useless666', 'tux4242', 'pi_chef', 'pi_chef', '1_cut', 'Ethan63020', 'Ethan63021', 'VinceNL', 'nootbot'],
},
core: {
bot: 'nova',
desc: `Get an invite to the Core.`,
allowed: ['wmantly', 'useless666', 'tux4242', 'pi_chef', 'pi_chef', '1_cut', 'Ethan63020', 'Ethan63021', 'VinceNL', 'nootbot'],
},
// city: {
// bot: 'art',
// desc: 'Invite to the city',
// allowed: ['wmantly', 'useless666', 'tux4242', 'owenshorts', 'VinceNL', 'Ethan63020', 'Ethan63021']
// },
german: {
bot: 'linda',
desc: `Get an invite you Germans area.`,
allowed: ['wmantly', 'useless666', 'tux4242', 'owenshorts', 'VinceNL', 'Ethan63020', 'Ethan63021', 'pi_chef', 'YTMatze', 'mytzor', 'pi_chef', '1_cut', 'nootbot'],
},
}
function getSiteFromBot(name){
for(let site in sites){
if(sites[site].bot === name){
return sites[site];
}
}
}
module.exports = {
'inv': {
desc: `Have bot.\n Site -- one'`,
// allowed: townMemebers,
async function(from, site){
this.__unLockCommand();
if(sites[site] && sites[site].allowed.includes(from)){
let bot = this.constructor.bots[sites[site].bot];
if(!bot.isReady){
try{
await bot.connect();
}catch(error){
console.log('inv error connecting to bot');
this.whisper('Bot is not available right now, try again in 30 seconds.');
}
var clear = setTimeout(()=> bot.quit(), 10000);
}
await bot.bot.chat(`/invite ${from}`);
await bot.whisper(from, `accept invite from ${bot.bot.entity.username} within 10 seconds...`);
bot.on('message', (message) =>{
if(message.toString() === `${from} teleported to you.`){
if(clear){
clearTimeout(clear);
bot.quit();
}
}
});
}
}
},
};

View File

@ -1,55 +1,48 @@
'use strict';
const {sleep} = require('../utils');
const conf = require('../conf');
const {CJbot} = require('../model/minecraft');
const inventoryViewer = require('mineflayer-web-inventory');
// const inventoryViewer = require('mineflayer-web-inventory');
const bot = new CJbot({
host: conf.mc.server,
...conf.mc.bots.art
});
const henry = new CJbot({
host: conf.mc.server,
autoConnect: false,
__autoReConnect: false,
...conf.mc.bots.henry
});
const nova = new CJbot({
host: conf.mc.server,
autoConnect: false,
__autoReConnect: false,
...conf.mc.bots.nova
});
const owen = new CJbot({
host: conf.mc.server,
autoConnect: false,
__autoReConnect: false,
...conf.mc.bots.owen
});
const linda = new CJbot({
host: conf.mc.server,
autoConnect: false,
__autoReConnect: false,
...conf.mc.bots.linda
});
const jimin = new CJbot({
host: conf.mc.server,
autoConnect: false,
__autoReConnect: false,
...conf.mc.bots.jimin
});
const ez = new CJbot({
host: conf.mc.server,
autoConnect: false,
__autoReConnect: false,
...conf.mc.bots.ez
});
const commands = require('./commands');
module.exports = {bot, henry, owen, linda, jimin, nova, ez};
for(let name in conf.mc.bots){
if(CJbot.bots[name]) continue;
let bot = new CJbot({name, host: conf.mc.host, ...conf.mc.bots[name]});
CJbot.bots[name] = bot;
for(let command of conf.mc.bots[name].commands || ['default']){
for(let [name, toAdd] of Object.entries(commands[command])){
bot.addCommand(name, toAdd)
}
}
}
(async ()=>{
try{
for(let name in CJbot.bots){
let bot = CJbot.bots[name];
if(bot.autoConnect){
console.log('Trying to connect', name)
console.log('Status for', name, await bot.connect());
await sleep(30000);
}
}
}catch(e){
console.log('!!!!!!!! error:', e)
}})()
// module.exports = {bot: ez, henry, owen, linda, jimin, nova, ez};

View File

@ -4,9 +4,49 @@ const axios = require('axios');
const {sleep} = require('../utils');
const conf = require('../conf');
const {bot, henry, owen, linda, jimin, nova, ez} = require('./mc-bot');
const pink_quotes = require('../model/pink_quotes')
let sites = {
city: {
bot: art,
desc: 'Invite to the city',
allowed: ['wmantly', 'useless666', 'tux4242', 'pi_chef'],
},
core: {
bot: nova,
desc: `Get an invite to New Detroit.`,
allowed: ['wmantly', 'useless666', 'tux4242', 'pi_chef'],
},
sb: {
bot:owen,
desc: `Get an invite to the Sky Base.`,
allowed: ['wmantly', 'useless666', 'tux4242', 'owenshorts', 'VinceNL', 'Ethan63020', 'Ethan63021'],
},
fo: {
bot: jimin,
desc: `Get an invite to the Farming outpost.`,
allowed: ['wmantly', 'useless666', 'tux4242', 'pi_chef'],
},
fo2: {
bot:henry,
desc: `Get an invite to the Farming outpost 2.`,
allowed: ['wmantly', 'useless666', 'tux4242', 'pi_chef'],
},
german: {
bot:linda,
desc: `Get an invite you Germans area.`,
allowed: ['wmantly', 'useless666', 'tux4242', 'owenshorts', 'VinceNL', 'Ethan63020', 'Ethan63021', 'pi_chef', 'YTMatze', 'mytzor'],
},
foend: {
bot: ez,
desc: `Get an invite to the Farming outpost in the end.`,
allowed: ['wmantly', 'useless666', 'tux4242', 'pi_chef'],
},
}
console.log('HERERERER SITESSSS', sites)
let myAccounts = ['wmantly', 'useless666', 'tux4242']
let germans = ['YTMatze', 'mytzor']
@ -36,13 +76,16 @@ let ballOptions = [
"As I see it, yes.",
"Most likely.",
"Outlook good.",
"The Core gods will it to be!",
"Yes.",
"Signs point to yes.",
"Reply hazy, try again.",
"You should ask Ethan",
"Ask again later.",
"Better not tell you now.",
"Cannot predict now.",
"Concentrate and ask again.",
"You will find the answers during you journey to The Core!",
"Don't count on it.",
"My reply is no.",
"My sources say no.",
@ -50,240 +93,218 @@ let ballOptions = [
"Very doubtful.",
];
let sites = {
city: {
bot: bot,
desc: 'Invite to the city',
allowed: townMemebers
},
nd: {
bot: nova,
desc: `Get an invite to New Detroit.`,
allowed: townMemebers,
},
sb: {
bot:owen,
desc: `Get an invite to the Sky Base.`,
allowed: ['wmantly', 'useless666', 'tux4242', 'owenshorts', 'VinceNL', 'Ethan63020', 'Ethan63021'],
},
fo: {
bot: jimin,
desc: `Get an invite to the Farming outpost.`,
allowed: ['wmantly', 'useless666', 'tux4242', 'pi_chef'],
},
fo2: {
bot:henry,
desc: `Get an invite to the Farming outpost 2.`,
allowed: ['wmantly', 'useless666', 'tux4242', 'pi_chef'],
},
german: {
bot:linda,
desc: `Get an invite you Germans area.`,
allowed: ['wmantly', 'useless666', 'tux4242', 'owenshorts', 'VinceNL', 'Ethan63020', 'Ethan63021', 'pi_chef', 'YTMatze', 'mytzor'],
},
foend: {
bot: ez,
desc: `Get an invite to the Farming outpost in the end.`,
allowed: ['wmantly', 'useless666', 'tux4242', 'pi_chef'],
},
}
async function offSiteInvite(from, site){
let offSiteBot = sites[site].bot
this.__unLockCommand();
await offSiteBot.connect();
await offSiteBot.bot.chat(`/invite ${from}`);
await this.whisper(from, `accept invite from ${offSiteBot.bot.entity.username} within 10 seconds...`)
let clear = setTimeout(()=>offSiteBot.quit(), 10000)
offSiteBot.on('message', (message) =>{
if(message.toString() === `${from} teleported to you.`){
offSiteBot.quit();
const commands = {
'8ball':{
desc: `magic 8 Ball pick.`,
async function(from){
await this.say(
`> The 8 Ball says...`,
`> ${ballOptions[Math.floor(Math.random()*ballOptions.length)]}`
);
}
})
}
}
bot.addCommand('inv', {
desc: `Have bot invite you to its position.`,
allowed: townMemebers,
async function(from, site){
await this.say(`/invite ${from}`);
}
});
// async function offSiteInvite(from, site){
// let offSiteBot = sites[site].bot
// this.__unLockCommand();
// await offSiteBot.connect();
// await offSiteBot.bot.chat(`/invite ${from}`);
// await this.whisper(from, `accept invite from ${offSiteBot.bot.entity.username} within 10 seconds...`)
// let clear = setTimeout(()=>offSiteBot.quit(), 10000)
// offSiteBot.on('message', (message) =>{
// if(message.toString() === `${from} teleported to you.`){
// offSiteBot.quit();
// }
// })
// }
// bot.addCommand('inv', {
// desc: `Have bot invite you to its position.`,
// allowed: townMemebers,
// async function(from, site){
// if(getSiteFromBot(this.name).allowed.includes(from) await this.say(`/invite ${from}`);
// }
// });
console.log('sites,', sites)
for(const [name, site] of Object.entries(sites)){
bot.addCommand(`inv-${name}`, {
console.log('site', name)
commands[`inv-${name}`] = {
...site,
ignoreLock: true,
async function(from){
this.__unLockCommand();
await site.bot.connect();
if(!site.bit.isReady){
await site.bot.connect();
var clear = setTimeout(()=>site.bot.quit(), 10000);
}
await site.bot.bot.chat(`/invite ${from}`);
await this.whisper(from, `accept invite from ${site.bot.bot.entity.username} within 10 seconds...`)
let clear = setTimeout(()=>site.bot.quit(), 10000)
site.bot.on('message', (message) =>{
if(message.toString() === `${from} teleported to you.`){
site.bot.quit();
if(clear){
clearTimeout(clear);
site.bot.quit();
}
}
})
}
})
}
}
bot.addCommand('.invite', {
desc: `The bot will /accept an /invite from you.`,
allowed: ['wmantly', 'useless666', 'tux4242', 'owenshorts', 'BobinaBlu', 'pi_chef'],
async function(from){
await this.whisper('Coming');
await this.say(`/accept`);
}
});
// bot.addCommand('.invite', {
// desc: `The bot will /accept an /invite from you.`,
// allowed: ['wmantly', 'useless666', 'tux4242', 'owenshorts', 'BobinaBlu', 'pi_chef'],
// async function(from){
// await this.whisper('Coming');
// await this.say(`/accept`);
// }
// });
bot.addCommand('say', {
desc: `Make bot say stuff.`,
allowed: ['wmantlys', 'useless666', 'tux4242'],
ignoreLock: true,
async function(from, ...messages){
await this.say((messages || []).join(' '));
}
});
// bot.addCommand('say', {
// desc: `Make bot say stuff.`,
// allowed: ['wmantlys', 'useless666', 'tux4242'],
// ignoreLock: true,
// async function(from, ...messages){
// await this.say((messages || []).join(' '));
// }
// });
bot.addCommand("joke", {
desc: "Tells a random joke.",
async function(from){
await this.say('> Let me think...');
let res = await axios.get('https://v2.jokeapi.dev/joke/Any?type=single')
await this.say(...res.data.joke.split('\n').map(e => `> ${e}`));
},
});
// bot.addCommand("joke", {
// desc: "Tells a random joke.",
// async function(from){
// await this.say('> Let me think...');
// let res = await axios.get('https://v2.jokeapi.dev/joke/Any?type=single')
// await this.say(...res.data.joke.split('\n').map(e => `> ${e}`));
// },
// });
bot.addCommand("quote", {
desc: 'Say an inspirational quote.',
async function(from){
await this.say('> Right away!');
let res = await axios.get('https://zenquotes.io/api/random')
await this.say(`> ${res.data[0].q} -- ${res.data[0].a}`);
}
});
// bot.addCommand("quote", {
// desc: 'Say an inspirational quote.',
// async function(from){
// await this.say('> Right away!');
// let res = await axios.get('https://zenquotes.io/api/random')
// await this.say(`> ${res.data[0].q} -- ${res.data[0].a}`);
// }
// });
bot.addCommand('west-quote', {
desc: `Say a random Kanye West quote.`,
async function(from) {
await this.say('> And here we go!');
let res = await axios.get('https://api.kanye.rest/');
await this.say(`> ${res.data.quote} -- Kanye West`);
}
});
// bot.addCommand('west-quote', {
// desc: `Say a random Kanye West quote.`,
// async function(from) {
// await this.say('> And here we go!');
// let res = await axios.get('https://api.kanye.rest/');
// await this.say(`> ${res.data.quote} -- Kanye West`);
// }
// });
bot.addCommand('pink-quote', {
desc: `Say a random Pink Floyd quote.`,
async function(from) {
await this.say(
`> Rock 'n' Roll`,
`> ${pink_quotes[Math.floor(Math.random()*pink_quotes.length)]} -- Pink Floyd`
);
}
});
// bot.addCommand('pink-quote', {
// desc: `Say a random Pink Floyd quote.`,
// async function(from) {
// await this.say(
// `> Rock 'n' Roll`,
// `> ${pink_quotes[Math.floor(Math.random()*pink_quotes.length)]} -- Pink Floyd`
// );
// }
// });
bot.addCommand("fact", {
desc: `Say a random fact.`,
async function(from){
await this.say('> The internet says this is true?');
let res = await axios.get('https://uselessfacts.jsph.pl/random.json?language=en')
await this.say(
`> ${res.data.text}`,
`> source: ${res.data.source}`
);
}
});
// bot.addCommand("fact", {
// desc: `Say a random fact.`,
// async function(from){
// await this.say('> The internet says this is true?');
// let res = await axios.get('https://uselessfacts.jsph.pl/random.json?language=en')
// await this.say(
// `> ${res.data.text}`,
// `> source: ${res.data.source}`
// );
// }
// });
bot.addCommand("advice", {
desc: `Say some random advice.`,
async function(from){
await this.say('> Try this:');
let res = await axios.get('https://api.adviceslip.com/advice');
await this.say(`> ${res.data.slip.advice}`);
}
});
// bot.addCommand("advice", {
// desc: `Say some random advice.`,
// async function(from){
// await this.say('> Try this:');
// let res = await axios.get('https://api.adviceslip.com/advice');
// await this.say(`> ${res.data.slip.advice}`);
// }
// });
bot.addCommand('idea', {
desc: `Say a random start up idea.`,
async function(from){
await this.say('> How about?');
let res = await axios.get('https://itsthisforthis.com/api.php?text')
await this.say(`> ${res.data}`);
}
});
// bot.addCommand('idea', {
// desc: `Say a random start up idea.`,
// async function(from){
// await this.say('> How about?');
// let res = await axios.get('https://itsthisforthis.com/api.php?text')
// await this.say(`> ${res.data}`);
// }
// });
bot.addCommand('discord', {
desc: `Say the CJ discord invite link.`,
async function(from) {
await this.say('https://discord.gg/hyby9m8');
}
});
// bot.addCommand('discord', {
// desc: `Say the CJ discord invite link.`,
// async function(from) {
// await this.say('https://discord.gg/hyby9m8');
// }
// });
bot.addCommand('8ball',{
desc: `magic 8 Ball pick.`,
async function(from){
await this.say(
`> The 8 Ball says...`,
`> ${ballOptions[Math.floor(Math.random()*ballOptions.length)]}`
);
}
});
// bot.addCommand('dice',{
// desc: `Roll a die. You can state the max size on the dice. Default is 6.`,
// async function(from, size){
// size = size || 6;
// if(!Number.isInteger(Number(size))){
// this.whisper(from, `${size} is not a whole number...`)
// return ;
// }
// await this.say(
// `> Rolling a dice for ${from}`,
// `> ${Math.floor(Math.random()*size)+1}`
// );
// }
// });
bot.addCommand('dice',{
desc: `Roll a die. You can state the max size on the dice. Default is 6.`,
async function(from, size){
size = size || 6;
if(!Number.isInteger(Number(size))){
this.whisper(from, `${size} is not a whole number...`)
return ;
}
await this.say(
`> Rolling a dice for ${from}`,
`> ${Math.floor(Math.random()*size)+1}`
);
}
});
bot.addCommand('random-player', {
desc: `Return a random online player.`,
async function(from){
let players = bot.getPlayers()
// bot.addCommand('random-player', {
// desc: `Return a random online player.`,
// async function(from){
// let players = bot.getPlayers()
delete players[bot.bot.entity.username]
// delete players[bot.bot.entity.username]
let keys = Object.keys(players);
let player = players[keys[ keys.length * Math.random() << 0]];
// let keys = Object.keys(players);
// let player = players[keys[ keys.length * Math.random() << 0]];
await this.say(`> I pick [${player.lvl}]${player.username}`)
}
});
// await this.say(`> I pick [${player.lvl}]${player.username}`)
// }
// });
bot.addCommand('flip', {
desc: `Flip a coin.`,
async function(from){
await this.say(
`> Flipping a coin for ${from}`,
`> ${!!(Math.floor(Math.random() * (3000 - 1500) + 1500)%2) ? "Heads" : "Tails"}`
);
}
});
// bot.addCommand('flip', {
// desc: `Flip a coin.`,
// async function(from){
// await this.say(
// `> Flipping a coin for ${from}`,
// `> ${!!(Math.floor(Math.random() * (3000 - 1500) + 1500)%2) ? "Heads" : "Tails"}`
// );
// }
// });
bot.addCommand('help', {
desc: `Print the allowed commands.`,
async function(from){
console.log('called help', from)
let intro = [
'I am a bot owned and operated by',
'wmantly <wmantly@gmail.com>',
'You have access to the following commands:'
]
await this.whisper(from, ...intro, ...this.__reduceCommands(from).map(command =>
`${command} -- ${this.commands[command].desc || ''}`
));
}
});
// bot.addCommand('help', {
// desc: `Print the allowed commands.`,
// async function(from){
// console.log('called help', from)
// let intro = [
// 'I am a bot owned and operated by',
// 'wmantly <wmantly@gmail.com>',
// 'You have access to the following commands:'
// ]
// await this.whisper(from, ...intro, ...this.__reduceCommands(from).map(command =>
// `${command} -- ${this.commands[command].desc || ''}`
// ));
// }
// });
module.exports = {bot};
module.exports = commands;