vk-io-question-fix
Описание
Небольшой модуль для системы "Вопрос-Ответ".
Интегрируется в цепь middleware vk-io.
FIX получение ответа только с того диалога, в котором вопрос был задан
Установка
npm
npm i -S vk-io-question-fix
yarn
yarn add vk-io-question-fix
Использование
JavaScript
const { VK } = require ( ' vk-io ' ) ;
const vk = new VK ( {
token : process . env . TOKEN
} ) ;
const { QuestionManager } = require ( ' vk-io-question-fix ' ) ;
const questionManager = new QuestionManager ( ) ;
vk . updates . use ( questionManager . middleware ) ;
vk . updates . 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 } from ' vk-io ' ;
const vk = new VK ( {
token : process . env . TOKEN
} ) ;
import {
QuestionManager ,
IQuestionMessageContext
} from ' vk-io-question-fix ' ;
const questionManager = new QuestionManager ( ) ;
vk . updates . use ( questionManager . middleware ) ;
vk . updates . hear ( ' /reg ' , async ( context : IQuestionMessageContext ) => {
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 ( ) ;
Метод отправки вопроса
const answer = await context . question ( message , params ) ;
Параметр
Тип
Описание
message
string
Задаваемый вопрос
params
Object
Параметры ссобщения
Ответ
Параметр
Тип
Описание
answer
Promise<Answer>
Основной объект ответа
answer.text
string
Текст сообщения
answer.payload
*
payload ответного сообщения (полезно при использовании клавиатуры)
answer.duration
number
Время ответа в ms
answer.forwards
MessageForwardsCollection[]
Пересланные сообщения
answer.attachments
Attachment[]
Вложения ответного сообщения
Специальные возможности
targetUserId - задаёт вопрос определённому пользователю
Примеры
Смоделируем ситуцию: в беседе между людьми идёт игра (викторина), и боту нужно задать вопрос одного человека другому
vk . updates . hear ( ' /задать вопрос ' , async ( context ) => {
const questionToUser = await context . question (
' Напишите свой вопрос следующим сообщением '
) ;
const recipient = await context . question (
' Теперь отправьте ссылку пользователя, кому нужно задать вопрос '
) ;
const user = await vk . snippets . resolveResource ( recipient . text ) ;
const userAnswer = await context . question (
` @id ${ user . id } , Вам вопрос: ${ questionToUser . text } \n \n Ответ дайте следующим сообщением ` ,
{
targetUserId : user . id
}
) ;
await context . send ( ` Итак, Ваш ответ: ${ userAnswer . text } ` ) ;
} ) ;
Проще говоря, бот будет ждать ответа именно от пользователя, айди которого был указан в targetUserId
.
По умолчанию вопрос задаётся отправителю сообщения (context.senderId
)
Ещё можно сделать что-то типа анонимных сообщений с получением реакции:
vk . updates . hear ( / ^ (?: \/ anon ) \s * ( ? <text> . * ) / i , async ( context ) => {
let { text } = context . $match . groups ;
if ( ! text ) {
text = ( await context . question (
' Напишите текст анонимного сообщения '
) ) . text ;
}
const recipient = await context . question (
' Теперь отправьте ссылку пользователя, кому нужно отправить анонимное сообщение '
) ;
const user = await vk . snippets . resolveResource ( recipient . text ) ;
const userAnswer = await context . question (
` Вам анонимное сообщение: \n \n ${ text } ` ,
{
user_id : user . id ,
targetUserId : user . id
}
) ;
await context . send (
` @id ${ user . id } ответил " ${ userAnswer . text } " `
) ;
} ) ;
Примеры
Давайте на команду /choice
давать пользователю выбор из двух цветов, по нажатию на любую из которых, он получит факт о выбранном цвете
const { Keyboard } = require ( ' vk-io ' ) ;
vk . updates . 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 . payload ) {
await context . send ( ' Отвечать нужно было нажатием на кнопку ' ) ;
return ;
}
if ( answer . payload . choice === ' green ' ) {
await context . send ( ' Человеский глаз наиболее хорошо различает оттенки именно зеленого цвета. ' ) ;
return ;
}
if ( answer . payload . choice === ' blue ' ) {
await context . send ( ' Синий краситель долгое время был одним из самых дорогих, потому что его изготавливали из лазурита. ' ) ;
return ;
}
} ) ;
Примеры
Мы можем получать в ответ любое вложение. Например давайте сделаем функцию обработки фотографии:
vk . updates . hear ( ' /обработка фото ' , async ( context ) => {
const answer = await context . question (
' Отправьте фото, которое хотите обработать '
) ;
const filter = await context . question (
' Теперь название фильтра *список доступных фильтров* '
) ;
const newPhoto = await myAwesomeFunction (
answer . attachments [ 0 ] . largePhoto , filter
) ;
await context . sendPhoto ( newPhoto , {
message : ' Вот твоя новая фотография! '
} ) ;
} ) ;
Такая же история работает и с Answer.forwards