vk-io-question
v4.0.0
Published
Система "Вопрос-Ответ" для библиотеки VK-IO
Downloads
483
Maintainers
Readme
VK-IO-QUESTION
Описание
Небольшой модуль для системы "Вопрос-Ответ". Интегрируется в цепь middleware vk-io
Установка
npm
npm i -S vk-io-question
yarn
yarn add vk-io-question
Использование
JavaScript
const { VK } = require('vk-io');
const { HearManager } = require('@vk-io/hear');
const { QuestionManager } = require('vk-io-question');
const vk = new VK({
token: process.env.TOKEN,
pollingGroupId: process.env.GROUP_ID
});
const questionManager = new QuestionManager();
const hearManager = new HearManager();
vk.updates.use(questionManager.middleware);
vk.updates.on(['message_new'], hearManager.middleware);
hearManager.hear('/reg', async (context) => {
const answer = await context.question(
'Согласны-ли Вы на обработку персональных данных?'
);
if (!/да|yes|согласен|конечно/i.test(answer.text)) {
await context.send('Тогда, мы не можем совершить регистрацию');
return;
}
await context.send('Отлично, тогда продолжим');
const age = await context.question('Введите Ваш возраст');
const email = await context.question('Введите Ваш имейл');
const phone = await context.question('Введите Ваш номер телефона');
await context.send(
`Возраст: ${age.text}\nЭл. адрес: ${email.text}\nТелефон: ${phone.text}`
);
});
vk.updates.startPolling();
TypeScript
import { VK, MessageContext } from 'vk-io';
import { HearManager } from '@vk-io/hear';
import {
QuestionManager,
QuestionMessageContext
} from 'vk-io-question';
type Context = MessageContext & QuestionMessageContext;
const vk = new VK({
token: process.env.TOKEN,
pollingGroupId: process.env.GROUP_ID
});
const questionManager = new QuestionManager();
const hearManager = new HearManager<Context>();
vk.updates.use(questionManager.middleware);
vk.updates.on(['message_new'], hearManager.middleware);
hearManager.hear('/reg', async (context) => {
const answer = await context.question(
'Согласны-ли Вы на обработку персональных данных?'
);
if (!/да|yes|согласен|конечно/i.test(answer.text)) {
await context.send('Тогда, мы не можем совершить регистрацию');
return;
}
await context.send('Отлично, тогда продолжим');
const age = await context.question('Введите Ваш возраст');
const email = await context.question('Введите Ваш имейл');
const phone = await context.question('Введите Ваш номер телефона');
await context.send(
`Возраст: ${age.text}\nЭл. адрес: ${email.text}\nТелефон: ${phone.text}`
);
});
vk.updates.startPolling();
Параметры конструктора
|Параметр|Тип|Обязатален|Описание|
|-|-|-|-|
|answerTimeLimit|number (ms)|Нет|Устанавливает ограничение по времени на ответ. После истечения лимита будет выброшено исключение TimeoutError
|
Метод отправки вопроса
const answer = await context.question(message, params);
|Параметр|Тип|Описание| |-|-|-| |message|string|Задаваемый вопрос| |params|MessagesSendParams|Параметры ссобщения|
В переменной answer
будет MessageContext ответного сообщения
Специальные возможности
targetUserId - задаёт вопрос определённому пользователю
Проще говоря, бот будет ждать ответа именно от пользователя, айди которого был указан в targetUserId
.
По умолчанию вопрос задаётся отправителю сообщения (context.senderId
)
Получение payload
Давайте на команду /choice
давать пользователю выбор из двух цветов, по нажатию на любую из которых, он получит факт о выбранном цвете
const { Keyboard } = require('vk-io');
hearManager.hear('/choice', async (context) => {
const answer = await context.question(
'Зелёный или синий?',
{
keyboard: Keyboard.keyboard([
[
Keyboard.textButton({
label: 'Зелёный',
color: 'positive',
payload: {
choice: 'green'
}
}),
Keyboard.textButton({
label: 'Синий',
color: 'positive',
payload: {
choice: 'blue'
}
})
]
]).oneTime()
}
);
if (!answer.messagePayload) {
return context.send('Отвечать нужно было нажатием на кнопку');
}
if (answer.messagePayload.choice === 'green') {
return context.send('Человеский глаз наиболее хорошо различает оттенки именно зеленого цвета.');
}
if (answer.messagePayload.choice === 'blue') {
return context.send('Синий краситель долгое время был одним из самых дорогих, потому что его изготавливали из лазурита.');
}
});
attachments, forwards, replyMessage, etc.
Мы можем получать в ответ любое вложение. Например давайте сделаем функцию обработки фотографии:
hearManager.hear('/обработка фото', async (context) => {
const answer = await context.question(
'Отправьте фото, которое хотите обработать'
);
// Благодаря тому, что в ответе объект MessageContext, мы имеем доступ к его функционалу
if (!answer.hasAttachments('photo')) {
return context.send('В ответе должно быть фото');
}
const [photo] = answer.getAllAttachments('photo');
const filter = await context.question(
'Теперь название фильтра *список доступных фильтров*'
);
if (!filter.hasText) {
return context.send('В ответе должен быть текст');
}
const newPhoto = await myAwesomeFunction(
photo.largeSizeUrl, filter.text
);
return context.sendPhotos(newPhoto, {
message: 'Вот твоя новая фотография!'
});
});
Таким же образом, благодаря MessageContext в ответном объекте у нас есть доступ к таким полям и методам как forwards
, messagePayload
, replyMessage
и так далее
answerTimeLimit
Мы можем задавать ограничение по времени на ответ
hearManager.hear('/q', async (context) => {
const answer = await context.question('Сколько будет 2 + 2?', {
answerTimeLimit: 5_000 // Ограничение в 5 секунд
}).catch((error) => {
if (error instanceof TimeoutError) {
console.error('Превышено время ожидания ответа');
return null;
}
console.error(error);
return null;
});
/**
* Пользователь не успел ответить
* или возникла другая ошибка
*/
if (answer === null) {
return context.send('Вы не успели ответить :(');
}
if (answer.hasText && answer.text === '4') {
return context.send('Правильно!');
}
else {
return context.send('Oh my... wrong!');
}
});