Skip to content
This repository has been archived by the owner on Jul 9, 2022. It is now read-only.

Commit

Permalink
Added new commands (crystball, calc)
Browse files Browse the repository at this point in the history
  • Loading branch information
tretdm committed Apr 27, 2021
1 parent bc31619 commit 49e0b0b
Show file tree
Hide file tree
Showing 6 changed files with 125 additions and 6 deletions.
40 changes: 38 additions & 2 deletions bot.js
Original file line number Diff line number Diff line change
Expand Up @@ -2,22 +2,52 @@ const vk = require('node-vk-bot-api');
const fs = require('fs');
const os = require('os');
const strftime = require('strftime')
const math = require('mathjs');

const lang = require("./languages/ru.js");
const config = require("./config.js");

const Stage = require('node-vk-bot-api/lib/stage');
const Scene = require('node-vk-bot-api/lib/scene');
const Session = require('node-vk-bot-api/lib/session');
const Markup = require('node-vk-bot-api/lib/markup');

const bot = new vk(config['token']);
let prefix = ""

let commands = new Map()
const commandFiles = fs.readdirSync('./commands').filter(file => file.endsWith('.js'));
const session = new Session();

for (const file of commandFiles) {
const command = require(`./commands/${file}`);
commands.set(command.name, command);
}


const crystball = new Scene('8ball',
(ctx) => {
commands.get('crystball').first_scene(vk, bot, prefix, lang, config, ctx, Markup, Scene, Stage)
},
(ctx) => {
commands.get('crystball').second_scene(vk, bot, prefix, lang, config, ctx, Markup, Scene, Stage)
}
);

const calc = new Scene('calc',
(ctx) => {
commands.get('calc').first_scene(vk, bot, prefix, lang, config, ctx, Markup, Scene, Stage, math)
},
(ctx) => {
commands.get('calc').second_scene(vk, bot, prefix, lang, config, ctx, Markup, Scene, Stage, math)
}
);

const stage = new Stage(crystball, calc);
bot.use(session.middleware());
bot.use(stage.middleware());


bot.on((ctx) => {
try {
if (ctx.message.peer_id >= 2000000000 && ctx.message.peer_id < 3000000000) {
Expand All @@ -31,12 +61,18 @@ bot.on((ctx) => {
commands.get('user').execute(vk, bot, prefix, lang, config, ctx, Markup, strftime)
} else if (ctx.message.text == prefix + lang.conv_command) {
commands.get('conv').execute(vk, bot, prefix, lang, config, ctx, Markup, strftime)
} else if (ctx.message.text == prefix + lang.cmds_list_command) {
commands.get('cmd_list').execute(vk, bot, prefix, lang, config, ctx, Markup)
} else if (ctx.message.text == prefix + lang.crystball_command) {
ctx.scene.enter('8ball');
} else if (ctx.message.text == prefix + lang.calc_command) {
ctx.scene.enter('calc');
} else if (ctx.message.text == prefix + lang.menu_command) {
commands.get('menu').execute(vk, bot, prefix, lang, config, ctx, Markup)
}
} catch(ex) {
console.log(ex)
}
});



bot.startPolling();
20 changes: 20 additions & 0 deletions commands/calc.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
module.exports = {
name: 'calc',
description: 'Калькулятор',
async first_scene(vk, bot, prefix, lang, config, ctx, Markup, Scene, Stage, math){
ctx.scene.next();
ctx.reply(lang.calc_message);
},
async second_scene(vk, bot, prefix, lang, config, ctx, Markup, Scene, Stage, math) {
try {
ctx.session.content = ctx.message.text;
let result = math.evaluate(ctx.session.content).toString();
ctx.scene.leave();
ctx.reply(lang.calc_answer1(result));
} catch(ex) {
console.log(ex)
ctx.scene.leave();
ctx.reply(lang.calc_answer2);
}
}
}
15 changes: 15 additions & 0 deletions commands/crystball.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
module.exports = {
name: 'crystball',
description: 'Игра \"Магический шар\" подбирает случайные ответы.',
async first_scene(vk, bot, prefix, lang, config, ctx, Markup, Scene, Stage){
ctx.scene.next();
ctx.reply(lang.crystball_message);
},
async second_scene(vk, bot, prefix, lang, config, ctx, Markup, Scene, Stage) {
let answers = lang.crystball_answers;
ctx.session.content = ctx.message.text;
let rand = Math.floor(Math.random() * answers.length);
ctx.scene.leave();
ctx.reply(`${answers[rand]}`);
}
}
19 changes: 19 additions & 0 deletions commands/menu.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
module.exports = {
name: 'menu',
description: 'Список команд для VK-версии бота VisionOne',
async execute(vk, bot, prefix, lang, config, ctx, Markup){
ctx.reply(lang.menu_message, null, Markup.keyboard([
[
Markup.button(lang.menu_buttons[0], 'primary'),
Markup.button(lang.menu_buttons[1]),
],
[
Markup.button(lang.menu_buttons[2]),
Markup.button(lang.menu_buttons[3]),
],
[
Markup.button(lang.menu_buttons[4])
]
]).inline())
}
}
2 changes: 1 addition & 1 deletion config.js
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@ module.exports = {
'bot_name': 'VisionOne',
'token': process.env.VKTOKEN,
'release_date': '30 апреля 2021 г.',
'version': '01A1-VK-210422',
'version': '01A1-VK-210427',
'prefix': '[club202978127|@tinelix_visionone] ',
'group_id': 202978127
}
35 changes: 32 additions & 3 deletions languages/ru.js
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@ module.exports = {
region: 'russia',
start_command: 'Начать',
start_message: (config) => `Здравствуйте. Портированная, но уже переписанная версия бота ${config.bot_name} для ВКонтакте находится в стадии разработки.\n\nНо не переживайте, открытие бота запланировано на ${config.release_date} А пока воспользуйтесь готовыми фишками, нажав на соответствущую кнопку.`,
start_buttons: ['Статистика бота', 'О пользователе', 'О беседе', 'Еще >>'],
start_buttons: ['Статистика бота', 'О пользователе', 'О беседе', 'Меню'],
stats_command: 'Статистика бота',
stats_message: (os, process, config) => {
if (os.platform() == 'win32')
Expand Down Expand Up @@ -82,7 +82,36 @@ module.exports = {
return "При выполнении команды произошла ошибка. Код ошибки: " + ex.message
}
},
cmds_list_command: 'Еще »',
cmds_list_message: `📄 Список команд\n\n"Статистика бота" - просмотр системной информации, на чем запущен бот\n\nВсе остальные команды на данный момент не реализованы, но будут разрабатываться.`,
crystball_command: 'Магический шар',
crystball_message: 'Для начала напишите любой вопрос, затем Вы получите случайный ответ.',
crystball_answers: [
"Логично.",
"Да.",
"Нет.",
"Вероятно.",
"Мне что-то слабо верится.",
"Может быть.",
"Маловерятно.",
"Мне сказали \"да\".",
"Мне сказали \"нет\".",
"Повтори-ка...",
"Я лучше промолчу.",
"Сконцетрируйтесь и спросите еще раз.",
"Не рассчитывайте на это.",
"Это точно.",
"Ничего подобного.",
"Я не знаю.",
"Конечно.",
"Хз.",
"Но это не точно",
"Откуда я знаю?"
],
calc_command: 'Калькулятор',
calc_message: 'Сначала напишите любое выражение для вычисления.',
calc_answer1: (result) => `Ответ: ${result}.`,
calc_answer2: 'Ошибка вычисления.',
menu_command: 'Меню',
menu_message: `📄 Меню`,
menu_buttons: ['Статистика бота', 'О пользователе', 'О беседе', 'Магический шар', 'Калькулятор'],
underconstr_message: 'На данный момент эта функция не реализована, поэтому потерпите некоторое время.'
}

0 comments on commit 49e0b0b

Please sign in to comment.